Merge
authorduke
Wed, 05 Jul 2017 21:40:37 +0200
changeset 37842 e62ce0da6263
parent 37841 2082ebf00d57 (current diff)
parent 37836 636014c0c4a2 (diff)
child 37846 772743807917
Merge
jdk/make/data/classlist/classlist.aix
jdk/make/data/classlist/classlist.linux
jdk/make/data/classlist/classlist.macosx
jdk/make/data/classlist/classlist.solaris
jdk/make/data/classlist/classlist.windows
jdk/src/java.base/share/classes/jdk/internal/module/Hasher.java
jdk/src/java.base/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java
jdk/src/java.base/share/classes/sun/security/ssl/SupportedEllipticPointFormatsExtension.java
jdk/test/javax/transaction/testng/TEST.properties
jdk/test/sun/security/provider/SecureRandom/SelfSeed.java
jdk/test/tools/jlink/hashes/HashesTest.java
jdk/test/tools/jlink/hashes/newsrc/m2/module-info.java
jdk/test/tools/jlink/hashes/newsrc/m2/org/m2/Util.java
jdk/test/tools/jlink/hashes/newsrc/not_matched/module-info.java
jdk/test/tools/jlink/hashes/newsrc/not_matched/org/not_matched/Name.java
jdk/test/tools/jlink/hashes/src/m1/module-info.java
jdk/test/tools/jlink/hashes/src/m1/org/m1/Main.java
jdk/test/tools/jlink/hashes/src/m2/module-info.java
jdk/test/tools/jlink/hashes/src/m2/org/m2/Util.java
jdk/test/tools/jlink/hashes/src/not_matched/module-info.java
jdk/test/tools/jlink/hashes/src/not_matched/org/not_matched/Name.java
jdk/test/tools/launcher/modules/addmods/src/app/Main.java
jdk/test/tools/launcher/modules/addmods/src/lib/jdk/lib/Util.java
jdk/test/tools/launcher/modules/addmods/src/lib/module-info.java
--- a/.hgtags-top-repo	Thu May 05 20:01:18 2016 -0700
+++ b/.hgtags-top-repo	Wed Jul 05 21:40:37 2017 +0200
@@ -359,3 +359,4 @@
 1d992540870ff33fe6cc550443388588df9b9e4f jdk-9+114
 09617ce980b99d49abfd54dacfed353c47e2a115 jdk-9+115
 6743a8e0cab7b5f6f4a0575f6664892f0ab740af jdk-9+116
+e882bcdbdac436523f3d5681611d3118a3804ea7 jdk-9+117
--- a/common/autoconf/boot-jdk.m4	Thu May 05 20:01:18 2016 -0700
+++ b/common/autoconf/boot-jdk.m4	Wed Jul 05 21:40:37 2017 +0200
@@ -435,6 +435,9 @@
       elif test ! -x "$BUILD_JDK/bin/jlink"; then
         AC_MSG_NOTICE([Potential Build JDK found at $BUILD_JDK did not contain bin/jlink; ignoring])
         BUILD_JDK_FOUND=no
+      elif test ! -x "$BUILD_JDK/bin/jmod"; then
+        AC_MSG_NOTICE([Potential Build JDK found at $BUILD_JDK did not contain bin/jmod; ignoring])
+        BUILD_JDK_FOUND=no
       elif test ! -x "$BUILD_JDK/bin/javac"; then
         # Do we have a bin/javac?
         AC_MSG_NOTICE([Potential Build JDK found at $BUILD_JDK did not contain bin/javac; ignoring])
@@ -474,7 +477,8 @@
   AC_ARG_WITH(build-jdk, [AS_HELP_STRING([--with-build-jdk],
       [path to JDK of same version as is being built@<:@the newly built JDK@:>@])])
 
-  CREATE_BUILDJDK_FOR_HOST=false
+  CREATE_BUILDJDK=false
+  EXTERNAL_BUILDJDK=false
   BUILD_JDK_FOUND="no"
   if test "x$with_build_jdk" != "x"; then
     BOOTJDK_CHECK_BUILD_JDK([
@@ -483,6 +487,7 @@
          BUILD_JDK_FOUND=maybe
          AC_MSG_NOTICE([Found potential Build JDK using configure arguments])
        fi])
+    EXTERNAL_BUILDJDK=true
   else
     if test "x$COMPILE_TYPE" = "xcross"; then
       BUILD_JDK="\$(BUILDJDK_OUTPUTDIR)/jdk"
@@ -498,6 +503,11 @@
     fi
   fi
 
+  JMOD="$BUILD_JDK/bin/jmod"
+  JLINK="$BUILD_JDK/bin/jlink"
+  AC_SUBST(JMOD)
+  AC_SUBST(JLINK)
+
   if test "x$BUILD_JDK_FOUND" != "xyes"; then
     AC_MSG_CHECKING([for Build JDK])
     AC_MSG_RESULT([no])
@@ -506,4 +516,5 @@
 
   AC_SUBST(CREATE_BUILDJDK)
   AC_SUBST(BUILD_JDK)
+  AC_SUBST(EXTERNAL_BUILDJDK)
 ])
--- a/common/autoconf/buildjdk-spec.gmk.in	Thu May 05 20:01:18 2016 -0700
+++ b/common/autoconf/buildjdk-spec.gmk.in	Wed Jul 05 21:40:37 2017 +0200
@@ -46,6 +46,7 @@
 HOTSPOT_DIST := $(patsubst $(BUILD_OUTPUT)%,$(BUILDJDK_OUTPUTDIR)%,$(HOTSPOT_DIST))
 SUPPORT_OUTPUTDIR := $(patsubst $(BUILD_OUTPUT)%,$(BUILDJDK_OUTPUTDIR)%,$(SUPPORT_OUTPUTDIR))
 JDK_OUTPUTDIR := $(patsubst $(BUILD_OUTPUT)%,$(BUILDJDK_OUTPUTDIR)%,$(JDK_OUTPUTDIR))
+IMAGES_OUTPUTDIR := $(patsubst $(BUILD_OUTPUT)%,$(BUILDJDK_OUTPUTDIR)%,$(IMAGES_OUTPUTDIR))
 
 OPENJDK_BUILD_CPU_LEGACY := @OPENJDK_BUILD_CPU_LEGACY@
 OPENJDK_BUILD_CPU_LEGACY_LIB := @OPENJDK_BUILD_CPU_LEGACY_LIB@
--- a/common/autoconf/generated-configure.sh	Thu May 05 20:01:18 2016 -0700
+++ b/common/autoconf/generated-configure.sh	Wed Jul 05 21:40:37 2017 +0200
@@ -896,8 +896,11 @@
 JAXP_TOPDIR
 CORBA_TOPDIR
 LANGTOOLS_TOPDIR
+EXTERNAL_BUILDJDK
 BUILD_JDK
 CREATE_BUILDJDK
+JLINK
+JMOD
 BOOT_JDK_BITS
 JAVAC_FLAGS
 BOOT_JDK_MODULAR
@@ -5070,7 +5073,7 @@
 #CUSTOM_AUTOCONF_INCLUDE
 
 # Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1462204427
+DATE_WHEN_GENERATED=1462806878
 
 ###############################################################################
 #
@@ -30171,7 +30174,8 @@
 fi
 
 
-  CREATE_BUILDJDK_FOR_HOST=false
+  CREATE_BUILDJDK=false
+  EXTERNAL_BUILDJDK=false
   BUILD_JDK_FOUND="no"
   if test "x$with_build_jdk" != "x"; then
 
@@ -30196,6 +30200,10 @@
         { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Build JDK found at $BUILD_JDK did not contain bin/jlink; ignoring" >&5
 $as_echo "$as_me: Potential Build JDK found at $BUILD_JDK did not contain bin/jlink; ignoring" >&6;}
         BUILD_JDK_FOUND=no
+      elif test ! -x "$BUILD_JDK/bin/jmod"; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Build JDK found at $BUILD_JDK did not contain bin/jmod; ignoring" >&5
+$as_echo "$as_me: Potential Build JDK found at $BUILD_JDK did not contain bin/jmod; ignoring" >&6;}
+        BUILD_JDK_FOUND=no
       elif test ! -x "$BUILD_JDK/bin/javac"; then
         # Do we have a bin/javac?
         { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Build JDK found at $BUILD_JDK did not contain bin/javac; ignoring" >&5
@@ -30364,6 +30372,7 @@
     fi # end check build jdk found
   fi
 
+    EXTERNAL_BUILDJDK=true
   else
     if test "x$COMPILE_TYPE" = "xcross"; then
       BUILD_JDK="\$(BUILDJDK_OUTPUTDIR)/jdk"
@@ -30383,6 +30392,11 @@
     fi
   fi
 
+  JMOD="$BUILD_JDK/bin/jmod"
+  JLINK="$BUILD_JDK/bin/jlink"
+
+
+
   if test "x$BUILD_JDK_FOUND" != "xyes"; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Build JDK" >&5
 $as_echo_n "checking for Build JDK... " >&6; }
@@ -30395,6 +30409,7 @@
 
 
 
+
 ###############################################################################
 #
 # Configure the sources to use. We can add or override individual directories.
--- a/common/autoconf/spec.gmk.in	Thu May 05 20:01:18 2016 -0700
+++ b/common/autoconf/spec.gmk.in	Wed Jul 05 21:40:37 2017 +0200
@@ -283,6 +283,7 @@
 
 BUILD_JDK:=@BUILD_JDK@
 CREATE_BUILDJDK:=@CREATE_BUILDJDK@
+EXTERNAL_BUILDJDK:=@EXTERNAL_BUILDJDK@
 
 # When compiling Java source to be run by the boot jdk
 # use these extra flags, eg -source 6 -target 6
@@ -542,6 +543,8 @@
 JAVAC_CMD:=@JAVAC@
 JAVAH_CMD:=@JAVAH@
 JAR_CMD:=@JAR@
+JLINK_CMD := @JLINK@
+JMOD_CMD := @JMOD@
 JARSIGNER_CMD:=@JARSIGNER@
 SJAVAC_SERVER_JAVA_CMD:=@SJAVAC_SERVER_JAVA@
 # These variables are meant to be used. They are defined with = instead of := to make
@@ -552,6 +555,8 @@
 JAVAC=@FIXPATH@ $(JAVAC_CMD)
 JAVAH=@FIXPATH@ $(JAVAH_CMD)
 JAR=@FIXPATH@ $(JAR_CMD)
+JLINK = @FIXPATH@ $(JLINK_CMD) $(JAVA_TOOL_FLAGS_SMALL)
+JMOD = @FIXPATH@ $(JMOD_CMD) $(JAVA_TOOL_FLAGS_SMALL)
 JARSIGNER=@FIXPATH@ $(JARSIGNER_CMD)
 # A specific java binary with specific options can be used to run
 # the long running background sjavac servers and other long running tasks.
@@ -569,14 +574,15 @@
 # Use ?= as this can be overridden from bootcycle-spec.gmk
 BOOT_JDK_MODULAR ?= @BOOT_JDK_MODULAR@
 
+INTERIM_OVERRIDE_MODULES := java.compiler jdk.compiler \
+    jdk.jdeps jdk.javadoc jdk.rmic
 ifeq ($(BOOT_JDK_MODULAR), true)
-  INTERIM_OVERRIDE_MODULES_ARGS = -Xpatch:$(BUILDTOOLS_OUTPUTDIR)/override_modules
+  INTERIM_OVERRIDE_MODULES_ARGS = $(foreach m, $(INTERIM_OVERRIDE_MODULES), \
+      -Xpatch:$m=$(BUILDTOOLS_OUTPUTDIR)/override_modules/$m)
   INTERIM_LANGTOOLS_ARGS = $(INTERIM_OVERRIDE_MODULES_ARGS)
   JAVAC_MAIN_CLASS = -m jdk.compiler/com.sun.tools.javac.Main
   JAVADOC_MAIN_CLASS = -m jdk.javadoc/jdk.javadoc.internal.tool.Main
 else
-  INTERIM_OVERRIDE_MODULES := java.compiler jdk.compiler \
-      jdk.jdeps jdk.javadoc jdk.rmic
   INTERIM_OVERRIDE_MODULES_ARGS = \
       -Xbootclasspath/p:$(call PathList, \
           $(addprefix $(BUILDTOOLS_OUTPUTDIR)/override_modules/, \
@@ -591,12 +597,8 @@
 NEW_JAVAC   = $(INTERIM_LANGTOOLS_ARGS) $(JAVAC_MAIN_CLASS)
 NEW_JAVADOC = $(INTERIM_LANGTOOLS_ARGS) $(JAVADOC_MAIN_CLASS)
 
-# JLink/Jmod are run using the BUILD_JDK, which is normally the jdk output dir.
 JLINK_KEEP_PACKAGED_MODULES:=@JLINK_KEEP_PACKAGED_MODULES@
 
-JLINK = @FIXPATH@ $(BUILD_JDK)/bin/jlink $(JAVA_TOOL_FLAGS_SMALL)
-JMOD = @FIXPATH@ $(BUILD_JDK)/bin/jmod $(JAVA_TOOL_FLAGS_SMALL)
-
 # Base flags for RC
 # Guarding this against resetting value. Legacy make files include spec multiple
 # times.
@@ -776,6 +778,9 @@
 SYMBOLS_IMAGE_SUBDIR:=symbols
 SYMBOLS_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(SYMBOLS_IMAGE_SUBDIR)
 
+# Interim image
+INTERIM_IMAGE_DIR := $(SUPPORT_OUTPUTDIR)/interim-image
+
 # Macosx bundles directory definitions
 JDK_MACOSX_BUNDLE_SUBDIR=jdk-bundle/jdk-$(VERSION_NUMBER).jdk/Contents
 JRE_MACOSX_BUNDLE_SUBDIR=jre-bundle/jre-$(VERSION_NUMBER).jre/Contents
--- a/common/conf/jib-profiles.js	Thu May 05 20:01:18 2016 -0700
+++ b/common/conf/jib-profiles.js	Wed Jul 05 21:40:37 2017 +0200
@@ -404,7 +404,7 @@
         jtreg: {
             server: "javare",
             revision: "4.2",
-            build_number: "b01",
+            build_number: "b02",
             checksum_file: "MD5_VALUES",
             file: "jtreg_bin-4.2.zip",
             environment_name: "JT_HOME"
--- a/corba/.hgtags	Thu May 05 20:01:18 2016 -0700
+++ b/corba/.hgtags	Wed Jul 05 21:40:37 2017 +0200
@@ -359,3 +359,4 @@
 10d175b0368c30f54350fc648adc41b94ce357ee jdk-9+114
 7bab1b1b36824924b1c657a8419369ba93d198d3 jdk-9+115
 7dfa7377a5e601b8f740741a9a80e04c72dd04d6 jdk-9+116
+7a1b36bf2fe55a9a7732489ccdd326c910329a7e jdk-9+117
--- a/corba/src/java.corba/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryDynamicBase.java	Thu May 05 20:01:18 2016 -0700
+++ b/corba/src/java.corba/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryDynamicBase.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2013, 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
--- a/corba/src/java.corba/share/classes/com/sun/tools/corba/se/idl/som/cff/FileLocator.java	Thu May 05 20:01:18 2016 -0700
+++ b/corba/src/java.corba/share/classes/com/sun/tools/corba/se/idl/som/cff/FileLocator.java	Wed Jul 05 21:40:37 2017 +0200
@@ -222,7 +222,8 @@
 
     /**
      * locateFileInClassPath returns a DataInputStream that can be used
-     * to read the requested file.  The CLASSPATH is used to locate the file.
+     * to read the requested file.  The resource is located in the java.corba
+     * module or if not found, then the CLASSPATH is searched.
      *
      * @param fileName The name of the file to locate.  The file name
      * may be qualified with a partial path name, using '/' as the separator
@@ -238,6 +239,12 @@
     public static DataInputStream locateFileInClassPath (String fileName)
         throws FileNotFoundException, IOException {
 
+        // The resource should be in the java.corba module
+        InputStream in = FileLocator.class.getResourceAsStream("/" + fileName);
+        if (in != null) {
+            return new DataInputStream(in);
+        }
+
         boolean notFound = true;
         StringTokenizer st;
         String path = "";
--- a/corba/src/java.corba/share/classes/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ b/corba/src/java.corba/share/classes/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -71,7 +71,4 @@
         java.naming;
     exports com.sun.jndi.url.iiopname to
         java.naming;
-
-    provides javax.naming.spi.InitialContextFactory
-        with com.sun.jndi.cosnaming.CNCtxFactory;
 }
--- a/hotspot/.hgtags	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/.hgtags	Wed Jul 05 21:40:37 2017 +0200
@@ -519,3 +519,4 @@
 b64432bae5271735fd53300b2005b713e98ef411 jdk-9+114
 88dd08d7be0fe7fb9f1914b1628f0aae9bf56e25 jdk-9+115
 61a214186dae6811dd989e9165e42f7dbf02acde jdk-9+116
+88170d3642905b9e6cac03e8efcc976885a7e6da jdk-9+117
--- a/hotspot/src/share/vm/classfile/classLoader.cpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp	Wed Jul 05 21:40:37 2017 +0200
@@ -140,9 +140,10 @@
 PerfCounter*    ClassLoader::_isUnsyncloadClass = NULL;
 PerfCounter*    ClassLoader::_load_instance_class_failCounter = NULL;
 
-ClassPathEntry* ClassLoader::_first_entry         = NULL;
-ClassPathEntry* ClassLoader::_last_entry          = NULL;
-int             ClassLoader::_num_entries         = 0;
+GrowableArray<ModuleClassPathList*>* ClassLoader::_xpatch_entries = NULL;
+ClassPathEntry* ClassLoader::_first_entry        = NULL;
+ClassPathEntry* ClassLoader::_last_entry         = NULL;
+int             ClassLoader::_num_entries        = 0;
 ClassPathEntry* ClassLoader::_first_append_entry = NULL;
 bool            ClassLoader::_has_jimage = false;
 #if INCLUDE_CDS
@@ -179,6 +180,44 @@
   return (strncmp(str + (str_len - str_to_find_len), str_to_find, str_to_find_len) == 0);
 }
 
+// Used to obtain the package name from a fully qualified class name.
+// It is the responsibility of the caller to establish ResourceMark.
+const char* ClassLoader::package_from_name(const char* class_name) {
+  const char* last_slash = strrchr(class_name, '/');
+  if (last_slash == NULL) {
+    // No package name
+    return NULL;
+  }
+  int length = last_slash - class_name;
+
+  // A class name could have just the slash character in the name,
+  // resulting in a negative length.
+  if (length <= 0) {
+    // No package name
+    return NULL;
+  }
+
+  // drop name after last slash (including slash)
+  // Ex., "java/lang/String.class" => "java/lang"
+  char* pkg_name = NEW_RESOURCE_ARRAY(char, length + 1);
+  strncpy(pkg_name, class_name, length);
+  *(pkg_name+length) = '\0';
+
+  return (const char *)pkg_name;
+}
+
+// Given a fully qualified class name, find its defining package in the class loader's
+// package entry table.
+static PackageEntry* get_package_entry(const char* class_name, ClassLoaderData* loader_data, TRAPS) {
+  ResourceMark rm(THREAD);
+  const char *pkg_name = ClassLoader::package_from_name(class_name);
+  if (pkg_name == NULL) {
+    return NULL;
+  }
+  PackageEntryTable* pkgEntryTable = loader_data->packages();
+  TempNewSymbol pkg_symbol = SymbolTable::new_symbol(pkg_name, CHECK_NULL);
+  return pkgEntryTable->lookup_only(pkg_symbol);
+}
 
 ClassPathDirEntry::ClassPathDirEntry(const char* dir) : ClassPathEntry() {
   char* copy = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass);
@@ -281,8 +320,7 @@
 #if INCLUDE_CDS
 u1* ClassPathZipEntry::open_versioned_entry(const char* name, jint* filesize, TRAPS) {
   u1* buffer = NULL;
-  if (!_is_boot_append) {
-    assert(DumpSharedSpaces, "Should be called only for non-boot entries during dump time");
+  if (DumpSharedSpaces) {
     // We presume default is multi-release enabled
     const char* multi_ver = Arguments::get_property("jdk.util.jar.enableMultiRelease");
     const char* verstr = Arguments::get_property("jdk.util.jar.version");
@@ -402,31 +440,6 @@
   }
 }
 
-void ClassPathImageEntry::name_to_package(const char* name, char* buffer, int length) {
-  const char *pslash = strrchr(name, '/');
-  if (pslash == NULL) {
-    buffer[0] = '\0';
-    return;
-  }
-  int len = pslash - name;
-#if INCLUDE_CDS
-  if (len <= 0 && DumpSharedSpaces) {
-    buffer[0] = '\0';
-    return;
-  }
-#endif
-  assert(len > 0, "Bad length for package name");
-  if (len >= length) {
-    buffer[0] = '\0';
-    return;
-  }
-  // drop name after last slash (including slash)
-  // Ex., "java/lang/String.class" => "java/lang"
-  strncpy(buffer, name, len);
-  // ensure string termination (strncpy does not guarantee)
-  buffer[len] = '\0';
-}
-
 // For a class in a named module, look it up in the jimage file using this syntax:
 //    /<module-name>/<package-name>/<base-class>
 //
@@ -439,15 +452,10 @@
   JImageLocationRef location = (*JImageFindResource)(_jimage, "", get_jimage_version_string(), name, &size);
 
   if (location == 0) {
-    char package[JIMAGE_MAX_PATH];
-    name_to_package(name, package, JIMAGE_MAX_PATH);
+    ResourceMark rm;
+    const char* pkg_name = ClassLoader::package_from_name(name);
 
-#if INCLUDE_CDS
-    if (package[0] == '\0' && DumpSharedSpaces) {
-      return NULL;
-    }
-#endif
-    if (package[0] != '\0') {
+    if (pkg_name != NULL) {
       if (!Universe::is_module_initialized()) {
         location = (*JImageFindResource)(_jimage, "java.base", get_jimage_version_string(), name, &size);
 #if INCLUDE_CDS
@@ -455,7 +463,7 @@
         // modules defined for other class loaders.  So, for now, get their module
         // names from the "modules" jimage file.
         if (DumpSharedSpaces && location == 0) {
-          const char* module_name = (*JImagePackageToModule)(_jimage, package);
+          const char* module_name = (*JImagePackageToModule)(_jimage, pkg_name);
           if (module_name != NULL) {
             location = (*JImageFindResource)(_jimage, module_name, get_jimage_version_string(), name, &size);
           }
@@ -463,13 +471,7 @@
 #endif
 
       } else {
-        // Get boot class loader's package entry table
-        PackageEntryTable* pkgEntryTable =
-          ClassLoaderData::the_null_class_loader_data()->packages();
-        // Get package's package entry
-        TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package, CHECK_NULL);
-        PackageEntry* package_entry = pkgEntryTable->lookup_only(pkg_symbol);
-
+        PackageEntry* package_entry = get_package_entry(name, ClassLoaderData::the_null_class_loader_data(), THREAD);
         if (package_entry != NULL) {
           ResourceMark rm;
           // Get the module name
@@ -542,6 +544,33 @@
 }
 #endif
 
+ModuleClassPathList::ModuleClassPathList(Symbol* module_name) {
+  _module_name = module_name;
+  _module_first_entry = NULL;
+  _module_last_entry = NULL;
+}
+
+ModuleClassPathList::~ModuleClassPathList() {
+  // Clean out each ClassPathEntry on list
+  ClassPathEntry* e = _module_first_entry;
+  while (e != NULL) {
+    ClassPathEntry* next_entry = e->next();
+    delete e;
+    e = next_entry;
+  }
+}
+
+void ModuleClassPathList::add_to_list(ClassPathEntry* new_entry) {
+  if (new_entry != NULL) {
+    if (_module_last_entry == NULL) {
+      _module_first_entry = _module_last_entry = new_entry;
+    } else {
+      _module_last_entry->set_next(new_entry);
+      _module_last_entry = new_entry;
+    }
+  }
+}
+
 void ClassLoader::trace_class_path(const char* msg, const char* name) {
   if (log_is_enabled(Info, classpath)) {
     ResourceMark rm;
@@ -619,6 +648,61 @@
 }
 #endif
 
+// Construct the array of module/path pairs as specified to -Xpatch
+// for the boot loader to search ahead of the jimage, if the class being
+// loaded is defined to a module that has been specified to -Xpatch.
+void ClassLoader::setup_xpatch_entries() {
+  Thread* THREAD = Thread::current();
+  GrowableArray<ModuleXPatchPath*>* xpatch_args = Arguments::get_xpatchprefix();
+  int num_of_entries = xpatch_args->length();
+
+  // Set up the boot loader's xpatch_entries list
+  _xpatch_entries = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
+
+  for (int i = 0; i < num_of_entries; i++) {
+    const char* module_name = (xpatch_args->at(i))->module_name();
+    Symbol* const module_sym = SymbolTable::lookup(module_name, (int)strlen(module_name), CHECK);
+    assert(module_sym != NULL, "Failed to obtain Symbol for module name");
+    ModuleClassPathList* module_cpl = new ModuleClassPathList(module_sym);
+
+    char* class_path = (xpatch_args->at(i))->path_string();
+    int len = (int)strlen(class_path);
+    int end = 0;
+    // Iterate over the module's class path entries
+    for (int start = 0; start < len; start = end) {
+      while (class_path[end] && class_path[end] != os::path_separator()[0]) {
+        end++;
+      }
+      EXCEPTION_MARK;
+      ResourceMark rm(THREAD);
+      char* path = NEW_RESOURCE_ARRAY(char, end - start + 1);
+      strncpy(path, &class_path[start], end - start);
+      path[end - start] = '\0';
+
+      struct stat st;
+      if (os::stat(path, &st) == 0) {
+        // File or directory found
+        Thread* THREAD = Thread::current();
+        ClassPathEntry* new_entry = create_class_path_entry(path, &st, false, false, CHECK);
+        // If the path specification is valid, enter it into this module's list
+        if (new_entry != NULL) {
+          module_cpl->add_to_list(new_entry);
+        }
+      }
+
+      while (class_path[end] == os::path_separator()[0]) {
+        end++;
+      }
+    }
+
+    // Record the module into the list of -Xpatch entries only if
+    // valid ClassPathEntrys have been created
+    if (module_cpl->module_first_entry() != NULL) {
+      _xpatch_entries->push(module_cpl);
+    }
+  }
+}
+
 void ClassLoader::setup_search_path(const char *class_path, bool bootstrap_search) {
   int offset = 0;
   int len = (int)strlen(class_path);
@@ -850,8 +934,29 @@
 }
 
 void ClassLoader::print_bootclasspath() {
-  ClassPathEntry* e = _first_entry;
+  ClassPathEntry* e;
   tty->print("[bootclasspath= ");
+
+  // Print -Xpatch module/path specifications first
+  if (_xpatch_entries != NULL) {
+    ResourceMark rm;
+    int num_of_entries = _xpatch_entries->length();
+    for (int i = 0; i < num_of_entries; i++) {
+      ModuleClassPathList* mpl = _xpatch_entries->at(i);
+      tty->print("%s=", mpl->module_name()->as_C_string());
+      e = mpl->module_first_entry();
+      while (e != NULL) {
+        tty->print("%s", e->name());
+        e = e->next();
+        if (e != NULL) {
+          tty->print("%s", os::path_separator());
+        }
+      }
+      tty->print(" ;");
+    }
+  }
+
+  e = _first_entry;
   while (e != NULL) {
     tty->print("%s ;", e->name());
     e = e->next();
@@ -941,6 +1046,7 @@
 
 #if INCLUDE_CDS
 void ClassLoader::initialize_module_loader_map(JImageFile* jimage) {
+  ResourceMark rm;
   jlong size;
   JImageLocationRef location = (*JImageFindResource)(jimage, "java.base", get_jimage_version_string(), MODULE_LOADER_MAP, &size);
   if (location == 0) {
@@ -985,7 +1091,6 @@
     begin_ptr = ++end_ptr;
     end_ptr = strchr(begin_ptr, '\n');
   }
-  FREE_RESOURCE_ARRAY(u1, buffer, size);
 }
 #endif
 
@@ -1106,8 +1211,7 @@
 }
 #endif
 
-s2 ClassLoader::classloader_type(Symbol* class_name, ClassPathEntry* e,
-                                     int classpath_index, TRAPS) {
+s2 ClassLoader::classloader_type(Symbol* class_name, ClassPathEntry* e, int classpath_index, TRAPS) {
 #if INCLUDE_CDS
   // obtain the classloader type based on the class name.
   // First obtain the package name based on the class name. Then obtain
@@ -1157,12 +1261,11 @@
 }
 
 instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
-
   assert(name != NULL, "invariant");
   assert(THREAD->is_Java_thread(), "must be a JavaThread");
 
-  ResourceMark rm;
-  HandleMark hm;
+  ResourceMark rm(THREAD);
+  HandleMark hm(THREAD);
 
   const char* const class_name = name->as_C_string();
 
@@ -1178,30 +1281,101 @@
   // Lookup stream for parsing .class file
   ClassFileStream* stream = NULL;
   s2 classpath_index = 0;
+  ClassPathEntry* e = NULL;
 
   // If DumpSharedSpaces is true, boot loader visibility boundaries are set
-  // to be _first_entry to the end (all path entries).
+  // to be _first_entry to the end (all path entries). No -Xpatch entries are
+  // included since CDS and AppCDS are not supported if -Xpatch is specified.
   //
   // If search_append_only is true, boot loader visibility boundaries are
-  // set to be _fist_append_entry to the end. This includes:
+  // set to be _first_append_entry to the end. This includes:
   //   [-Xbootclasspath/a]; [jvmti appended entries]
   //
   // If both DumpSharedSpaces and search_append_only are false, boot loader
   // visibility boundaries are set to be _first_entry to the entry before
   // the _first_append_entry.  This would include:
-  //   [-Xpatch:<dirs>];  [exploded build | modules]
+  //   [-Xpatch:<module>=<file>(<pathsep><file>)*];  [exploded build | jimage]
   //
   // DumpSharedSpaces and search_append_only are mutually exclusive and cannot
   // be true at the same time.
-  ClassPathEntry* e = (search_append_only ? _first_append_entry : _first_entry);
-  ClassPathEntry* last_e =
-      (search_append_only || DumpSharedSpaces ? NULL : _first_append_entry);
+  assert(!(DumpSharedSpaces && search_append_only), "DumpSharedSpaces and search_append_only are both true");
+
+  // Load Attempt #1: -Xpatch
+  // Determine the class' defining module.  If it appears in the _xpatch_entries,
+  // attempt to load the class from those locations specific to the module.
+  // Note: The -Xpatch entries are never searched if the boot loader's
+  //       visibility boundary is limited to only searching the append entries.
+  if (_xpatch_entries != NULL && !search_append_only && !DumpSharedSpaces) {
+    // Find the module in the boot loader's module entry table
+    PackageEntry* pkg_entry = get_package_entry(class_name, ClassLoaderData::the_null_class_loader_data(), THREAD);
+    ModuleEntry* mod_entry = (pkg_entry != NULL) ? pkg_entry->module() : NULL;
+
+    // If the module system has not defined java.base yet, then
+    // classes loaded are assumed to be defined to java.base.
+    // When java.base is eventually defined by the module system,
+    // all packages of classes that have been previously loaded
+    // are verified in ModuleEntryTable::verify_javabase_packages().
+    if (!Universe::is_module_initialized() &&
+        !ModuleEntryTable::javabase_defined() &&
+        mod_entry == NULL) {
+      mod_entry = ModuleEntryTable::javabase_module();
+    }
+
+    // The module must be a named module
+    if (mod_entry != NULL && mod_entry->is_named()) {
+      int num_of_entries = _xpatch_entries->length();
+      const Symbol* class_module_name = mod_entry->name();
+
+      // Loop through all the xpatch entries looking for module
+      for (int i = 0; i < num_of_entries; i++) {
+        ModuleClassPathList* module_cpl = _xpatch_entries->at(i);
+        Symbol* module_cpl_name = module_cpl->module_name();
 
-  {
+        if (module_cpl_name->fast_compare(class_module_name) == 0) {
+          // Class' module has been located, attempt to load
+          // the class from the module's ClassPathEntry list.
+          e = module_cpl->module_first_entry();
+          while (e != NULL) {
+            stream = e->open_stream(file_name, CHECK_NULL);
+            // No context.check is required since both CDS
+            // and AppCDS are turned off if -Xpatch is specified.
+            if (NULL != stream) {
+              break;
+            }
+            e = e->next();
+          }
+          // If the module was located in the xpatch entries, break out
+          // even if the class was not located successfully from that module's
+          // ClassPathEntry list. There will not be another valid entry for
+          // that module in the _xpatch_entries array.
+          break;
+        }
+      }
+    }
+  }
+
+  // Load Attempt #2: [exploded build | jimage]
+  if (!search_append_only && (NULL == stream)) {
+    e = _first_entry;
+    while ((e != NULL) && (e != _first_append_entry)) {
+      stream = e->open_stream(file_name, CHECK_NULL);
+      if (!context.check(stream, classpath_index)) {
+        return NULL;
+      }
+      if (NULL != stream) {
+        break;
+      }
+      e = e->next();
+      ++classpath_index;
+    }
+  }
+
+  // Load Attempt #3: [-Xbootclasspath/a]; [jvmti appended entries]
+  if ((search_append_only || DumpSharedSpaces) && (NULL == stream)) {
+    // For the boot loader append path search, must calculate
+    // the starting classpath_index prior to attempting to
+    // load the classfile.
     if (search_append_only) {
-      // For the boot loader append path search, must calculate
-      // the starting classpath_index prior to attempting to
-      // load the classfile.
       ClassPathEntry *tmp_e = _first_entry;
       while ((tmp_e != NULL) && (tmp_e != _first_append_entry)) {
         tmp_e = tmp_e->next();
@@ -1209,11 +1383,8 @@
       }
     }
 
-    // Attempt to load the classfile from either:
-    //   - [-Xpatch:dir]; exploded build | modules
-    //     or
-    //   - [-Xbootclasspath/a]; [jvmti appended entries]
-    while ((e != NULL) && (e != last_e)) {
+    e = _first_append_entry;
+    while (e != NULL) {
       stream = e->open_stream(file_name, CHECK_NULL);
       if (!context.check(stream, classpath_index)) {
         return NULL;
@@ -1384,10 +1555,23 @@
 }
 
 
-void classLoader_init() {
+void classLoader_init1() {
   ClassLoader::initialize();
 }
 
+// Complete the ClassPathEntry setup for the boot loader
+void classLoader_init2() {
+  // Setup the list of module/path pairs for -Xpatch processing
+  // This must be done after the SymbolTable is created in order
+  // to use fast_compare on module names instead of a string compare.
+  if (Arguments::get_xpatchprefix() != NULL) {
+    ClassLoader::setup_xpatch_entries();
+  }
+
+  // Determine if this is an exploded build
+  ClassLoader::set_has_jimage();
+}
+
 
 bool ClassLoader::get_canonical_path(const char* orig, char* out, int len) {
   assert(orig != NULL && out != NULL && len > 0, "bad arguments");
@@ -1431,17 +1615,19 @@
     }
     ModuleEntryTable::set_javabase_module(jb_module);
   }
+}
 
-  // When looking for the jimage file, only
-  // search the boot loader's module path which
-  // can consist of [-Xpatch]; exploded build | modules
-  // Do not search the boot loader's append path.
+void ClassLoader::set_has_jimage() {
+  // Determine if this is an exploded build. When looking for
+  // the jimage file, only search the piece of the boot
+  // loader's boot class path which contains [exploded build | jimage].
+  // Do not search the boot loader's xpatch entries or append path.
   ClassPathEntry* e = _first_entry;
   ClassPathEntry* last_e = _first_append_entry;
   while ((e != NULL) && (e != last_e)) {
     JImageFile *jimage = e->jimage();
     if (jimage != NULL && e->is_jrt()) {
-      set_has_jimage(true);
+      _has_jimage = true;
 #if INCLUDE_CDS
       ClassLoader::initialize_module_loader_map(jimage);
 #endif
--- a/hotspot/src/share/vm/classfile/classLoader.hpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp	Wed Jul 05 21:40:37 2017 +0200
@@ -142,13 +142,30 @@
   JImageFile* jimage() const { return _jimage; }
   ClassPathImageEntry(JImageFile* jimage, const char* name);
   ~ClassPathImageEntry();
-  void name_to_package(const char* name, char* package, int length);
   ClassFileStream* open_stream(const char* name, TRAPS);
 
   // Debugging
   NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
 };
 
+// ModuleClassPathList contains a linked list of ClassPathEntry's
+// that have been specified for a specific module.  Currently,
+// the only way to specify a module/path pair is via the -Xpatch
+// command line option.
+class ModuleClassPathList : public CHeapObj<mtClass> {
+private:
+  Symbol* _module_name;
+  // First and last entries of class path entries for a specific module
+  ClassPathEntry* _module_first_entry;
+  ClassPathEntry* _module_last_entry;
+public:
+  Symbol* module_name() const { return _module_name; }
+  ClassPathEntry* module_first_entry() const { return _module_first_entry; }
+  ModuleClassPathList(Symbol* module_name);
+  ~ModuleClassPathList();
+  void add_to_list(ClassPathEntry* new_entry);
+};
+
 class SharedPathsMiscInfo;
 
 class ClassLoader: AllStatic {
@@ -195,21 +212,31 @@
   static PerfCounter* _isUnsyncloadClass;
   static PerfCounter* _load_instance_class_failCounter;
 
-  // First entry in linked list of ClassPathEntry instances.
-  // This consists of entries made up by:
-  //   - boot loader modules
-  //     [-Xpatch]; exploded build | modules;
-  //   - boot loader append path
-  //     [-Xbootclasspath/a]; [jvmti appended entries]
+  // The boot class path consists of 3 ordered pieces:
+  //  1. the module/path pairs specified to -Xpatch
+  //    -Xpatch:<module>=<file>(<pathsep><file>)*
+  //  2. the base piece
+  //    [exploded build | jimage]
+  //  3. boot loader append path
+  //    [-Xbootclasspath/a]; [jvmti appended entries]
+  //
+  // The boot loader must obey this order when attempting
+  // to load a class.
+
+  // Contains the module/path pairs specified to -Xpatch
+  static GrowableArray<ModuleClassPathList*>* _xpatch_entries;
+
+  // Contains the ClassPathEntry instances that include
+  // both the base piece and the boot loader append path.
   static ClassPathEntry* _first_entry;
   // Last entry in linked list of ClassPathEntry instances
   static ClassPathEntry* _last_entry;
   static int _num_entries;
 
-  // Pointer into the linked list of ClassPathEntry instances.
   // Marks the start of:
   //   - the boot loader's append path
   //     [-Xbootclasspath/a]; [jvmti appended entries]
+  // within the linked list of ClassPathEntry instances.
   static ClassPathEntry* _first_append_entry;
 
   static const char* _shared_archive;
@@ -325,11 +352,11 @@
     return _load_instance_class_failCounter;
   }
 
+  // Set up the module/path pairs as specified to -Xpatch
+  static void setup_xpatch_entries();
+
   // Sets _has_jimage to TRUE if "modules" jimage file exists
-  static void set_has_jimage(bool val) {
-    _has_jimage = val;
-  }
-
+  static void set_has_jimage();
   static bool has_jimage() { return _has_jimage; }
 
   // Create the ModuleEntry for java.base
@@ -416,6 +443,9 @@
 
   static bool string_ends_with(const char* str, const char* str_to_find);
 
+  // obtain package name from a fully qualified class name
+  static const char* package_from_name(const char* class_name);
+
   static bool is_jrt(const char* name) { return string_ends_with(name, MODULES_IMAGE_NAME); }
 
   // Debugging
--- a/hotspot/src/share/vm/classfile/modules.cpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/classfile/modules.cpp	Wed Jul 05 21:40:37 2017 +0200
@@ -133,68 +133,31 @@
   return NULL;
 }
 
-// Check if -Xpatch:<dirs> was specified.  If so, prepend each <dir>/module_name,
-// if it exists, to bootpath so boot loader can find the class files.  Also, if
-// using exploded modules, append <java.home>/modules/module_name, if it exists,
-// to bootpath so that its class files can be found by the boot loader.
-static void add_to_boot_loader_list(char *module_name, TRAPS) {
-  // java.base should be handled by argument parsing.
+// If using exploded build, append <java.home>/modules/module_name, if it exists,
+// to the system boot class path in order for the boot loader to locate class files.
+static void add_to_exploded_build_list(char *module_name, TRAPS) {
+  assert(!ClassLoader::has_jimage(), "Exploded build not applicable");
+  // java.base is handled by os::set_boot_path
   assert(strcmp(module_name, "java.base") != 0, "Unexpected java.base module name");
+
   char file_sep = os::file_separator()[0];
   size_t module_len = strlen(module_name);
 
-  // If -Xpatch is set then add <patch-dir>/module_name paths.
-  char** patch_dirs = Arguments::patch_dirs();
-  if (patch_dirs != NULL) {
-    int dir_count = Arguments::patch_dirs_count();
-    for (int x = 0; x < dir_count; x++) {
-      // Really shouldn't be NULL, but check can't hurt
-      if (patch_dirs[x] != NULL) {
-        size_t len = strlen(patch_dirs[x]);
-        if (len != 0) { // Ignore empty strings.
-          len = len + module_len + 2;
-          char* prefix_path = NEW_C_HEAP_ARRAY(char, len, mtInternal);
-          jio_snprintf(prefix_path, len, "%s%c%s", patch_dirs[x], file_sep, module_name);
-
-          // See if Xpatch module path exists.
-          struct stat st;
-          if ((os::stat(prefix_path, &st) != 0)) {
-            FREE_C_HEAP_ARRAY(char, prefix_path);
-          } else {
-            {
-              HandleMark hm;
-              Handle loader_lock = Handle(THREAD, SystemDictionary::system_loader_lock());
-              ObjectLocker ol(loader_lock, THREAD);
-              ClassLoader::prepend_to_list(prefix_path);
-            }
-            log_info(classload)("opened: -Xpatch %s", prefix_path);
-          }
-        }
-      }
-    }
-  }
-
-  // If "modules" jimage does not exist then assume exploded form
-  // ${java.home}/modules/<module-name>
-  char* path = NULL;
-  if (!ClassLoader::has_jimage()) {
-    const char* home = Arguments::get_java_home();
-    size_t len = strlen(home) + module_len + 32;
-    path = NEW_C_HEAP_ARRAY(char, len, mtInternal);
-    jio_snprintf(path, len, "%s%cmodules%c%s", home, file_sep, file_sep, module_name);
-    struct stat st;
-    // See if exploded module path exists.
-    if ((os::stat(path, &st) != 0)) {
-      FREE_C_HEAP_ARRAY(char, path);
-      path = NULL;
-    }
+  const char* home = Arguments::get_java_home();
+  size_t len = strlen(home) + module_len + 32;
+  char* path = NEW_C_HEAP_ARRAY(char, len, mtInternal);
+  jio_snprintf(path, len, "%s%cmodules%c%s", home, file_sep, file_sep, module_name);
+  struct stat st;
+  // See if exploded module path exists
+  if ((os::stat(path, &st) != 0)) {
+    FREE_C_HEAP_ARRAY(char, path);
+    path = NULL;
   }
 
   if (path != NULL) {
     HandleMark hm;
     Handle loader_lock = Handle(THREAD, SystemDictionary::system_loader_lock());
     ObjectLocker ol(loader_lock, THREAD);
-
     log_info(classload)("opened: %s", path);
     ClassLoader::add_to_list(path);
   }
@@ -493,13 +456,12 @@
     }
   }
 
-  if (loader == NULL && !Universe::is_module_initialized()) {
-    // Now that the module is defined, if it is in the bootloader, make sure that
-    // its classes can be found.  Check if -Xpatch:<path> was specified.  If
-    // so prepend <path>/module_name, if it exists, to bootpath.  Also, if using
-    // exploded modules, prepend <java.home>/modules/module_name, if it exists,
-    // to bootpath.
-    add_to_boot_loader_list(module_name, CHECK);
+  // If the module is defined to the boot loader and an exploded build is being
+  // used, prepend <java.home>/modules/modules_name, if it exists, to the system boot class path.
+  if (loader == NULL &&
+      !Universe::is_module_initialized() &&
+      !ClassLoader::has_jimage()) {
+    add_to_exploded_build_list(module_name, CHECK);
   }
 }
 
--- a/hotspot/src/share/vm/memory/filemap.cpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/memory/filemap.cpp	Wed Jul 05 21:40:37 2017 +0200
@@ -880,7 +880,7 @@
     return false;
   }
 
-  if (Arguments::patch_dirs() != NULL) {
+  if (Arguments::get_xpatchprefix() != NULL) {
     FileMapInfo::fail_continue("The shared archive file cannot be used with -Xpatch.");
     return false;
   }
--- a/hotspot/src/share/vm/memory/metaspaceShared.hpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/memory/metaspaceShared.hpp	Wed Jul 05 21:40:37 2017 +0200
@@ -43,10 +43,10 @@
 // for the x64 platform
 #define DEFAULT_VTBL_COMMON_CODE_SIZE   (1*K) // conservative size of the "common_code" for the x64 platform
 
-#define DEFAULT_SHARED_READ_WRITE_SIZE  (NOT_LP64(12*M) LP64_ONLY(16*M))
-#define MIN_SHARED_READ_WRITE_SIZE      (NOT_LP64(7*M) LP64_ONLY(12*M))
+#define DEFAULT_SHARED_READ_WRITE_SIZE  (NOT_LP64(8*M) LP64_ONLY(10*M))
+#define MIN_SHARED_READ_WRITE_SIZE      (NOT_LP64(7*M) LP64_ONLY(10*M))
 
-#define DEFAULT_SHARED_READ_ONLY_SIZE   (NOT_LP64(12*M) LP64_ONLY(16*M))
+#define DEFAULT_SHARED_READ_ONLY_SIZE   (NOT_LP64(8*M) LP64_ONLY(10*M))
 #define MIN_SHARED_READ_ONLY_SIZE       (NOT_LP64(8*M) LP64_ONLY(9*M))
 
 // the MIN_SHARED_MISC_DATA_SIZE and MIN_SHARED_MISC_CODE_SIZE estimates are based on
--- a/hotspot/src/share/vm/opto/doCall.cpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/opto/doCall.cpp	Wed Jul 05 21:40:37 2017 +0200
@@ -415,8 +415,12 @@
   if (symbolic_info->arg_size() != (resolved_method->arg_size() + has_appendix)) {
     return false; // Total size of arguments on stack mismatch.
   }
-  if (!check_type(symbolic_info->return_type(), resolved_method->return_type())) {
-    return false; // Return value size or type mismatch encountered.
+  if (!symbolic_info->return_type()->is_void()) {
+    // Only check the return type if the symbolic method is not void
+    // i.e. the return value of the resolved method can be dropped
+    if (!check_type(symbolic_info->return_type(), resolved_method->return_type())) {
+      return false; // Return value size or type mismatch encountered.
+    }
   }
 
   switch (symbolic_info->intrinsic_id()) {
--- a/hotspot/src/share/vm/runtime/arguments.cpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.cpp	Wed Jul 05 21:40:37 2017 +0200
@@ -84,8 +84,6 @@
 const char*  Arguments::_sun_java_launcher      = DEFAULT_JAVA_LAUNCHER;
 int    Arguments::_sun_java_launcher_pid        = -1;
 bool   Arguments::_sun_java_launcher_is_altjvm  = false;
-int    Arguments::_patch_dirs_count          = 0;
-char** Arguments::_patch_dirs                = NULL;
 int    Arguments::_bootclassloader_append_index = -1;
 
 // These parameters are reset in method parse_vm_init_args()
@@ -112,6 +110,7 @@
 SystemProperty *Arguments::_java_class_path = NULL;
 SystemProperty *Arguments::_jdk_boot_class_path_append = NULL;
 
+GrowableArray<ModuleXPatchPath*> *Arguments::_xpatchprefix = NULL;
 PathString *Arguments::_system_boot_class_path = NULL;
 
 char* Arguments::_ext_dirs = NULL;
@@ -579,204 +578,6 @@
 }
 #endif
 
-// Constructs the system boot class path from the following components, in order:
-//
-//     prefix           // from -Xpatch:...
-//     base             // from os::get_system_properties()
-//     suffix           // from -Xbootclasspath/a:...
-//
-// This could be AllStatic, but it isn't needed after argument processing is
-// complete. After argument processing, the combined components are copied
-// to Arguments::_system_boot_class_path via a call to Arguments::set_sysclasspath.
-class ArgumentBootClassPath: public StackObj {
-public:
-  ArgumentBootClassPath(const char* base);
-  ~ArgumentBootClassPath();
-
-  inline void set_base(const char* base);
-  inline void add_prefix(const char* prefix);
-  inline void add_suffix_to_prefix(const char* suffix);
-  inline void add_suffix(const char* suffix);
-  inline void reset_path(const char* base);
-
-  inline const char* get_base()     const { return _items[_bcp_base]; }
-  inline const char* get_prefix()   const { return _items[_bcp_prefix]; }
-  inline const char* get_suffix()   const { return _items[_bcp_suffix]; }
-
-  // Combine all the components into a single c-heap-allocated string; caller
-  // must free the string if/when no longer needed.
-  char* combined_path();
-
-private:
-  // Utility routines.
-  static char* add_to_path(const char* path, const char* str, bool prepend);
-  static char* add_jars_to_path(char* path, const char* directory);
-
-  inline void reset_item_at(int index);
-
-  // Array indices for the items that make up the sysclasspath.  All except the
-  // base are allocated in the C heap and freed by this class.
-  enum {
-    _bcp_prefix,        // was -Xpatch:...
-    _bcp_base,          // the default system boot class path
-    _bcp_suffix,        // from -Xbootclasspath/a:...
-    _bcp_nitems         // the number of items, must be last.
-  };
-
-  const char* _items[_bcp_nitems];
-};
-
-ArgumentBootClassPath::ArgumentBootClassPath(const char* base) {
-  memset(_items, 0, sizeof(_items));
-  _items[_bcp_base] = base;
-}
-
-ArgumentBootClassPath::~ArgumentBootClassPath() {
-  // Free everything except the base.
-  for (int i = 0; i < _bcp_nitems; ++i) {
-    if (i != _bcp_base) reset_item_at(i);
-  }
-}
-
-inline void ArgumentBootClassPath::set_base(const char* base) {
-  _items[_bcp_base] = base;
-}
-
-inline void ArgumentBootClassPath::add_prefix(const char* prefix) {
-  _items[_bcp_prefix] = add_to_path(_items[_bcp_prefix], prefix, true);
-}
-
-inline void ArgumentBootClassPath::add_suffix_to_prefix(const char* suffix) {
-  _items[_bcp_prefix] = add_to_path(_items[_bcp_prefix], suffix, false);
-}
-
-inline void ArgumentBootClassPath::add_suffix(const char* suffix) {
-  _items[_bcp_suffix] = add_to_path(_items[_bcp_suffix], suffix, false);
-}
-
-inline void ArgumentBootClassPath::reset_item_at(int index) {
-  assert(index < _bcp_nitems && index != _bcp_base, "just checking");
-  if (_items[index] != NULL) {
-    FREE_C_HEAP_ARRAY(char, _items[index]);
-    _items[index] = NULL;
-  }
-}
-
-inline void ArgumentBootClassPath::reset_path(const char* base) {
-  // Clear the prefix and suffix.
-  reset_item_at(_bcp_prefix);
-  reset_item_at(_bcp_suffix);
-  set_base(base);
-}
-
-//------------------------------------------------------------------------------
-
-
-// Combine the bootclasspath elements, some of which may be null, into a single
-// c-heap-allocated string.
-char* ArgumentBootClassPath::combined_path() {
-  assert(_items[_bcp_base] != NULL, "empty default sysclasspath");
-
-  size_t lengths[_bcp_nitems];
-  size_t total_len = 0;
-
-  const char separator = *os::path_separator();
-
-  // Get the lengths.
-  int i;
-  for (i = 0; i < _bcp_nitems; ++i) {
-    if (i == _bcp_suffix) {
-      // Record index of boot loader's append path.
-      Arguments::set_bootclassloader_append_index((int)total_len);
-    }
-    if (_items[i] != NULL) {
-      lengths[i] = strlen(_items[i]);
-      // Include space for the separator char (or a NULL for the last item).
-      total_len += lengths[i] + 1;
-    }
-  }
-  assert(total_len > 0, "empty sysclasspath not allowed");
-
-  // Copy the _items to a single string.
-  char* cp = NEW_C_HEAP_ARRAY(char, total_len, mtArguments);
-  char* cp_tmp = cp;
-  for (i = 0; i < _bcp_nitems; ++i) {
-    if (_items[i] != NULL) {
-      memcpy(cp_tmp, _items[i], lengths[i]);
-      cp_tmp += lengths[i];
-      *cp_tmp++ = separator;
-    }
-  }
-  *--cp_tmp = '\0';     // Replace the extra separator.
-  return cp;
-}
-
-// Note:  path must be c-heap-allocated (or NULL); it is freed if non-null.
-char*
-ArgumentBootClassPath::add_to_path(const char* path, const char* str, bool prepend) {
-  char *cp;
-
-  assert(str != NULL, "just checking");
-  if (path == NULL) {
-    size_t len = strlen(str) + 1;
-    cp = NEW_C_HEAP_ARRAY(char, len, mtArguments);
-    memcpy(cp, str, len);                       // copy the trailing null
-  } else {
-    const char separator = *os::path_separator();
-    size_t old_len = strlen(path);
-    size_t str_len = strlen(str);
-    size_t len = old_len + str_len + 2;
-
-    if (prepend) {
-      cp = NEW_C_HEAP_ARRAY(char, len, mtArguments);
-      char* cp_tmp = cp;
-      memcpy(cp_tmp, str, str_len);
-      cp_tmp += str_len;
-      *cp_tmp = separator;
-      memcpy(++cp_tmp, path, old_len + 1);      // copy the trailing null
-      FREE_C_HEAP_ARRAY(char, path);
-    } else {
-      cp = REALLOC_C_HEAP_ARRAY(char, path, len, mtArguments);
-      char* cp_tmp = cp + old_len;
-      *cp_tmp = separator;
-      memcpy(++cp_tmp, str, str_len + 1);       // copy the trailing null
-    }
-  }
-  return cp;
-}
-
-// Scan the directory and append any jar or zip files found to path.
-// Note:  path must be c-heap-allocated (or NULL); it is freed if non-null.
-char* ArgumentBootClassPath::add_jars_to_path(char* path, const char* directory) {
-  DIR* dir = os::opendir(directory);
-  if (dir == NULL) return path;
-
-  char dir_sep[2] = { '\0', '\0' };
-  size_t directory_len = strlen(directory);
-  const char fileSep = *os::file_separator();
-  if (directory[directory_len - 1] != fileSep) dir_sep[0] = fileSep;
-
-  /* Scan the directory for jars/zips, appending them to path. */
-  struct dirent *entry;
-  char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory), mtArguments);
-  while ((entry = os::readdir(dir, (dirent *) dbuf)) != NULL) {
-    const char* name = entry->d_name;
-    const char* ext = name + strlen(name) - 4;
-    bool isJarOrZip = ext > name &&
-      (os::file_name_strcmp(ext, ".jar") == 0 ||
-       os::file_name_strcmp(ext, ".zip") == 0);
-    if (isJarOrZip) {
-      char* jarpath = NEW_C_HEAP_ARRAY(char, directory_len + 2 + strlen(name), mtArguments);
-      sprintf(jarpath, "%s%s%s", directory, dir_sep, name);
-      path = add_to_path(path, jarpath, false);
-      FREE_C_HEAP_ARRAY(char, jarpath);
-    }
-  }
-  FREE_C_HEAP_ARRAY(char, dbuf);
-  os::closedir(dir);
-  return path;
-}
-
 // Parses a memory size specification string.
 static bool atomull(const char *s, julong* result) {
   julong n = 0;
@@ -2687,9 +2488,7 @@
 jint Arguments::parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
                                    const JavaVMInitArgs *java_options_args,
                                    const JavaVMInitArgs *cmd_line_args) {
-  // For components of the system classpath.
-  ArgumentBootClassPath bcp(Arguments::get_sysclasspath());
-  bool bcp_assembly_required = false;
+  bool xpatch_javabase = false;
 
   // Save default settings for some mode flags
   Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods;
@@ -2706,29 +2505,26 @@
 
   // Parse args structure generated from JAVA_TOOL_OPTIONS environment
   // variable (if present).
-  jint result = parse_each_vm_init_arg(
-      java_tool_options_args, &bcp, &bcp_assembly_required, Flag::ENVIRON_VAR);
+  jint result = parse_each_vm_init_arg(java_tool_options_args, &xpatch_javabase, Flag::ENVIRON_VAR);
   if (result != JNI_OK) {
     return result;
   }
 
   // Parse args structure generated from the command line flags.
-  result = parse_each_vm_init_arg(cmd_line_args, &bcp, &bcp_assembly_required,
-                                  Flag::COMMAND_LINE);
+  result = parse_each_vm_init_arg(cmd_line_args, &xpatch_javabase, Flag::COMMAND_LINE);
   if (result != JNI_OK) {
     return result;
   }
 
   // Parse args structure generated from the _JAVA_OPTIONS environment
   // variable (if present) (mimics classic VM)
-  result = parse_each_vm_init_arg(
-      java_options_args, &bcp, &bcp_assembly_required, Flag::ENVIRON_VAR);
+  result = parse_each_vm_init_arg(java_options_args, &xpatch_javabase, Flag::ENVIRON_VAR);
   if (result != JNI_OK) {
     return result;
   }
 
   // Do final processing now that all arguments have been parsed
-  result = finalize_vm_init_args(&bcp, bcp_assembly_required);
+  result = finalize_vm_init_args();
   if (result != JNI_OK) {
     return result;
   }
@@ -2781,10 +2577,7 @@
   return false;
 }
 
-jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
-                                       ArgumentBootClassPath* bcp_p,
-                                       bool* bcp_assembly_required_p,
-                                       Flag::Flags origin) {
+jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_javabase, Flag::Flags origin) {
   // For match_option to return remaining or value part of option string
   const char* tail;
 
@@ -2840,8 +2633,8 @@
         return JNI_EINVAL;
     // -bootclasspath/a:
     } else if (match_option(option, "-Xbootclasspath/a:", &tail)) {
-      bcp_p->add_suffix(tail);
-      *bcp_assembly_required_p = true;
+      Arguments::set_bootclassloader_append_index((int)strlen(Arguments::get_sysclasspath())+1);
+      Arguments::append_sysclasspath(tail);
     // -bootclasspath/p:
     } else if (match_option(option, "-Xbootclasspath/p:", &tail)) {
         jio_fprintf(defaultStream::output_stream(),
@@ -2901,9 +2694,8 @@
       if (tail != NULL) {
         char *options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(tail) + 1, mtArguments), tail);
         add_init_agent("instrument", options, false);
-        // java agents need module java.instrument. Also -addmods ALL-SYSTEM because
-        // the java agent is in the unmamed module of the application class loader
-        if (!Arguments::append_to_addmods_property("java.instrument,ALL-SYSTEM")) {
+        // java agents need module java.instrument
+        if (!Arguments::append_to_addmods_property("java.instrument")) {
           return JNI_ENOMEM;
         }
       }
@@ -3181,37 +2973,30 @@
         return JNI_ERR;
 #endif
       }
-      if (match_option(option, "-Djdk.launcher.patch.0=", &tail)) {
-        // -Xpatch
-        int dir_count;
-        char** patch_dirs = os::split_path(tail, &dir_count);
-        if (patch_dirs == NULL) {
-          jio_fprintf(defaultStream::output_stream(),
-            "Bad value for -Xpatch.\n");
+      if (match_option(option, "-Djdk.launcher.patch.", &tail)) {
+        // -Djdk.launcher.patch.#=<module>=<file>(<pathsep><file>)*
+        // The number, #, specified will be increasing with each -Xpatch
+        // specified on the command line.
+        // Pick up module name, following the -D property's equal sign.
+        const char* property_equal = strchr(tail, '=');
+        if (property_equal == NULL) {
+          jio_fprintf(defaultStream::output_stream(), "Missing '=' in -Xpatch specification\n");
           return JNI_ERR;
-        }
-        set_patch_dirs(patch_dirs);
-        set_patch_dirs_count(dir_count);
-
-        // Create a path for each patch dir consisting of dir/java.base.
-        char file_sep = os::file_separator()[0];
-        for (int x = 0; x < dir_count; x++) {
-          // Really shouldn't be NULL, but check can't hurt
-          if (patch_dirs[x] != NULL) {
-            size_t len = strlen(patch_dirs[x]);
-            if (len != 0) { // Ignore empty strings.
-              len += 11; // file_sep + "java.base" + null terminator.
-              char* dir = NEW_C_HEAP_ARRAY(char, len, mtArguments);
-              jio_snprintf(dir, len, "%s%cjava.base", patch_dirs[x], file_sep);
-
-              // See if Xpatch module path exists.
-              struct stat st;
-              if ((os::stat(dir, &st) == 0)) {
-                bcp_p->add_prefix(dir);
-                *bcp_assembly_required_p = true;
-              }
-              FREE_C_HEAP_ARRAY(char, dir);
-            }
+        } else {
+          // Find the equal sign between the module name and the path specification
+          const char* module_equal = strchr(property_equal + 1, '=');
+          if (module_equal == NULL) {
+            jio_fprintf(defaultStream::output_stream(), "Bad value for -Xpatch, no module name specified\n");
+            return JNI_ERR;
+          } else {
+            // Pick out the module name, in between the two equal signs
+            size_t module_len = module_equal - property_equal - 1;
+            char* module_name = NEW_C_HEAP_ARRAY(char, module_len+1, mtArguments);
+            memcpy(module_name, property_equal + 1, module_len);
+            *(module_name + module_len) = '\0';
+            // The path piece begins one past the module_equal sign
+            Arguments::add_xpatchprefix(module_name, module_equal + 1, xpatch_javabase);
+            FREE_C_HEAP_ARRAY(char, module_name);
           }
         }
       }
@@ -3474,6 +3259,27 @@
   return JNI_OK;
 }
 
+void Arguments::add_xpatchprefix(const char* module_name, const char* path, bool* xpatch_javabase) {
+  // For java.base check for duplicate -Xpatch options being specified on the command line.
+  // This check is only required for java.base, all other duplicate module specifications
+  // will be checked during module system initialization.  The module system initialization
+  // will throw an ExceptionInInitializerError if this situation occurs.
+  if (strcmp(module_name, "java.base") == 0) {
+    if (*xpatch_javabase) {
+      vm_exit_during_initialization("Cannot specify java.base more than once to -Xpatch");
+    } else {
+      *xpatch_javabase = true;
+    }
+  }
+
+  // Create GrowableArray lazily, only if -Xpatch has been specified
+  if (_xpatchprefix == NULL) {
+    _xpatchprefix = new (ResourceObj::C_HEAP, mtArguments) GrowableArray<ModuleXPatchPath*>(10, true);
+  }
+
+  _xpatchprefix->push(new ModuleXPatchPath(module_name, path));
+}
+
 // Set property jdk.boot.class.path.append to the contents of the bootclasspath
 // that follows either the jimage file or exploded module directories.  The
 // property will contain -Xbootclasspath/a and/or jvmti appended additions.
@@ -3572,7 +3378,7 @@
   return nonEmptyDirs;
 }
 
-jint Arguments::finalize_vm_init_args(ArgumentBootClassPath* bcp_p, bool bcp_assembly_required) {
+jint Arguments::finalize_vm_init_args() {
   // check if the default lib/endorsed directory exists; if so, error
   char path[JVM_MAXPATHLEN];
   const char* fileSep = os::file_separator();
@@ -3608,17 +3414,7 @@
     return JNI_ERR;
   }
 
-  if (bcp_assembly_required) {
-    // Assemble the bootclasspath elements into the final path.
-    char *combined_path = bcp_p->combined_path();
-    Arguments::set_sysclasspath(combined_path);
-    FREE_C_HEAP_ARRAY(char, combined_path);
-  } else {
-    // At this point in sysclasspath processing anything
-    // added would be considered in the boot loader's append path.
-    // Record this index, including +1 for the file separator character.
-    Arguments::set_bootclassloader_append_index(((int)strlen(Arguments::get_sysclasspath()))+1);
-  }
+  Arguments::set_bootclassloader_append_index(((int)strlen(Arguments::get_sysclasspath()))+1);
 
   // This must be done after all arguments have been processed.
   // java_compiler() true means set to "NONE" or empty.
@@ -3667,6 +3463,12 @@
   UNSUPPORTED_OPTION(TieredCompilation);
 #endif
 
+#if INCLUDE_JVMCI
+  if (EnableJVMCI && !append_to_addmods_property("jdk.vm.ci")) {
+    return JNI_ENOMEM;
+  }
+#endif
+
   // If we are running in a headless jre, force java.awt.headless property
   // to be true unless the property has already been set.
   // Also allow the OS environment variable JAVA_AWT_HEADLESS to set headless state.
@@ -3968,7 +3770,7 @@
 
 void Arguments::set_shared_spaces_flags() {
   if (DumpSharedSpaces) {
-    if (Arguments::patch_dirs() != NULL) {
+    if (Arguments::get_xpatchprefix() != NULL) {
       vm_exit_during_initialization(
         "Cannot use the following option when dumping the shared archive", "-Xpatch");
     }
--- a/hotspot/src/share/vm/runtime/arguments.hpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/runtime/arguments.hpp	Wed Jul 05 21:40:37 2017 +0200
@@ -41,17 +41,15 @@
   typedef jint (JNICALL *vfprintf_hook_t)(FILE *fp, const char *format, va_list args)  ATTRIBUTE_PRINTF(2, 0);
 }
 
-// Forward declarations
-class ArgumentBootClassPath;
-
-// PathString is used as the underlying value container for a
-// SystemProperty and for the string that represents the system
-// boot class path, Arguments::_system_boot_class_path.
+// PathString is used as:
+//  - the underlying value for a SystemProperty
+//  - the path portion of an -Xpatch module/path pair
+//  - the string that represents the system boot class path, Arguments::_system_boot_class_path.
 class PathString : public CHeapObj<mtArguments> {
  protected:
-  char*           _value;
+  char* _value;
  public:
-  char* value() const                       { return _value; }
+  char* value() const { return _value; }
 
   bool set_value(const char *value) {
     if (_value != NULL) {
@@ -92,7 +90,6 @@
     }
   }
 
-  // Constructor
   PathString(const char* value) {
     if (value == NULL) {
       _value = NULL;
@@ -101,6 +98,43 @@
       strcpy(_value, value);
     }
   }
+
+  ~PathString() {
+    if (_value != NULL) {
+      FreeHeap(_value);
+      _value = NULL;
+    }
+  }
+};
+
+// ModuleXPatchPath records the module/path pair as specified to -Xpatch.
+class ModuleXPatchPath : public CHeapObj<mtInternal> {
+private:
+  char* _module_name;
+  PathString* _path;
+public:
+  ModuleXPatchPath(const char* module_name, const char* path) {
+    assert(module_name != NULL && path != NULL, "Invalid module name or path value");
+    size_t len = strlen(module_name) + 1;
+    _module_name = AllocateHeap(len, mtInternal);
+    strncpy(_module_name, module_name, len); // copy the trailing null
+    _path =  new PathString(path);
+  }
+
+  ~ModuleXPatchPath() {
+    if (_module_name != NULL) {
+      FreeHeap(_module_name);
+      _module_name = NULL;
+    }
+    if (_path != NULL) {
+      delete _path;
+      _path = NULL;
+    }
+  }
+
+  inline void set_path(const char* path) { _path->set_value(path); }
+  inline const char* module_name() const { return _module_name; }
+  inline char* path_string() const { return _path->value(); }
 };
 
 // Element describing System and User (-Dkey=value flags) defined property.
@@ -114,7 +148,7 @@
   SystemProperty* _next;
   bool            _internal;
   bool            _writeable;
-  bool writeable()   { return _writeable; }
+  bool writeable() { return _writeable; }
 
  public:
   // Accessors
@@ -314,10 +348,19 @@
   static SystemProperty *_java_class_path;
   static SystemProperty *_jdk_boot_class_path_append;
 
+  // -Xpatch:module=<file>(<pathsep><file>)*
+  // Each element contains the associated module name, path
+  // string pair as specified to -Xpatch.
+  static GrowableArray<ModuleXPatchPath*>* _xpatchprefix;
+
   // The constructed value of the system class path after
   // argument processing and JVMTI OnLoad additions via
   // calls to AddToBootstrapClassLoaderSearch.  This is the
   // final form before ClassLoader::setup_bootstrap_search().
+  // Note: since -Xpatch is a module name/path pair, the system
+  // boot class path string no longer contains the "prefix" to
+  // the boot class path base piece as it did when
+  // -Xbootclasspath/p was supported.
   static PathString *_system_boot_class_path;
 
   // temporary: to emit warning if the default ext dirs are not empty.
@@ -373,12 +416,6 @@
   // mark the boot loader's append path observability boundary.
   static int _bootclassloader_append_index;
 
-  // -Xpatch flag
-  static char** _patch_dirs;
-  static int _patch_dirs_count;
-  static void set_patch_dirs(char** dirs) { _patch_dirs = dirs; }
-  static void set_patch_dirs_count(int count) { _patch_dirs_count = count; }
-
   // -Xdebug flag
   static bool _xdebug_mode;
   static void set_xdebug_mode(bool arg) { _xdebug_mode = arg; }
@@ -465,8 +502,8 @@
   static jint parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
                                  const JavaVMInitArgs *java_options_args,
                                  const JavaVMInitArgs *cmd_line_args);
-  static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, ArgumentBootClassPath* bcp_p, bool* bcp_assembly_required_p, Flag::Flags origin);
-  static jint finalize_vm_init_args(ArgumentBootClassPath* bcp_p, bool bcp_assembly_required);
+  static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_javabase, Flag::Flags origin);
+  static jint finalize_vm_init_args();
   static bool is_bad_option(const JavaVMOption* option, jboolean ignore, const char* option_type);
 
   static bool is_bad_option(const JavaVMOption* option, jboolean ignore) {
@@ -637,13 +674,12 @@
     return _bootclassloader_append_index;
   }
   static void set_bootclassloader_append_index(int value) {
-    _bootclassloader_append_index = value;
+    // Set only if the index has not been set yet
+    if (_bootclassloader_append_index == -1) {
+      _bootclassloader_append_index = value;
+    }
   }
 
-  // -Xpatch
-  static char** patch_dirs()             { return _patch_dirs; }
-  static int patch_dirs_count()          { return _patch_dirs_count; }
-
   // -Xrun
   static AgentLibrary* libraries()          { return _libraryList.first(); }
   static bool init_libraries_at_startup()   { return !_libraryList.is_empty(); }
@@ -701,8 +737,8 @@
   static void set_library_path(const char *value) { _java_library_path->set_value(value); }
   static void set_ext_dirs(char *value)     { _ext_dirs = os::strdup_check_oom(value); }
 
-  // Set up of the underlying system boot class path
-  static void set_jdkbootclasspath_append();
+  // Set up the underlying pieces of the system boot class path
+  static void add_xpatchprefix(const char *module_name, const char *path, bool* xpatch_javabase);
   static void set_sysclasspath(const char *value) {
     _system_boot_class_path->set_value(value);
     set_jdkbootclasspath_append();
@@ -711,11 +747,15 @@
     _system_boot_class_path->append_value(value);
     set_jdkbootclasspath_append();
   }
+  static void set_jdkbootclasspath_append();
 
-  static char* get_java_home() { return _java_home->value(); }
-  static char* get_dll_dir() { return _sun_boot_library_path->value(); }
+  static GrowableArray<ModuleXPatchPath*>* get_xpatchprefix() { return _xpatchprefix; }
   static char* get_sysclasspath() { return _system_boot_class_path->value(); }
-  static char* get_ext_dirs()        { return _ext_dirs;  }
+  static char* get_jdk_boot_class_path_append() { return _jdk_boot_class_path_append->value(); }
+
+  static char* get_java_home()    { return _java_home->value(); }
+  static char* get_dll_dir()      { return _sun_boot_library_path->value(); }
+  static char* get_ext_dirs()     { return _ext_dirs;  }
   static char* get_appclasspath() { return _java_class_path->value(); }
   static void  fix_appclasspath();
 
--- a/hotspot/src/share/vm/runtime/init.cpp	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/src/share/vm/runtime/init.cpp	Wed Jul 05 21:40:37 2017 +0200
@@ -52,7 +52,8 @@
 // Initialization done by Java thread in init_globals()
 void management_init();
 void bytecodes_init();
-void classLoader_init();
+void classLoader_init1();
+void classLoader_init2(); // note: ClassLoader need 2-phase init
 void compilationPolicy_init();
 void codeCache_init();
 void VM_Version_init();
@@ -102,7 +103,7 @@
   HandleMark hm;
   management_init();
   bytecodes_init();
-  classLoader_init();
+  classLoader_init1();
   compilationPolicy_init();
   codeCache_init();
   CodeCacheExtensions::initialize();
@@ -116,6 +117,7 @@
   if (status != JNI_OK)
     return status;
 
+  classLoader_init2();  // after SymbolTable creation, set up -Xpatch entries
   CodeCacheExtensions::complete_step(CodeCacheExtensionsSteps::Universe);
   interpreter_init();  // before any methods loaded
   CodeCacheExtensions::complete_step(CodeCacheExtensionsSteps::Interpreter);
--- a/hotspot/test/TEST.ROOT	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/TEST.ROOT	Wed Jul 05 21:40:37 2017 +0200
@@ -36,9 +36,12 @@
 requires.extraPropDefns = ../../test/jtreg-ext/requires/VMProps.java
 requires.properties=sun.arch.data.model
 
-# Tests using jtreg 4.2 b01 features
-requiredVersion=4.2 b01
+# Tests using jtreg 4.2 b02 features
+requiredVersion=4.2 b02
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../ notation to reach them
 external.lib.roots = ../../
+
+# Use new form of -Xpatch
+useNewXpatch=true
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/AndnTestI.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/AndnTestI.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -30,7 +30,7 @@
  * @build AndnTestI
  * @run main ClassFileInstaller sun.hotspot.WhiteBox
  *                              sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/bootclasspath -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * @run main/bootclasspath/othervm -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  *                         -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions AndnTestI
  */
 
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/AndnTestL.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/AndnTestL.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -30,7 +30,7 @@
  * @build AndnTestL
  * @run main ClassFileInstaller sun.hotspot.WhiteBox
  *                              sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/bootclasspath -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * @run main/bootclasspath/othervm -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  *                         -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions AndnTestL
  */
 
--- a/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,7 +27,7 @@
  * @modules java.base/jdk.internal.org.objectweb.asm
  * @library patches
  * @build java.base/java.lang.invoke.MethodHandleHelper
- * @run main/bootclasspath -Xbatch -XX:+IgnoreUnrecognizedVMOptions -Xlog:classunload
+ * @run main/bootclasspath/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -Xlog:classunload
  *                         -XX:+PrintCompilation -XX:+TraceDependencies -XX:+TraceReferenceGC
  *                         -verbose:gc compiler.jsr292.CallSiteDepContextTest
  */
--- a/hotspot/test/compiler/jsr292/InvokerGC.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/jsr292/InvokerGC.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,7 @@
  * @test
  * @bug 8067247
  * @library /test/lib /compiler/whitebox /
- * @run main/bootclasspath -Xcomp -Xbatch
+ * @run main/bootclasspath/othervm -Xcomp -Xbatch
  *      -XX:CompileCommand=compileonly,InvokerGC::test
  *      -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  *      InvokerGC
--- a/hotspot/test/compiler/jsr292/NonInlinedCall/GCTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/jsr292/NonInlinedCall/GCTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -28,7 +28,7 @@
  * @modules java.base/jdk.internal.vm.annotation
  * @build java.base/java.lang.invoke.MethodHandleHelper
  * @build sun.hotspot.WhiteBox
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  *                         -Xbatch -XX:-TieredCompilation -XX:CICompilerCount=1
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/jsr292/NonInlinedCall/InvokeTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/jsr292/NonInlinedCall/InvokeTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -29,7 +29,7 @@
  * @build java.base/java.lang.invoke.MethodHandleHelper
  * @build sun.hotspot.WhiteBox
  * @build compiler.jsr292.NonInlinedCall.InvokeTest
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  *                         -Xbatch -XX:-TieredCompilation -XX:CICompilerCount=1
  *                         compiler.jsr292.NonInlinedCall.InvokeTest
--- a/hotspot/test/compiler/jsr292/NonInlinedCall/RedefineTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/jsr292/NonInlinedCall/RedefineTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -35,7 +35,7 @@
  * @run main ClassFileInstaller sun.hotspot.WhiteBox
  *                              sun.hotspot.WhiteBox$WhiteBoxPermission
  *                              compiler.jsr292.NonInlinedCall.RedefineTest
- * @run main/bootclasspath -javaagent:agent.jar
+ * @run main/bootclasspath/othervm -javaagent:agent.jar
  *                         -XX:+IgnoreUnrecognizedVMOptions
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
  *                         -Xbatch -XX:-TieredCompilation -XX:CICompilerCount=1
--- a/hotspot/test/compiler/jsr292/VMAnonymousClasses.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/jsr292/VMAnonymousClasses.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,7 +26,7 @@
  * @bug 8058828
  * @modules java.base/jdk.internal.org.objectweb.asm
  *          java.base/jdk.internal.misc
- * @run main/bootclasspath -Xbatch VMAnonymousClasses
+ * @run main/bootclasspath/othervm -Xbatch VMAnonymousClasses
  */
 
 import jdk.internal.org.objectweb.asm.ClassWriter;
--- a/hotspot/test/compiler/stable/TestStableBoolean.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableBoolean.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableBoolean
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableBoolean
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:-FoldStableValues
  *                         compiler.stable.TestStableBoolean
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableBoolean
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  *                         -XX:-FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableByte.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableByte.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableByte
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableByte
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableByte
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableByte
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableChar.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableChar.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableChar
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableChar
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableChar
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableChar
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableDouble.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableDouble.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableDouble
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableDouble
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableDouble
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableDouble
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableFloat.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableFloat.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableFloat
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableFloat
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableFloat
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableFloat
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableInt.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableInt.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableInt
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableInt
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableInt
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableInt
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableLong.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableLong.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableLong
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableLong
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableLong
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableLong
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableMemoryBarrier.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableMemoryBarrier.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -30,7 +30,7 @@
  * @library /testlibrary /test/lib
  * @modules java.base/jdk.internal.vm.annotation
  *
- * @run main/bootclasspath -Xcomp -XX:CompileOnly=::testCompile
+ * @run main/bootclasspath/othervm -Xcomp -XX:CompileOnly=::testCompile
  *                         compiler.stable.TestStableMemoryBarrier
  *
  * @author hui.shi@linaro.org
--- a/hotspot/test/compiler/stable/TestStableObject.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableObject.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableObject
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableObject
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableObject
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableObject
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableShort.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableShort.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -31,23 +31,23 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableShort
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableShort
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableShort
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         compiler.stable.TestStableShort
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:CompileOnly=::get,::get1,::get2,::get3,::get4
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableUByte.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableUByte.java	Wed Jul 05 21:40:37 2017 +0200
@@ -31,26 +31,26 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableUByte
  *
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         -XX:CompileOnly=::get,::get1
  *                         compiler.stable.TestStableUByte
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:-TieredCompilation
  *                         -XX:-FoldStableValues
  *                         -XX:CompileOnly=::get,::get1
  *                         compiler.stable.TestStableUByte
  *
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  *                         -XX:+FoldStableValues
  *                         -XX:CompileOnly=::get,::get1
  *                         compiler.stable.TestStableUByte
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  *                         -XX:-FoldStableValues
--- a/hotspot/test/compiler/stable/TestStableUShort.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/stable/TestStableUShort.java	Wed Jul 05 21:40:37 2017 +0200
@@ -31,26 +31,26 @@
  * @build sun.hotspot.WhiteBox
  * @build compiler.stable.TestStableUShort
  *
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         -XX:CompileOnly=::get,::get1
  *                         compiler.stable.TestStableUShort
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:-TieredCompilation
  *                         -XX:-FoldStableValues
  *                         -XX:CompileOnly=::get,::get1
  *                         compiler.stable.TestStableUShort
  *
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  *                         -XX:+FoldStableValues
  *                         -XX:CompileOnly=::get,::get1
  *                         compiler.stable.TestStableUShort
- * @run main/bootclasspath -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
+ * @run main/bootclasspath/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+AlwaysIncrementalInline
  *                         -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp
  *                         -XX:+TieredCompilation -XX:TieredStopAtLevel=1
  *                         -XX:-FoldStableValues
--- a/hotspot/test/compiler/unsafe/UnsafeGetConstantField.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/compiler/unsafe/UnsafeGetConstantField.java	Wed Jul 05 21:40:37 2017 +0200
@@ -33,21 +33,23 @@
  * @modules java.base/jdk.internal.org.objectweb.asm
  *          java.base/jdk.internal.vm.annotation
  *          java.base/jdk.internal.misc
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions
  *                         -Xbatch -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         -XX:CompileCommand=dontinline,UnsafeGetConstantField.checkGetAddress()
  *                         -XX:CompileCommand=dontinline,*.test*
  *                         -XX:+UseUnalignedAccesses
+ *                         -XaddReads:java.base=ALL-UNNAMED
  *                         compiler.unsafe.UnsafeGetConstantField
  *
- * @run main/bootclasspath -XX:+UnlockDiagnosticVMOptions
+ * @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions
  *                         -Xbatch -XX:-TieredCompilation
  *                         -XX:+FoldStableValues
  *                         -XX:CompileCommand=dontinline,UnsafeGetConstantField.checkGetAddress()
  *                         -XX:CompileCommand=dontinline,*.test*
  *                         -XX:CompileCommand=inline,*Unsafe.get*
  *                         -XX:-UseUnalignedAccesses
+ *                         -XaddReads:java.base=ALL-UNNAMED
  *                         compiler.unsafe.UnsafeGetConstantField
  */
 package compiler.unsafe;
--- a/hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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,7 +48,7 @@
                                         "-Xmodule:java.base"),
                                         "mods/java.base");
 
-        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:mods", "-version");
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.base=mods/java.base", "-version");
         new OutputAnalyzer(pb.start())
             .shouldContain("Incompatible definition of java.lang.Object")
             .shouldHaveExitValue(1);
--- a/hotspot/test/runtime/SharedArchiveFile/MaxMetaspaceSize.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/SharedArchiveFile/MaxMetaspaceSize.java	Wed Jul 05 21:40:37 2017 +0200
@@ -35,7 +35,7 @@
 public class MaxMetaspaceSize {
   public static void main(String[] args) throws Exception {
     ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
-        "-XX:MaxMetaspaceSize=20m", "-Xshare:dump");
+        "-XX:MaxMetaspaceSize=10m", "-Xshare:dump");
     OutputAnalyzer output = new OutputAnalyzer(pb.start());
       output.shouldContain("is not large enough.\nEither don't specify the -XX:MaxMetaspaceSize=<size>\nor increase the size to at least");
       output.shouldHaveExitValue(2);
--- a/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -119,9 +119,9 @@
         getPkg("java/nio/charset", "jrt:/java.base");
 
         // Test a package in a module not owned by boot loader.
-        Class clss = Class.forName("javax.activation.DataHandler");
+        Class clss = Class.forName("jdk.nio.zipfs.ZipPath");
         if (clss == null)
-            throw new RuntimeException("Could not find class javax.activation.DataHandler");
+            throw new RuntimeException("Could not find class jdk.nio.zipfs.ZipPath");
         getPkg("javax/activation", null);       // Not owned by boot loader
 
         // Test a package not in jimage file.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java	Wed Jul 05 21:40:37 2017 +0200
@@ -209,9 +209,9 @@
      // now use the same loader to load class p1.c1Loose
      Class p1_c1_class = MyDiffClassLoader.loader1.loadClass("p1.c1Loose");
 
-     // change m1 to be a loose module
+     // change m1 to read all unnamed modules
      Module m1 = layer.findModule("m1").get();
-     jdk.internal.module.Modules.addReads(m1, null);
+     jdk.internal.module.Modules.addReadsAllUnnamed(m1);
 
      try {
          p1_c1_class.newInstance();
--- a/hotspot/test/runtime/modules/AccessCheck/Umod.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/modules/AccessCheck/Umod.java	Wed Jul 05 21:40:37 2017 +0200
@@ -200,9 +200,9 @@
      // now use the same loader to load class p1.c1Loose
      Class p1_c1_class = loader.loadClass("p1.c1Loose");
 
-     // change m1 to be a loose module
+     // change m1 to read all unnamed modules
      Module m1 = layer.findModule("m1").get();
-     jdk.internal.module.Modules.addReads(m1, null);
+     jdk.internal.module.Modules.addReadsAllUnnamed(m1);
 
      try {
          p1_c1_class.newInstance();
--- a/hotspot/test/runtime/modules/JVMAddReadsModule.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/modules/JVMAddReadsModule.java	Wed Jul 05 21:40:37 2017 +0200
@@ -48,26 +48,27 @@
         assertNotNull(to_module, "Module should not be null");
         ModuleHelper.DefineModule(to_module, "9.0", "to_module/here", new String[] { "yourpackage" });
 
-        // Null from_module argument, expect an NPE
+        // Null from_module argument, expect NPE
         try {
             ModuleHelper.AddReadsModule(null, to_module);
             throw new RuntimeException("Failed to get the expected NPE");
-        } catch(NullPointerException e) {
+        } catch (NullPointerException e) {
             // Expected
         }
 
-        // Null to_module argument, do not expect an NPE
+        // Null to_module argument, expect NPE
         try {
             ModuleHelper.AddReadsModule(from_module, null);
-        } catch(NullPointerException e) {
             throw new RuntimeException("Unexpected NPE was thrown");
+        } catch (NullPointerException e) {
+            // Expected
         }
 
-        // Null from_module and to_module arguments, expect an NPE
+        // Null from_module and to_module arguments, expect NPE
         try {
             ModuleHelper.AddReadsModule(null, null);
             throw new RuntimeException("Failed to get the expected NPE");
-        } catch(NullPointerException e) {
+        } catch (NullPointerException e) {
             // Expected
         }
 
--- a/hotspot/test/runtime/modules/Visibility/XpatchVisibility.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/modules/Visibility/XpatchVisibility.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -83,7 +83,7 @@
                                                            "p2" + File.separator + "Vis2_B.class"));
 
       new OutputAnalyzer(ProcessTools.createJavaProcessBuilder(
-              "-Xpatch:mods2",
+              "-Xpatch:java.base=mods2/java.base",
               "-XaddExports:java.base/p2=ALL-UNNAMED",
               "Vis2_A")
           .start()).shouldHaveExitValue(0);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/Xpatch/BasicJarBuilder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015, 2016, 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.
+ */
+
+/*
+ * @summary Simple jar builder
+ *   Input: jarName className1 className2 ...
+ *     do not specify extensions, just the names
+ *     E.g. prot_domain ProtDomainA ProtDomainB
+ *   Output: A jar containing compiled classes, placed in a test classes folder
+ */
+
+import jdk.test.lib.*;
+
+import java.io.File;
+import java.util.ArrayList;
+import sun.tools.jar.Main;
+
+// Using JarBuilder requires that all to-be-jarred classes should be placed
+// in the current working directory, aka "."
+public class BasicJarBuilder {
+    private static final String classDir = System.getProperty("test.classes");
+
+    public static void build(boolean classesInWorkDir, String jarName,
+        String ...classNames) throws Exception {
+
+        if (classesInWorkDir) {
+            createSimpleJar(".", classDir + File.separator + jarName + ".jar", classNames);
+        } else {
+            build(jarName, classNames);
+        }
+    }
+
+    public static void build(String jarName, String ...classNames) throws Exception {
+        createSimpleJar(classDir, classDir + File.separator + jarName + ".jar",
+            classNames);
+    }
+
+    private static void createSimpleJar(String jarclassDir, String jarName,
+        String[] classNames) throws Exception {
+        ArrayList<String> args = new ArrayList<String>();
+        args.add("cf");
+        args.add(jarName);
+        addClassArgs(args, jarclassDir, classNames);
+        createJar(args);
+    }
+
+    private static void addClassArgs(ArrayList<String> args, String jarclassDir,
+        String[] classNames) {
+
+        for (String name : classNames) {
+            args.add("-C");
+            args.add(jarclassDir);
+            args.add(name + ".class");
+        }
+    }
+
+    private static void createJar(ArrayList<String> args) {
+        Main jarTool = new Main(System.out, System.err, "jar");
+        if (!jarTool.run(args.toArray(new String[1]))) {
+            throw new RuntimeException("jar operation failed");
+        }
+    }
+
+    // Get full path to the test jar
+    public static String getTestJar(String jar) {
+        File dir = new File(System.getProperty("test.classes", "."));
+        File jarFile = new File(dir, jar);
+        if (!jarFile.exists()) {
+            throw new RuntimeException("Cannot find " + jarFile.getPath());
+        }
+        if (!jarFile.isFile()) {
+            throw new RuntimeException("Not a regular file: " + jarFile.getPath());
+        }
+        return jarFile.getPath();
+    }
+}
--- a/hotspot/test/runtime/modules/Xpatch/Xpatch2Dirs.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/modules/Xpatch/Xpatch2Dirs.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -57,7 +57,8 @@
              "mods2/java.desktop");
 
         ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
-             "-Xpatch:mods" + File.pathSeparator + "mods2",
+             "-Xpatch:java.naming=mods/java.naming",
+             "-Xpatch:java.desktop=mods2/java.desktop",
              "Xpatch2DirsMain", "javax.naming.spi.NamingManager", "java.beans.Encoder");
 
         OutputAnalyzer oa = new OutputAnalyzer(pb.start());
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchDupJavaBase.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2016, 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
+ * @summary VM exit initialization results if java.base is specificed more than once to Xpatch.
+ * @library /testlibrary
+ */
+
+import jdk.test.lib.*;
+
+public class XpatchDupJavaBase {
+  // The VM should exit initialization if java.base is specified
+  // more than once to -Xpatch.
+  public static void main(String args[]) throws Exception {
+    ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+      "-Xpatch:java.base=javabase_dir",
+      "-Xpatch:java.base=javabase_dir",
+      "-version");
+    OutputAnalyzer output = new OutputAnalyzer(pb.start());
+    output.shouldContain("Cannot specify java.base more than once to -Xpatch");
+    output.shouldHaveExitValue(1);
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchDupModule.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2016, 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
+ * @summary Module system initialization exception results if a module is specificed twice to Xpatch.
+ * @library /testlibrary
+ */
+
+import jdk.test.lib.*;
+
+public class XpatchDupModule {
+
+  // The module system initialization should generate an ExceptionInInitializerError
+  // if -Xpatch is specified with the same module more than once.
+
+  public static void main(String args[]) throws Exception {
+    ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+      "-Xpatch:module1=module1_dir",
+      "-Xpatch:module1=module1_dir",
+      "-version");
+    OutputAnalyzer output = new OutputAnalyzer(pb.start());
+    output.shouldContain("java.lang.ExceptionInInitializerError");
+    output.shouldHaveExitValue(1);
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchJavaBase.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2016, 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 8130399
+ * @summary Make sure -Xpatch works for java.base.
+ * @library /testlibrary
+ * @compile XpatchMain.java
+ * @run main XpatchJavaBase
+ */
+
+import jdk.test.lib.*;
+
+public class XpatchJavaBase {
+
+    public static void main(String[] args) throws Exception {
+        String source = "package java.lang; "                       +
+                        "public class NewClass { "                  +
+                        "    static { "                             +
+                        "        System.out.println(\"I pass!\"); " +
+                        "    } "                                    +
+                        "}";
+
+        ClassFileInstaller.writeClassToDisk("java/lang/NewClass",
+             InMemoryJavaCompiler.compile("java.lang.NewClass", source, "-Xmodule:java.base"),
+             "mods/java.base");
+
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.base=mods/java.base",
+             "XpatchMain", "java.lang.NewClass");
+
+        new OutputAnalyzer(pb.start())
+            .shouldContain("I pass!")
+            .shouldHaveExitValue(0);
+    }
+}
--- a/hotspot/test/runtime/modules/Xpatch/XpatchTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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 @@
              InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
              "mods/java.naming");
 
-        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:mods",
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming",
              "XpatchMain", "javax.naming.spi.NamingManager");
 
         new OutputAnalyzer(pb.start())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchTestJar.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2016, 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
+ * @summary Make sure -Xpatch works when a jar file is specified for a module
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ *          jdk.jartool/sun.tools.jar
+ * @build BasicJarBuilder
+ * @compile XpatchMain.java
+ * @run main XpatchTestJar
+ */
+
+import jdk.test.lib.*;
+
+public class XpatchTestJar {
+    private static String moduleJar;
+
+    public static void main(String[] args) throws Exception {
+
+        // Create a class file in the module java.naming. This class file
+        // will be put in the javanaming.jar file.
+        String source = "package javax.naming.spi; "                +
+                        "public class NamingManager { "             +
+                        "    static { "                             +
+                        "        System.out.println(\"I pass!\"); " +
+                        "    } "                                    +
+                        "}";
+
+        ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
+             InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
+             System.getProperty("test.classes"));
+
+        // Build the jar file that will be used for the module "java.naming".
+        BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager");
+        moduleJar = BasicJarBuilder.getTestJar("javanaming.jar");
+
+        // Just to make sure we are not fooled by the class file being on the
+        // class path where all the test classes are stored, write the NamingManager.class
+        // file out again with output that does not contain what OutputAnalyzer
+        // expects. This will provide confidence that the contents of the class
+        // is truly coming from the jar file and not the class file.
+        source =        "package javax.naming.spi; "                +
+                        "public class NamingManager { "             +
+                        "    static { "                             +
+                        "        System.out.println(\"Fail!\"); "   +
+                        "    } "                                    +
+                        "}";
+
+        ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
+             InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
+             System.getProperty("test.classes"));
+
+        // Supply -Xpatch with the name of the jar file for the module java.naming.
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=" + moduleJar,
+             "XpatchMain", "javax.naming.spi.NamingManager");
+
+        new OutputAnalyzer(pb.start())
+            .shouldContain("I pass!")
+            .shouldHaveExitValue(0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchTestJarDir.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2016, 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
+ * @summary Make sure -Xpatch works when a jar file and a directory is specified for a module
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ *          jdk.jartool/sun.tools.jar
+ * @build BasicJarBuilder
+ * @compile Xpatch2DirsMain.java
+ * @run main XpatchTestJarDir
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import jdk.test.lib.*;
+
+public class XpatchTestJarDir {
+    private static String moduleJar;
+
+    public static void main(String[] args) throws Exception {
+
+        // Create a class file in the module java.naming. This class file
+        // will be put in the javanaming.jar file.
+        String source = "package javax.naming.spi; "                    +
+                        "public class NamingManager1 { "                +
+                        "    static { "                                 +
+                        "        System.out.println(\"I pass one!\"); " +
+                        "    } "                                        +
+                        "}";
+
+        ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager1",
+             InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager1", source, "-Xmodule:java.naming"),
+             System.getProperty("test.classes"));
+
+        // Build the jar file that will be used for the module "java.naming".
+        BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager1");
+        moduleJar = BasicJarBuilder.getTestJar("javanaming.jar");
+
+        // Just to make sure we are not fooled by the class file being on the
+        // class path where all the test classes are stored, write the NamingManager.class
+        // file out again with output that does not contain what OutputAnalyzer
+        // expects. This will provide confidence that the contents of the class
+        // is truly coming from the jar file and not the class file.
+        source = "package javax.naming.spi; "                +
+                 "public class NamingManager1 { "            +
+                 "    static { "                             +
+                 "        System.out.println(\"Fail!\"); "   +
+                 "    } "                                    +
+                 "}";
+
+        ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager1",
+             InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager1", source, "-Xmodule:java.naming"),
+             System.getProperty("test.classes"));
+
+        // Create a second class file in the module java.naming. This class file
+        // will be put in the mods/java.naming directory.
+        source = "package javax.naming.spi; "                    +
+                 "public class NamingManager2 { "                +
+                 "    static { "                                 +
+                 "        System.out.println(\"I pass two!\"); " +
+                 "    } "                                        +
+                 "}";
+
+        ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager2",
+             InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager2", source, "-Xmodule:java.naming"),
+             (System.getProperty("test.classes") + "/mods/java.naming"));
+
+
+        // Supply -Xpatch with the name of the jar file for the module java.naming.
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=" +
+                                                                           moduleJar +
+                                                                           File.pathSeparator +
+                                                                           System.getProperty("test.classes") + "/mods/java.naming",
+                                                                  "Xpatch2DirsMain",
+                                                                  "javax.naming.spi.NamingManager1",
+                                                                  "javax.naming.spi.NamingManager2");
+
+        new OutputAnalyzer(pb.start())
+            .shouldContain("I pass one!")
+            .shouldContain("I pass two!")
+            .shouldHaveExitValue(0);
+    }
+}
--- a/hotspot/test/runtime/modules/Xpatch/XpatchTraceCL.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchTraceCL.java	Wed Jul 05 21:40:37 2017 +0200
@@ -24,7 +24,7 @@
 /*
  * @test
  * @bug 8069469
- * @summary Make sure -XX:+TraceClassLoading works properly with "modules" jimage,
+ * @summary Make sure -Xlog:classload=info works properly with "modules" jimage,
             -Xpatch, and with -Xbootclasspath/a
  * @library /testlibrary
  * @compile XpatchMain.java
@@ -44,24 +44,23 @@
                         "    } "                                    +
                         "}";
 
-        // Test -XX:+TraceClassLoading output for -Xpatch
+        // Test -Xlog:classload=info output for -Xpatch
         ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
              InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
              "mods/java.naming");
 
-        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:mods",
-             "-XX:+TraceClassLoading", "XpatchMain", "javax.naming.spi.NamingManager");
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming",
+             "-Xlog:classload=info", "XpatchMain", "javax.naming.spi.NamingManager");
 
         OutputAnalyzer output = new OutputAnalyzer(pb.start());
         // "modules" jimage case.
         output.shouldContain("[classload] java.lang.Thread source: jrt:/java.base");
         // -Xpatch case.
-        output.shouldContain("[classload] javax.naming.spi.NamingManager source: mods" +
-            File.separator + "java.naming");
+        output.shouldContain("[classload] javax.naming.spi.NamingManager source: mods/java.naming");
         // -cp case.
         output.shouldContain("[classload] XpatchMain source: file");
 
-        // Test -XX:+TraceClassLoading output for -Xbootclasspath/a
+        // Test -Xlog:classload=info output for -Xbootclasspath/a
         source = "package XpatchTraceCL_pkg; "                 +
                  "public class ItIsI { "                          +
                  "    static { "                                  +
@@ -74,7 +73,7 @@
              "xbcp");
 
         pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/a:xbcp",
-             "-XX:+TraceClassLoading", "XpatchMain", "XpatchTraceCL_pkg.ItIsI");
+             "-Xlog:classload=info", "XpatchMain", "XpatchTraceCL_pkg.ItIsI");
         output = new OutputAnalyzer(pb.start());
         // -Xbootclasspath/a case.
         output.shouldContain("[classload] XpatchTraceCL_pkg.ItIsI source: xbcp");
--- a/hotspot/test/runtime/modules/XpatchCDS.java	Thu May 05 20:01:18 2016 -0700
+++ b/hotspot/test/runtime/modules/XpatchCDS.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -35,7 +35,7 @@
 
     public static void main(String args[]) throws Throwable {
         System.out.println("Test that -Xpatch and -Xshare:dump are incompatibable");
-        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:.", "-Xshare:dump");
+        ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming", "-Xshare:dump");
         OutputAnalyzer output = new OutputAnalyzer(pb.start());
         output.shouldContain("Cannot use the following option when dumping the shared archive: -Xpatch");
 
@@ -52,7 +52,7 @@
             "-XX:+UnlockDiagnosticVMOptions",
             "-XX:SharedArchiveFile=" + filename,
             "-Xshare:on",
-            "-Xpatch:.",
+            "-Xpatch:java.naming=mods/java.naming",
             "-version");
         output = new OutputAnalyzer(pb.start());
         output.shouldContain("The shared archive file cannot be used with -Xpatch");
--- a/jdk/.hgtags	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/.hgtags	Wed Jul 05 21:40:37 2017 +0200
@@ -359,3 +359,4 @@
 bb8379287f3736f38c52b2d1418784e2592461d1 jdk-9+114
 35225b837d66582037eeadeb471c13235dfd793d jdk-9+115
 baeb5edb38939cdb78ae0ac6f4fd368465cbf188 jdk-9+116
+4da0f73ce03aaf245b92cc040cc0ab0e3fa54dc2 jdk-9+117
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/GenerateClasslist.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,74 @@
+#
+# Copyright (c) 2016, 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.
+#
+
+################################################################################
+# Generate classlist
+################################################################################
+
+default: all
+
+include $(SPEC)
+include MakeBase.gmk
+include Tools.gmk
+include JarArchive.gmk
+
+################################################################################
+# Create a jar with our generator class. Using a jar is intentional since it
+# will load more classes
+
+$(eval $(call SetupJarArchive, CLASSLIST_JAR, \
+    SRCS := $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes, \
+    INCLUDES := build/tools/classlist, \
+    JAR := $(SUPPORT_OUTPUTDIR)/classlist.jar, \
+))
+
+TARGETS += $(CLASSLIST_JAR)
+
+################################################################################
+
+CLASSLIST_FILE := $(SUPPORT_OUTPUTDIR)/classlist/classlist
+
+# If an external buildjdk has been supplied, we don't build a separate interim
+# image, so just use the external build jdk instead.
+ifeq ($(EXTERNAL_BUILDJDK), true)
+  INTERIM_IMAGE_DIR := $(BUILD_JDK)
+endif
+
+$(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXE_SUFFIX) $(CLASSLIST_JAR)
+	$(call MakeDir, $(@D))
+	$(call LogInfo, Generating lib/classlist)
+	$(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.tmp \
+	    -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \
+	    build.tools.classlist.HelloClasslist $(LOG_DEBUG) 2>&1
+        # Filter out generated classes, remove after JDK-8149977
+	$(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@ \
+	    -Xshare:dump -XX:SharedClassListFile=$@.tmp $(LOG_DEBUG) 2>&1
+	$(RM) $@.tmp
+
+TARGETS += $(CLASSLIST_FILE)
+
+################################################################################
+
+all: $(TARGETS)
--- a/jdk/make/Tools.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/Tools.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -96,7 +96,13 @@
 TOOL_SPP = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes build.tools.spp.Spp
 
 # Nimbus is used somewhere in the swing build.
+
+ifeq ($(BOOT_JDK_MODULAR), true)
+  COMPILENIMBUS_ADD_MODS := -addmods java.xml.bind
+endif
+
 TOOL_GENERATENIMBUS = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
+    $(COMPILENIMBUS_ADD_MODS) \
     build.tools.generatenimbus.Generator
 
 TOOL_WRAPPERGENERATOR = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
--- a/jdk/make/data/classlist/classlist.aix	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2406 +0,0 @@
-java/lang/Object
-java/lang/String
-java/io/Serializable
-java/lang/Comparable
-java/lang/CharSequence
-java/lang/Class
-java/lang/reflect/GenericDeclaration
-java/lang/reflect/Type
-java/lang/reflect/AnnotatedElement
-java/lang/Cloneable
-java/lang/ClassLoader
-java/lang/System
-java/lang/Throwable
-java/lang/Error
-java/lang/ThreadDeath
-java/lang/Exception
-java/lang/RuntimeException
-java/security/ProtectionDomain
-java/security/AccessControlContext
-java/lang/ClassNotFoundException
-java/lang/NoClassDefFoundError
-java/lang/LinkageError
-java/lang/ClassCastException
-java/lang/ArrayStoreException
-java/lang/VirtualMachineError
-java/lang/OutOfMemoryError
-java/lang/StackOverflowError
-java/lang/IllegalMonitorStateException
-java/lang/ref/Reference
-java/lang/ref/SoftReference
-java/lang/ref/WeakReference
-java/lang/ref/FinalReference
-java/lang/ref/PhantomReference
-java/lang/ref/Finalizer
-java/lang/Thread
-java/lang/Runnable
-java/lang/ThreadGroup
-java/lang/Thread$UncaughtExceptionHandler
-java/util/Properties
-java/util/Hashtable
-java/util/Map
-java/util/Dictionary
-java/lang/reflect/AccessibleObject
-java/lang/reflect/Field
-java/lang/reflect/Member
-java/lang/reflect/Method
-java/lang/reflect/Constructor
-sun/reflect/MagicAccessorImpl
-sun/reflect/MethodAccessorImpl
-sun/reflect/MethodAccessor
-sun/reflect/ConstructorAccessorImpl
-sun/reflect/ConstructorAccessor
-sun/reflect/DelegatingClassLoader
-sun/reflect/ConstantPool
-sun/reflect/UnsafeStaticFieldAccessorImpl
-sun/reflect/UnsafeFieldAccessorImpl
-sun/reflect/FieldAccessorImpl
-sun/reflect/FieldAccessor
-java/util/Vector
-java/util/List
-java/util/Collection
-java/lang/Iterable
-java/util/RandomAccess
-java/util/AbstractList
-java/util/AbstractCollection
-java/lang/StringBuffer
-java/lang/AbstractStringBuilder
-java/lang/Appendable
-java/lang/StackTraceElement
-java/nio/Buffer
-java/lang/Boolean
-java/lang/Character
-java/lang/Float
-java/lang/Number
-java/lang/Double
-java/lang/Byte
-java/lang/Short
-java/lang/Integer
-java/lang/Long
-java/lang/NullPointerException
-java/lang/ArithmeticException
-java/io/ObjectStreamField
-java/lang/String$CaseInsensitiveComparator
-java/util/Comparator
-java/lang/RuntimePermission
-java/security/BasicPermission
-java/security/Permission
-java/security/Guard
-sun/misc/SoftCache
-java/util/AbstractMap
-java/lang/ref/ReferenceQueue
-java/lang/ref/ReferenceQueue$Null
-java/lang/ref/ReferenceQueue$Lock
-java/util/HashMap
-java/lang/annotation/Annotation
-java/util/HashMap$Entry
-java/util/Map$Entry
-java/security/AccessController
-java/lang/reflect/ReflectPermission
-sun/reflect/ReflectionFactory$GetReflectionFactoryAction
-java/security/PrivilegedAction
-java/util/Stack
-sun/reflect/ReflectionFactory
-java/lang/ref/Reference$Lock
-java/lang/ref/Reference$ReferenceHandler
-java/lang/ref/Finalizer$FinalizerThread
-java/util/Hashtable$EmptyEnumerator
-java/util/Enumeration
-java/util/Hashtable$EmptyIterator
-java/util/Iterator
-java/util/Hashtable$Entry
-java/nio/charset/Charset
-sun/nio/cs/StandardCharsets
-sun/nio/cs/FastCharsetProvider
-java/nio/charset/spi/CharsetProvider
-sun/nio/cs/StandardCharsets$Aliases
-sun/util/PreHashedMap
-sun/nio/cs/StandardCharsets$Classes
-sun/nio/cs/StandardCharsets$Cache
-java/lang/ThreadLocal
-java/util/concurrent/atomic/AtomicInteger
-sun/misc/Unsafe
-java/lang/NoSuchMethodError
-java/lang/IncompatibleClassChangeError
-sun/reflect/Reflection
-java/util/Collections
-java/util/Collections$EmptySet
-java/util/AbstractSet
-java/util/Set
-java/util/Collections$EmptyList
-java/util/Collections$EmptyMap
-java/util/Collections$ReverseComparator
-java/util/Collections$SynchronizedMap
-java/lang/Class$3
-java/lang/reflect/Modifier
-java/lang/reflect/ReflectAccess
-sun/reflect/LangReflectAccess
-java/util/Arrays
-java/lang/Math
-sun/nio/cs/US_ASCII
-sun/nio/cs/HistoricallyNamedCharset
-sun/misc/VM
-java/lang/StringCoding
-java/lang/ThreadLocal$ThreadLocalMap
-java/lang/ThreadLocal$ThreadLocalMap$Entry
-java/lang/StringCoding$StringDecoder
-sun/nio/cs/US_ASCII$Decoder
-java/nio/charset/CharsetDecoder
-java/nio/charset/CodingErrorAction
-java/nio/ByteBuffer
-java/nio/HeapByteBuffer
-java/nio/Bits
-java/nio/ByteOrder
-java/nio/CharBuffer
-java/lang/Readable
-java/nio/HeapCharBuffer
-java/nio/charset/CoderResult
-java/nio/charset/CoderResult$1
-java/nio/charset/CoderResult$Cache
-java/nio/charset/CoderResult$2
-sun/misc/Version
-java/io/FileInputStream
-java/io/InputStream
-java/io/Closeable
-java/io/FileDescriptor
-java/io/FileOutputStream
-java/io/OutputStream
-java/io/Flushable
-java/io/BufferedInputStream
-java/io/FilterInputStream
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
-sun/reflect/misc/ReflectUtil
-java/io/PrintStream
-java/io/FilterOutputStream
-java/io/BufferedOutputStream
-java/io/OutputStreamWriter
-java/io/Writer
-sun/nio/cs/StreamEncoder
-sun/security/action/GetPropertyAction
-sun/nio/cs/US_ASCII$Encoder
-java/nio/charset/CharsetEncoder
-sun/nio/cs/Surrogate$Parser
-sun/nio/cs/Surrogate
-java/io/BufferedWriter
-java/lang/Runtime
-java/io/File
-java/io/FileSystem
-java/io/UnixFileSystem
-java/io/ExpiringCache
-java/io/ExpiringCache$1
-java/util/LinkedHashMap
-java/util/LinkedHashMap$Entry
-java/lang/StringBuilder
-java/io/File$1
-sun/misc/JavaIODeleteOnExitAccess
-sun/misc/SharedSecrets
-java/lang/ClassLoader$3
-java/lang/StringCoding$StringEncoder
-java/io/ExpiringCache$Entry
-java/lang/ClassLoader$NativeLibrary
-java/lang/Terminator
-java/lang/Terminator$1
-sun/misc/SignalHandler
-sun/misc/Signal
-sun/misc/NativeSignalHandler
-java/io/Console
-java/io/Console$1
-sun/misc/JavaIOAccess
-java/io/Console$1$1
-java/lang/Shutdown
-java/util/ArrayList
-java/lang/Shutdown$Lock
-java/lang/ApplicationShutdownHooks
-java/util/IdentityHashMap
-sun/misc/OSEnvironment
-java/lang/System$2
-sun/misc/JavaLangAccess
-java/lang/Compiler
-java/lang/Compiler$1
-sun/misc/Launcher
-sun/misc/Launcher$Factory
-java/net/URLStreamHandlerFactory
-sun/misc/Launcher$ExtClassLoader
-java/net/URLClassLoader
-java/security/SecureClassLoader
-sun/security/util/Debug
-java/net/URLClassLoader$7
-sun/misc/JavaNetAccess
-java/util/StringTokenizer
-sun/misc/Launcher$ExtClassLoader$1
-java/security/PrivilegedExceptionAction
-sun/misc/MetaIndex
-java/io/BufferedReader
-java/io/Reader
-java/io/FileReader
-java/io/InputStreamReader
-sun/nio/cs/StreamDecoder
-java/lang/reflect/Array
-sun/net/www/ParseUtil
-java/util/BitSet
-java/io/ObjectStreamClass
-java/net/URL
-java/util/Locale
-java/util/concurrent/ConcurrentHashMap
-java/util/concurrent/ConcurrentMap
-java/util/concurrent/ConcurrentHashMap$Segment
-java/util/concurrent/locks/ReentrantLock
-java/util/concurrent/locks/Lock
-java/util/concurrent/locks/ReentrantLock$NonfairSync
-java/util/concurrent/locks/ReentrantLock$Sync
-java/util/concurrent/locks/AbstractQueuedSynchronizer
-java/util/concurrent/locks/AbstractOwnableSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer$Node
-java/util/concurrent/ConcurrentHashMap$HashEntry
-java/lang/CharacterDataLatin1
-java/net/Parts
-sun/net/www/protocol/file/Handler
-java/net/URLStreamHandler
-java/lang/Class$1
-sun/reflect/ReflectionFactory$1
-sun/reflect/NativeConstructorAccessorImpl
-sun/reflect/DelegatingConstructorAccessorImpl
-java/util/HashSet
-sun/misc/URLClassPath
-sun/net/www/protocol/jar/Handler
-sun/misc/Launcher$AppClassLoader
-sun/misc/Launcher$AppClassLoader$1
-java/lang/SystemClassLoaderAction
-java/net/URLClassLoader$1
-sun/misc/URLClassPath$3
-sun/misc/URLClassPath$JarLoader
-sun/misc/URLClassPath$Loader
-java/security/PrivilegedActionException
-sun/misc/URLClassPath$FileLoader
-sun/misc/URLClassPath$FileLoader$1
-sun/misc/Resource
-sun/nio/ByteBuffered
-java/security/CodeSource
-java/security/Permissions
-java/security/PermissionCollection
-sun/net/www/protocol/file/FileURLConnection
-sun/net/www/URLConnection
-java/net/URLConnection
-java/net/UnknownContentHandler
-java/net/ContentHandler
-sun/net/www/MessageHeader
-java/io/FilePermission
-java/io/FilePermission$1
-sun/security/provider/PolicyFile
-java/security/Policy
-java/security/Policy$UnsupportedEmptyCollection
-java/io/FilePermissionCollection
-java/security/AllPermission
-java/security/UnresolvedPermission
-java/security/BasicPermissionCollection
-java/security/Principal
-java/security/cert/Certificate
-java/util/AbstractList$Itr
-java/util/IdentityHashMap$KeySet
-java/util/IdentityHashMap$KeyIterator
-java/util/IdentityHashMap$IdentityHashMapIterator
-java/io/DeleteOnExitHook
-java/util/LinkedHashSet
-java/util/HashMap$KeySet
-java/util/LinkedHashMap$KeyIterator
-java/util/LinkedHashMap$LinkedHashIterator
-java/awt/Frame
-java/awt/MenuContainer
-java/awt/Window
-javax/accessibility/Accessible
-java/awt/Container
-java/awt/Component
-java/awt/image/ImageObserver
-java/lang/InterruptedException
-java/awt/Label
-java/util/logging/Logger
-java/util/logging/Handler
-java/util/logging/Level
-java/util/logging/LogManager
-java/util/logging/LogManager$1
-java/beans/PropertyChangeSupport
-java/util/logging/LogManager$LogNode
-java/util/logging/LoggingPermission
-java/util/logging/LogManager$Cleaner
-java/util/logging/LogManager$RootLogger
-java/util/logging/LogManager$2
-java/util/Properties$LineReader
-java/util/Hashtable$Enumerator
-java/beans/PropertyChangeEvent
-java/util/EventObject
-java/awt/Component$AWTTreeLock
-sun/awt/DebugHelper
-sun/awt/NativeLibLoader
-sun/security/action/LoadLibraryAction
-java/awt/GraphicsEnvironment
-java/awt/GraphicsEnvironment$1
-java/lang/ProcessEnvironment
-java/lang/ProcessEnvironment$Variable
-java/lang/ProcessEnvironment$ExternalData
-java/lang/ProcessEnvironment$Value
-java/lang/ProcessEnvironment$StringEnvironment
-java/util/Collections$UnmodifiableMap
-sun/awt/DebugHelperStub
-java/awt/Toolkit
-java/awt/Toolkit$3
-sun/util/CoreResourceBundleControl
-java/util/ResourceBundle$Control
-java/util/Arrays$ArrayList
-java/util/Collections$UnmodifiableRandomAccessList
-java/util/Collections$UnmodifiableList
-java/util/Collections$UnmodifiableCollection
-java/util/ResourceBundle
-java/util/ResourceBundle$1
-java/util/ResourceBundle$RBClassLoader
-java/util/ResourceBundle$RBClassLoader$1
-java/util/ResourceBundle$CacheKey
-java/util/ResourceBundle$LoaderReference
-java/util/ResourceBundle$CacheKeyReference
-java/util/ResourceBundle$SingleFormatControl
-sun/awt/resources/awt
-java/util/ListResourceBundle
-java/awt/Toolkit$1
-java/io/FileNotFoundException
-java/io/IOException
-java/awt/event/KeyEvent
-java/awt/event/InputEvent
-java/awt/event/ComponentEvent
-java/awt/AWTEvent
-java/awt/event/NativeLibLoader
-java/util/WeakHashMap
-java/util/WeakHashMap$Entry
-java/awt/Component$DummyRequestFocusController
-sun/awt/RequestFocusController
-java/awt/LayoutManager
-java/awt/LightweightDispatcher
-java/awt/event/AWTEventListener
-java/util/EventListener
-java/awt/Dimension
-java/awt/geom/Dimension2D
-java/util/concurrent/atomic/AtomicBoolean
-java/awt/ComponentOrientation
-java/awt/Component$2
-java/lang/NoSuchMethodException
-sun/awt/AppContext
-sun/awt/AppContext$1
-sun/awt/AppContext$2
-sun/awt/MostRecentKeyValue
-java/awt/Cursor
-sun/awt/X11GraphicsEnvironment
-sun/java2d/SunGraphicsEnvironment
-sun/java2d/FontSupport
-sun/awt/DisplayChangedListener
-sun/java2d/SunGraphicsEnvironment$TTFilter
-java/io/FilenameFilter
-sun/java2d/SunGraphicsEnvironment$T1Filter
-sun/awt/X11GraphicsEnvironment$1
-sun/awt/SunToolkit
-sun/awt/WindowClosingSupport
-sun/awt/WindowClosingListener
-sun/awt/ComponentFactory
-sun/awt/InputMethodSupport
-java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject
-java/util/concurrent/locks/Condition
-sun/awt/AWTAutoShutdown
-sun/awt/AWTAutoShutdown$PeerMap
-sun/awt/SunToolkit$6
-java/awt/Dialog$ModalExclusionType
-java/lang/Enum
-java/awt/Dialog
-java/awt/Dialog$ModalityType
-java/awt/ModalEventFilter
-java/awt/EventFilter
-sun/reflect/UnsafeFieldAccessorFactory
-sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl
-sun/awt/SunDisplayChanger
-sun/java2d/SunGraphicsEnvironment$1
-java/io/StreamTokenizer
-sun/font/FontManager
-sun/font/FileFont
-sun/font/PhysicalFont
-sun/font/Font2D
-sun/font/CompositeFont
-java/util/HashMap$Values
-java/util/HashMap$ValueIterator
-java/util/HashMap$HashIterator
-sun/font/FontManager$1
-java/awt/Font
-java/awt/geom/AffineTransform
-sun/font/AttributeValues
-sun/font/EAttribute
-java/text/AttributedCharacterIterator$Attribute
-java/lang/Class$4
-sun/reflect/NativeMethodAccessorImpl
-sun/reflect/DelegatingMethodAccessorImpl
-java/awt/font/TextAttribute
-java/lang/Integer$IntegerCache
-sun/font/TrueTypeFont
-java/awt/font/FontRenderContext
-java/awt/RenderingHints
-sun/awt/SunHints
-sun/awt/SunHints$Key
-java/awt/RenderingHints$Key
-sun/awt/SunHints$Value
-sun/awt/SunHints$LCDContrastKey
-sun/font/Type1Font
-java/awt/geom/Point2D$Float
-java/awt/geom/Point2D
-sun/font/StrikeMetrics
-java/awt/geom/Rectangle2D$Float
-java/awt/geom/Rectangle2D
-java/awt/geom/RectangularShape
-java/awt/Shape
-java/awt/geom/GeneralPath
-java/awt/geom/Path2D$Float
-java/awt/geom/Path2D
-sun/font/CharToGlyphMapper
-sun/font/PhysicalStrike
-sun/font/FontStrike
-sun/font/GlyphList
-sun/font/StrikeCache
-sun/java2d/Disposer
-sun/java2d/Disposer$1
-sun/font/StrikeCache$1
-sun/font/FontManager$FontRegistrationInfo
-sun/awt/motif/MFontConfiguration
-sun/awt/FontConfiguration
-sun/awt/FontDescriptor
-java/util/Scanner
-java/util/regex/Pattern
-java/util/regex/Pattern$8
-java/util/regex/Pattern$Node
-java/util/regex/Pattern$LastNode
-java/util/regex/Pattern$GroupHead
-java/util/regex/Pattern$CharPropertyNames
-java/util/regex/Pattern$CharPropertyNames$1
-java/util/regex/Pattern$CharPropertyNames$CharPropertyFactory
-java/util/regex/Pattern$CharPropertyNames$2
-java/util/regex/Pattern$CharPropertyNames$5
-java/util/regex/Pattern$CharPropertyNames$3
-java/util/regex/Pattern$CharPropertyNames$6
-java/util/regex/Pattern$CharPropertyNames$CloneableProperty
-java/util/regex/Pattern$CharProperty
-java/util/regex/Pattern$CharPropertyNames$4
-java/util/regex/Pattern$CharPropertyNames$7
-java/util/regex/Pattern$CharPropertyNames$8
-java/util/regex/Pattern$CharPropertyNames$9
-java/util/regex/Pattern$CharPropertyNames$10
-java/util/regex/Pattern$CharPropertyNames$11
-java/util/regex/Pattern$CharPropertyNames$12
-java/util/regex/Pattern$CharPropertyNames$13
-java/util/regex/Pattern$CharPropertyNames$14
-java/util/regex/Pattern$CharPropertyNames$15
-java/util/regex/Pattern$CharPropertyNames$16
-java/util/regex/Pattern$CharPropertyNames$17
-java/util/regex/Pattern$CharPropertyNames$18
-java/util/regex/Pattern$CharPropertyNames$19
-java/util/regex/Pattern$CharPropertyNames$20
-java/util/regex/Pattern$CharPropertyNames$21
-java/util/regex/Pattern$Curly
-java/util/regex/Pattern$Slice
-java/util/regex/Pattern$Begin
-java/util/regex/Pattern$First
-java/util/regex/Pattern$Start
-java/util/regex/Pattern$TreeInfo
-java/util/regex/Pattern$All
-java/util/regex/Pattern$BitClass
-java/util/regex/Pattern$BmpCharProperty
-java/util/regex/Pattern$6
-java/util/regex/Pattern$CharProperty$1
-java/util/regex/Pattern$10
-sun/nio/ch/FileChannelImpl
-java/nio/channels/FileChannel
-java/nio/channels/ByteChannel
-java/nio/channels/ReadableByteChannel
-java/nio/channels/Channel
-java/nio/channels/WritableByteChannel
-java/nio/channels/GatheringByteChannel
-java/nio/channels/ScatteringByteChannel
-java/nio/channels/spi/AbstractInterruptibleChannel
-java/nio/channels/InterruptibleChannel
-sun/nio/ch/Util
-sun/nio/ch/IOUtil
-sun/nio/ch/FileDispatcher
-sun/nio/ch/NativeDispatcher
-sun/nio/ch/Reflect
-java/nio/MappedByteBuffer
-sun/nio/ch/Reflect$1
-sun/nio/ch/NativeThreadSet
-java/nio/channels/Channels
-java/util/Scanner$1
-sun/misc/LRUCache
-java/util/regex/Matcher
-java/util/regex/MatchResult
-java/text/NumberFormat
-java/text/Format
-java/text/spi/NumberFormatProvider
-java/util/spi/LocaleServiceProvider
-sun/util/LocaleServiceProviderPool
-sun/util/LocaleServiceProviderPool$1
-java/util/ServiceLoader
-java/util/ServiceLoader$LazyIterator
-java/util/ServiceLoader$1
-java/util/HashMap$EntrySet
-java/util/LinkedHashMap$EntryIterator
-sun/misc/Launcher$1
-sun/misc/URLClassPath$2
-java/lang/ClassLoader$2
-sun/misc/URLClassPath$1
-java/net/URLClassLoader$3
-sun/misc/CompoundEnumeration
-sun/misc/URLClassPath$JarLoader$1
-sun/misc/FileURLMapper
-java/net/URLClassLoader$3$1
-sun/util/resources/LocaleData
-sun/util/resources/LocaleData$1
-sun/util/resources/LocaleData$LocaleDataResourceBundleControl
-sun/util/LocaleDataMetaInfo
-sun/text/resources/FormatData
-java/util/ResourceBundle$BundleReference
-sun/text/resources/FormatData_en
-sun/text/resources/FormatData_en_US
-java/text/DecimalFormatSymbols
-java/text/spi/DecimalFormatSymbolsProvider
-java/util/Currency
-java/util/Currency$1
-java/util/CurrencyData
-java/util/spi/CurrencyNameProvider
-sun/util/resources/CurrencyNames
-sun/util/resources/LocaleNamesBundle
-sun/util/resources/OpenListResourceBundle
-sun/util/resources/CurrencyNames_en_US
-java/text/DecimalFormat
-java/text/FieldPosition
-java/text/DigitList
-java/math/RoundingMode
-java/util/regex/Pattern$GroupTail
-java/util/regex/Pattern$Ctype
-java/util/regex/Pattern$Ques
-java/util/regex/Pattern$GroupCurly
-java/util/regex/Pattern$5
-java/util/regex/Pattern$Loop
-java/util/regex/Pattern$Prolog
-java/util/regex/Pattern$9
-java/util/regex/Pattern$BranchConn
-java/util/regex/Pattern$Branch
-java/nio/channels/spi/AbstractInterruptibleChannel$1
-sun/nio/ch/Interruptible
-sun/nio/ch/NativeThread
-sun/nio/ch/DirectBuffer
-java/nio/DirectByteBuffer
-java/nio/DirectByteBuffer$Deallocator
-sun/misc/Cleaner
-sun/nio/ch/IOStatus
-java/util/regex/ASCII
-java/io/DataInputStream
-java/io/DataInput
-java/lang/Short$ShortCache
-java/util/HashMap$KeyIterator
-sun/font/CompositeFontDescriptor
-sun/font/Font2DHandle
-sun/font/FontFamily
-java/awt/GraphicsDevice
-sun/awt/X11GraphicsDevice
-sun/awt/X11GraphicsConfig
-java/awt/GraphicsConfiguration
-java/awt/ImageCapabilities
-sun/java2d/x11/X11SurfaceData
-sun/java2d/SurfaceData
-java/awt/Transparency
-sun/java2d/DisposerTarget
-sun/java2d/InvalidPipeException
-java/lang/IllegalStateException
-sun/java2d/NullSurfaceData
-sun/java2d/loops/SurfaceType
-sun/awt/image/PixelConverter
-sun/awt/image/PixelConverter$Xrgb
-sun/awt/image/PixelConverter$Argb
-sun/awt/image/PixelConverter$ArgbPre
-sun/awt/image/PixelConverter$Xbgr
-sun/awt/image/PixelConverter$Rgba
-sun/awt/image/PixelConverter$RgbaPre
-sun/awt/image/PixelConverter$Ushort565Rgb
-sun/awt/image/PixelConverter$Ushort555Rgb
-sun/awt/image/PixelConverter$Ushort555Rgbx
-sun/awt/image/PixelConverter$Ushort4444Argb
-sun/awt/image/PixelConverter$ByteGray
-sun/awt/image/PixelConverter$UshortGray
-sun/awt/image/PixelConverter$Rgbx
-sun/awt/image/PixelConverter$Bgrx
-sun/awt/image/PixelConverter$ArgbBm
-java/awt/image/ColorModel
-java/awt/image/DirectColorModel
-java/awt/image/PackedColorModel
-java/awt/color/ColorSpace
-java/awt/color/ICC_Profile
-sun/awt/color/ProfileDeferralInfo
-sun/awt/color/ProfileDeferralMgr
-java/awt/color/ICC_ProfileRGB
-java/awt/color/ICC_Profile$1
-sun/awt/color/ProfileActivator
-java/awt/color/ICC_ColorSpace
-sun/java2d/pipe/NullPipe
-sun/java2d/pipe/PixelDrawPipe
-sun/java2d/pipe/PixelFillPipe
-sun/java2d/pipe/ShapeDrawPipe
-sun/java2d/pipe/TextPipe
-sun/java2d/pipe/DrawImagePipe
-java/awt/image/IndexColorModel
-sun/java2d/pipe/LoopPipe
-sun/java2d/pipe/OutlineTextRenderer
-sun/java2d/pipe/SolidTextRenderer
-sun/java2d/pipe/GlyphListLoopPipe
-sun/java2d/pipe/GlyphListPipe
-sun/java2d/pipe/AATextRenderer
-sun/java2d/pipe/LCDTextRenderer
-sun/java2d/pipe/AlphaColorPipe
-sun/java2d/pipe/CompositePipe
-sun/java2d/pipe/PixelToShapeConverter
-sun/java2d/pipe/TextRenderer
-sun/java2d/pipe/SpanClipRenderer
-sun/java2d/pipe/Region
-sun/java2d/pipe/RegionIterator
-sun/java2d/pipe/DuctusShapeRenderer
-sun/java2d/pipe/DuctusRenderer
-sun/java2d/pipe/AlphaPaintPipe
-sun/java2d/pipe/SpanShapeRenderer$Composite
-sun/java2d/pipe/SpanShapeRenderer
-sun/java2d/pipe/GeneralCompositePipe
-sun/java2d/pipe/DrawImage
-sun/java2d/loops/RenderCache
-sun/java2d/loops/RenderCache$Entry
-sun/java2d/loops/XORComposite
-java/awt/Composite
-sun/font/X11TextRenderer
-sun/java2d/loops/GraphicsPrimitive
-sun/java2d/x11/X11PMBlitLoops
-sun/java2d/loops/Blit
-sun/java2d/loops/GraphicsPrimitiveMgr
-sun/java2d/loops/CompositeType
-sun/java2d/SunGraphics2D
-sun/awt/ConstrainableGraphics
-java/awt/Graphics2D
-java/awt/Graphics
-java/awt/Color
-java/awt/Paint
-java/awt/AlphaComposite
-sun/java2d/loops/BlitBg
-sun/java2d/loops/ScaledBlit
-sun/java2d/loops/FillRect
-sun/java2d/loops/FillSpans
-sun/java2d/loops/DrawLine
-sun/java2d/loops/DrawRect
-sun/java2d/loops/DrawPolygons
-sun/java2d/loops/DrawPath
-sun/java2d/loops/FillPath
-sun/java2d/loops/MaskBlit
-sun/java2d/loops/MaskFill
-sun/java2d/loops/DrawGlyphList
-sun/java2d/loops/DrawGlyphListAA
-sun/java2d/loops/DrawGlyphListLCD
-sun/java2d/loops/TransformHelper
-java/awt/BasicStroke
-java/awt/Stroke
-sun/misc/PerformanceLogger
-sun/misc/PerformanceLogger$TimeData
-sun/java2d/pipe/ValidatePipe
-sun/java2d/loops/CustomComponent
-sun/java2d/loops/GraphicsPrimitiveProxy
-sun/java2d/loops/GeneralRenderer
-sun/java2d/loops/GraphicsPrimitiveMgr$1
-sun/java2d/loops/GraphicsPrimitiveMgr$2
-sun/java2d/x11/X11PMBlitLoops$DelegateBlitLoop
-sun/java2d/x11/X11PMBlitBgLoops
-sun/java2d/x11/X11SurfaceData$LazyPipe
-sun/awt/X11GraphicsConfig$X11GCDisposerRecord
-sun/java2d/DisposerRecord
-java/awt/BorderLayout
-java/awt/LayoutManager2
-java/awt/Rectangle
-java/awt/Toolkit$2
-sun/awt/X11/XToolkit
-sun/awt/X11/XConstants
-sun/awt/UNIXToolkit
-java/util/TreeMap
-java/util/NavigableMap
-java/util/SortedMap
-sun/awt/X11/XlibWrapper
-sun/awt/X11/XUtilConstants
-sun/awt/X11/XProtocolConstants
-sun/awt/X11/XCursorFontConstants
-sun/awt/X11/XlibWrapper$1
-sun/awt/X11/XToolkit$4
-sun/awt/X11/XModifierKeymap
-sun/awt/X11/XWrapperBase
-sun/awt/X11/Native
-sun/awt/X11/Native$1
-java/awt/EventQueue
-sun/awt/X11/XToolkit$7
-java/util/EmptyStackException
-java/lang/reflect/InvocationTargetException
-java/awt/EventDispatchThread
-java/awt/event/PaintEvent
-java/awt/event/MouseEvent
-sun/awt/PeerEvent
-java/awt/event/InvocationEvent
-java/awt/ActiveEvent
-java/awt/EventQueueItem
-sun/awt/X11/XToolkit$1
-sun/awt/X11/XToolkit$XErrorHandler
-sun/awt/X11/XToolkit$5
-sun/awt/X11/XEventDispatcher
-sun/awt/SunToolkit$ModalityListenerList
-sun/awt/ModalityListener
-sun/awt/SunToolkit$1
-java/util/MissingResourceException
-java/awt/Queue
-sun/awt/PostEventQueue
-java/util/LinkedList
-java/util/Deque
-java/util/Queue
-java/util/AbstractSequentialList
-java/util/LinkedList$Entry
-sun/awt/X11/AwtScreenData
-sun/awt/X11/XWM
-sun/awt/X11/MWMConstants
-sun/awt/X11/XAtom
-java/awt/Insets
-sun/awt/X11/XWM$1
-sun/awt/X11/XWM$2
-sun/awt/X11/XSetWindowAttributes
-sun/awt/X11/XErrorEvent
-sun/awt/X11/XNETProtocol
-sun/awt/X11/XStateProtocol
-sun/awt/X11/XLayerProtocol
-sun/awt/X11/XProtocol
-sun/awt/X11/XProtocol$1
-sun/awt/X11/WindowPropertyGetter
-sun/awt/X11/UnsafeXDisposerRecord
-sun/awt/X11/XPropertyCache
-sun/awt/X11/XWINProtocol
-sun/awt/X11/XAtomList
-sun/awt/X11/XToolkit$3
-sun/awt/X11/XAnyEvent
-sun/awt/X11/IXAnyEvent
-java/awt/Window$WindowDisposerRecord
-java/awt/KeyboardFocusManager
-java/awt/KeyEventDispatcher
-java/awt/KeyEventPostProcessor
-java/awt/AWTKeyStroke
-java/awt/AWTKeyStroke$1
-java/awt/DefaultKeyboardFocusManager
-java/awt/DefaultFocusTraversalPolicy
-java/awt/ContainerOrderFocusTraversalPolicy
-java/awt/FocusTraversalPolicy
-java/awt/MutableBoolean
-java/util/Collections$UnmodifiableSet
-sun/awt/HeadlessToolkit
-sun/awt/X11/XKeyboardFocusManagerPeer
-java/awt/peer/KeyboardFocusManagerPeer
-sun/awt/X11/XKeyboardFocusManagerPeer$1
-sun/awt/X11/XFramePeer
-java/awt/peer/FramePeer
-java/awt/peer/WindowPeer
-java/awt/peer/ContainerPeer
-java/awt/peer/ComponentPeer
-sun/awt/X11/XDecoratedPeer
-sun/awt/X11/XWindowPeer
-sun/awt/X11/XPanelPeer
-java/awt/peer/PanelPeer
-sun/awt/X11/XCanvasPeer
-java/awt/peer/CanvasPeer
-sun/awt/X11/XComponentPeer
-java/awt/dnd/peer/DropTargetPeer
-sun/awt/X11/XWindow
-sun/awt/X11ComponentPeer
-sun/awt/X11/XBaseWindow
-sun/awt/X11/XCreateWindowParams
-java/lang/Long$LongCache
-sun/awt/X11/XBaseWindow$InitialiseState
-sun/awt/X11/XBaseWindow$StateLock
-sun/awt/X11/AwtGraphicsConfigData
-sun/awt/X11/XVisualInfo
-java/awt/SystemColor
-sun/awt/X11/MotifColorUtilities
-java/lang/StrictMath
-sun/awt/X11/XRepaintArea
-sun/awt/RepaintArea
-sun/awt/X11/XWindowAttributesData
-java/util/concurrent/locks/LockSupport
-sun/awt/X11/WindowDimensions
-java/awt/Point
-java/util/TreeMap$Entry
-sun/nio/cs/UTF_8
-sun/nio/cs/Unicode
-sun/nio/cs/UTF_8$Encoder
-sun/nio/cs/UTF_8$Decoder
-sun/nio/cs/Surrogate$Generator
-sun/awt/X11/XPropertyEvent
-sun/awt/X11/XDropTargetEventProcessor
-sun/awt/X11/XDragSourceContextPeer
-sun/awt/X11/XDragSourceProtocolListener
-sun/awt/dnd/SunDragSourceContextPeer
-java/awt/dnd/peer/DragSourceContextPeer
-sun/awt/X11/XAwtState
-sun/awt/X11/XBaseWindow$1
-sun/awt/X11/XRootWindow
-sun/nio/cs/ISO_8859_1
-sun/nio/cs/ISO_8859_1$Encoder
-sun/nio/cs/ISO_8859_1$Decoder
-sun/java2d/x11/X11SurfaceData$X11WindowSurfaceData
-sun/java2d/loops/RenderLoops
-sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec
-sun/java2d/DefaultDisposerRecord
-sun/java2d/x11/X11Renderer
-sun/awt/X11/XGlobalCursorManager
-sun/awt/GlobalCursorManager
-sun/awt/X11/XToolkit$6
-java/awt/Cursor$CursorDisposer
-java/awt/AWTException
-java/awt/HeadlessException
-java/lang/UnsupportedOperationException
-sun/reflect/UnsafeLongFieldAccessorImpl
-sun/reflect/UnsafeIntegerFieldAccessorImpl
-sun/awt/X11/XClientMessageEvent
-sun/awt/X11/XIconInfo
-sun/awt/X11/XAWTIcon32_java_icon16_png
-sun/awt/X11/XAWTIcon32_java_icon24_png
-sun/awt/X11/XAWTIcon32_java_icon32_png
-sun/awt/X11/XAWTIcon32_java_icon48_png
-sun/awt/X11/XSizeHints
-sun/awt/X11/XContentWindow
-sun/awt/X11/XFocusProxyWindow
-sun/awt/X11/XWMHints
-java/util/LinkedList$ListItr
-java/util/ListIterator
-sun/awt/SunToolkit$2
-java/awt/image/BufferStrategy
-java/awt/dnd/DropTarget
-java/awt/dnd/DropTargetListener
-java/awt/event/ComponentListener
-java/awt/event/FocusListener
-java/awt/event/HierarchyListener
-java/awt/event/HierarchyBoundsListener
-java/awt/event/KeyListener
-java/awt/event/MouseListener
-java/awt/event/MouseMotionListener
-java/awt/event/MouseWheelListener
-java/awt/event/InputMethodListener
-java/awt/Component$NativeInLightFixer
-java/awt/event/ContainerListener
-javax/accessibility/AccessibleContext
-sun/reflect/UnsafeObjectFieldAccessorImpl
-java/awt/peer/LightweightPeer
-sun/awt/X11/XLabelPeer
-java/awt/peer/LabelPeer
-sun/awt/X11/XMapEvent
-sun/awt/X11/XQueryTree
-sun/awt/X11/XConfigureEvent
-sun/awt/X11/PropMwmHints
-sun/awt/GlobalCursorManager$NativeUpdater
-javax/swing/JFrame
-javax/swing/WindowConstants
-javax/swing/RootPaneContainer
-javax/swing/TransferHandler$HasGetTransferHandler
-javax/swing/JLabel
-javax/swing/SwingConstants
-javax/swing/JComponent
-javax/swing/JComponent$1
-javax/swing/SwingUtilities
-javax/swing/JRootPane
-sun/security/action/GetBooleanAction
-javax/swing/event/EventListenerList
-javax/swing/JPanel
-java/awt/FlowLayout
-javax/swing/UIManager
-javax/swing/UIManager$LookAndFeelInfo
-sun/swing/SwingUtilities2
-sun/swing/SwingUtilities2$LSBCacheEntry
-javax/swing/UIManager$LAFState
-javax/swing/UIDefaults
-javax/swing/MultiUIDefaults
-javax/swing/UIManager$1
-javax/swing/plaf/metal/MetalLookAndFeel
-javax/swing/plaf/basic/BasicLookAndFeel
-javax/swing/LookAndFeel
-sun/swing/DefaultLookup
-javax/swing/plaf/metal/OceanTheme
-javax/swing/plaf/metal/DefaultMetalTheme
-javax/swing/plaf/metal/MetalTheme
-javax/swing/plaf/ColorUIResource
-javax/swing/plaf/UIResource
-sun/swing/PrintColorUIResource
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate
-javax/swing/plaf/FontUIResource
-sun/swing/SwingLazyValue
-javax/swing/UIDefaults$LazyValue
-javax/swing/UIDefaults$ActiveValue
-javax/swing/plaf/InsetsUIResource
-sun/swing/SwingUtilities2$2
-javax/swing/plaf/basic/BasicLookAndFeel$2
-javax/swing/plaf/DimensionUIResource
-javax/swing/UIDefaults$LazyInputMap
-java/lang/Character$CharacterCache
-javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue
-javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue
-java/awt/print/PrinterJob
-sun/swing/SwingUtilities2$AATextInfo
-sun/awt/X11/XAWTXSettings
-sun/awt/X11/XMSelectionListener
-sun/awt/XSettings
-sun/awt/X11/XMSelection
-sun/awt/X11/XMSelection$1
-javax/swing/plaf/metal/MetalLookAndFeel$AATextListener
-java/beans/PropertyChangeListener
-java/beans/PropertyChangeListenerProxy
-java/util/EventListenerProxy
-sun/awt/EventListenerAggregate
-javax/swing/UIDefaults$ProxyLazyValue
-javax/swing/plaf/metal/OceanTheme$1
-javax/swing/plaf/metal/OceanTheme$2
-javax/swing/plaf/metal/OceanTheme$3
-javax/swing/plaf/metal/OceanTheme$4
-javax/swing/plaf/metal/OceanTheme$5
-javax/swing/plaf/metal/OceanTheme$6
-javax/swing/RepaintManager
-javax/swing/RepaintManager$DisplayChangedHandler
-javax/swing/SwingPaintEventDispatcher
-sun/awt/PaintEventDispatcher
-javax/swing/UIManager$2
-javax/swing/UIManager$3
-java/awt/PopupMenu
-java/awt/Menu
-java/awt/MenuItem
-java/awt/MenuComponent
-java/io/ObjectOutputStream
-java/io/ObjectOutput
-java/io/DataOutput
-java/io/ObjectStreamConstants
-java/io/PrintWriter
-java/io/ObjectInputStream
-java/io/ObjectInput
-java/awt/Event
-java/awt/im/InputContext
-java/awt/event/MouseWheelEvent
-java/awt/BufferCapabilities
-sun/awt/CausedFocusEvent$Cause
-java/awt/PointerInfo
-java/awt/Component$BaselineResizeBehavior
-java/awt/FontMetrics
-java/awt/Image
-java/awt/image/ImageProducer
-java/awt/image/VolatileImage
-java/awt/im/InputMethodRequests
-java/awt/event/FocusEvent
-java/awt/event/InputMethodEvent
-java/awt/event/HierarchyEvent
-javax/accessibility/AccessibleStateSet
-com/sun/swing/internal/plaf/metal/resources/metal
-sun/util/ResourceBundleEnumeration
-com/sun/swing/internal/plaf/basic/resources/basic
-javax/swing/plaf/basic/BasicPanelUI
-javax/swing/plaf/PanelUI
-javax/swing/plaf/ComponentUI
-sun/reflect/misc/MethodUtil
-sun/reflect/misc/MethodUtil$1
-java/util/jar/JarFile
-java/util/zip/ZipFile
-java/util/zip/ZipConstants
-java/util/jar/JavaUtilJarAccessImpl
-sun/misc/JavaUtilJarAccess
-sun/misc/JarIndex
-java/util/zip/ZipEntry
-java/util/jar/JarFile$JarFileEntry
-java/util/jar/JarEntry
-sun/misc/URLClassPath$JarLoader$2
-sun/net/www/protocol/jar/JarURLConnection
-java/net/JarURLConnection
-sun/net/www/protocol/jar/JarFileFactory
-sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController
-java/net/HttpURLConnection
-sun/net/www/protocol/jar/URLJarFile
-sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry
-sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream
-java/util/zip/ZipFile$ZipFileInputStream
-java/security/AllPermissionCollection
-java/lang/IllegalAccessException
-javax/swing/JPasswordField
-javax/swing/JTextField
-javax/swing/text/JTextComponent
-javax/swing/Scrollable
-javax/swing/JLayeredPane
-javax/swing/JRootPane$1
-javax/swing/ArrayTable
-javax/swing/JInternalFrame
-javax/swing/JRootPane$RootLayout
-javax/swing/BufferStrategyPaintManager
-javax/swing/RepaintManager$PaintManager
-javax/swing/plaf/metal/MetalRootPaneUI
-javax/swing/plaf/basic/BasicRootPaneUI
-javax/swing/plaf/RootPaneUI
-javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap
-javax/swing/plaf/ComponentInputMapUIResource
-javax/swing/ComponentInputMap
-javax/swing/InputMap
-javax/swing/plaf/InputMapUIResource
-javax/swing/KeyStroke
-java/awt/VKCollection
-sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl
-javax/swing/plaf/basic/LazyActionMap
-javax/swing/plaf/ActionMapUIResource
-javax/swing/ActionMap
-javax/swing/LayoutFocusTraversalPolicy
-javax/swing/SortingFocusTraversalPolicy
-javax/swing/InternalFrameFocusTraversalPolicy
-javax/swing/SwingContainerOrderFocusTraversalPolicy
-javax/swing/SwingDefaultFocusTraversalPolicy
-javax/swing/LayoutComparator
-javax/swing/plaf/metal/MetalLabelUI
-javax/swing/plaf/basic/BasicLabelUI
-javax/swing/plaf/LabelUI
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1
-javax/swing/plaf/basic/BasicHTML
-javax/swing/SystemEventQueueUtilities
-javax/swing/SystemEventQueueUtilities$SystemEventQueue
-sun/awt/NullComponentPeer
-java/awt/event/WindowEvent
-java/awt/EventQueue$1
-java/awt/EventDispatchThread$1
-java/awt/Conditional
-java/awt/EventDispatchThread$HierarchyEventFilter
-java/awt/EventFilter$FilterAction
-sun/awt/dnd/SunDropTargetEvent
-java/awt/event/ActionEvent
-java/util/jar/Manifest
-java/io/ByteArrayInputStream
-java/util/jar/Attributes
-java/util/jar/Manifest$FastInputStream
-java/util/jar/Attributes$Name
-sun/misc/ASCIICaseInsensitiveComparator
-java/util/jar/JarVerifier
-java/io/ByteArrayOutputStream
-sun/misc/ExtensionDependency
-java/lang/Package
-sun/security/util/ManifestEntryVerifier
-sun/security/provider/Sun
-java/security/Provider
-java/security/Provider$ServiceKey
-java/security/Provider$EngineDescription
-sun/security/provider/Sun$1
-java/security/Security
-java/security/Security$1
-sun/misc/FloatingDecimal
-sun/misc/FloatingDecimal$1
-sun/security/provider/NativePRNG
-java/security/SecureRandomSpi
-sun/security/provider/NativePRNG$1
-sun/security/provider/NativePRNG$RandomIO
-sun/misc/BASE64Decoder
-sun/misc/CharacterDecoder
-sun/security/util/SignatureFileVerifier
-java/awt/event/KeyAdapter
-java/lang/NumberFormatException
-java/lang/IllegalArgumentException
-java/io/FileWriter
-java/net/Authenticator
-java/net/MalformedURLException
-javax/swing/text/Element
-javax/swing/text/Document
-javax/swing/text/PlainDocument
-javax/swing/text/AbstractDocument
-javax/swing/text/GapContent
-javax/swing/text/AbstractDocument$Content
-javax/swing/text/GapVector
-javax/swing/text/GapContent$MarkVector
-javax/swing/text/GapContent$MarkData
-javax/swing/text/StyleContext
-javax/swing/text/AbstractDocument$AttributeContext
-javax/swing/text/StyleConstants
-javax/swing/text/StyleConstants$CharacterConstants
-javax/swing/text/AttributeSet$CharacterAttribute
-javax/swing/text/StyleConstants$FontConstants
-javax/swing/text/AttributeSet$FontAttribute
-javax/swing/text/StyleConstants$ColorConstants
-javax/swing/text/AttributeSet$ColorAttribute
-javax/swing/text/StyleConstants$ParagraphConstants
-javax/swing/text/AttributeSet$ParagraphAttribute
-javax/swing/text/StyleContext$FontKey
-javax/swing/text/SimpleAttributeSet
-javax/swing/text/MutableAttributeSet
-javax/swing/text/AttributeSet
-javax/swing/text/SimpleAttributeSet$EmptyAttributeSet
-javax/swing/text/StyleContext$NamedStyle
-javax/swing/text/Style
-javax/swing/text/SimpleAttributeSet$1
-javax/swing/text/StyleContext$SmallAttributeSet
-javax/swing/text/AbstractDocument$BidiRootElement
-javax/swing/text/AbstractDocument$BranchElement
-javax/swing/text/AbstractDocument$AbstractElement
-javax/swing/tree/TreeNode
-javax/swing/text/AbstractDocument$1
-javax/swing/text/AbstractDocument$BidiElement
-javax/swing/text/AbstractDocument$LeafElement
-javax/swing/text/GapContent$StickyPosition
-javax/swing/text/Position
-javax/swing/text/StyleContext$KeyEnumeration
-javax/swing/text/GapContent$InsertUndo
-javax/swing/undo/AbstractUndoableEdit
-javax/swing/undo/UndoableEdit
-javax/swing/text/AbstractDocument$DefaultDocumentEvent
-javax/swing/event/DocumentEvent
-javax/swing/undo/CompoundEdit
-javax/swing/event/DocumentEvent$EventType
-javax/swing/text/Segment
-java/text/CharacterIterator
-javax/swing/text/Utilities
-javax/swing/text/SegmentCache
-javax/swing/text/SegmentCache$CachedSegment
-javax/swing/event/UndoableEditEvent
-javax/swing/text/AbstractDocument$ElementEdit
-javax/swing/event/DocumentEvent$ElementChange
-java/net/Socket
-java/net/InetAddress
-java/net/InetAddress$Cache
-java/net/InetAddress$Cache$Type
-java/net/InetAddressImplFactory
-java/net/Inet4AddressImpl
-java/net/InetAddressImpl
-java/net/InetAddress$1
-sun/net/spi/nameservice/NameService
-sun/net/util/IPAddressUtil
-java/util/RandomAccessSubList
-java/util/SubList
-java/util/SubList$1
-java/util/AbstractList$ListItr
-java/net/Inet4Address
-java/net/InetSocketAddress
-java/net/SocketAddress
-java/net/SocksSocketImpl
-java/net/SocksConsts
-java/net/PlainSocketImpl
-java/net/SocketImpl
-java/net/SocketOptions
-java/net/SocketException
-java/net/SocksSocketImpl$5
-java/net/ProxySelector
-sun/net/spi/DefaultProxySelector
-sun/net/spi/DefaultProxySelector$1
-sun/net/NetProperties
-sun/net/NetProperties$1
-sun/net/spi/DefaultProxySelector$NonProxyInfo
-java/net/Inet6Address
-java/net/URI
-java/net/URI$Parser
-java/net/Proxy
-java/net/Proxy$Type
-java/net/ConnectException
-javax/swing/JMenu
-javax/swing/MenuElement
-javax/swing/JMenuItem
-javax/swing/AbstractButton
-java/awt/ItemSelectable
-javax/swing/event/MenuListener
-javax/swing/JCheckBoxMenuItem
-javax/swing/Icon
-javax/swing/JButton
-java/awt/event/WindowListener
-java/net/URLClassLoader$2
-javax/swing/ImageIcon
-javax/swing/ImageIcon$1
-java/awt/MediaTracker
-sun/misc/SoftCache$ValueCell
-sun/awt/image/URLImageSource
-sun/awt/image/InputStreamImageSource
-sun/awt/image/ImageFetchable
-sun/awt/image/ToolkitImage
-java/awt/Image$1
-sun/awt/image/SurfaceManager$ImageAccessor
-sun/awt/image/SurfaceManager
-sun/awt/image/NativeLibLoader
-java/awt/ImageMediaEntry
-java/awt/MediaEntry
-sun/awt/image/ImageRepresentation
-java/awt/image/ImageConsumer
-sun/awt/image/ImageWatched
-sun/awt/image/ImageWatched$Link
-sun/awt/image/ImageWatched$WeakLink
-sun/awt/image/ImageConsumerQueue
-sun/awt/image/ImageFetcher
-sun/awt/image/FetcherInfo
-sun/awt/image/ImageFetcher$1
-sun/awt/image/GifImageDecoder
-sun/awt/image/ImageDecoder
-sun/awt/image/GifFrame
-java/awt/image/Raster
-java/awt/image/DataBufferByte
-java/awt/image/DataBuffer
-java/awt/image/PixelInterleavedSampleModel
-java/awt/image/ComponentSampleModel
-java/awt/image/SampleModel
-sun/awt/image/ByteInterleavedRaster
-sun/awt/image/ByteComponentRaster
-sun/awt/image/SunWritableRaster
-java/awt/image/WritableRaster
-java/awt/image/BufferedImage
-java/awt/image/WritableRenderedImage
-java/awt/image/RenderedImage
-sun/awt/image/IntegerComponentRaster
-sun/awt/image/BytePackedRaster
-java/awt/Canvas
-sun/font/FontDesignMetrics
-sun/font/FontStrikeDesc
-sun/font/CompositeStrike
-sun/font/FontStrikeDisposer
-sun/font/StrikeCache$SoftDisposerRef
-sun/font/StrikeCache$DisposableStrike
-sun/font/TrueTypeFont$TTDisposerRecord
-sun/font/TrueTypeFont$1
-java/io/RandomAccessFile
-java/nio/ByteBufferAsIntBufferB
-java/nio/IntBuffer
-sun/font/TrueTypeFont$DirectoryEntry
-java/nio/ByteBufferAsShortBufferB
-java/nio/ShortBuffer
-sun/nio/cs/UTF_16
-sun/nio/cs/UTF_16$Decoder
-sun/nio/cs/UnicodeDecoder
-sun/font/FileFontStrike
-sun/font/FileFont$FileFontDisposer
-sun/font/TrueTypeGlyphMapper
-sun/font/CMap
-sun/font/CMap$NullCMapClass
-sun/font/CMap$CMapFormat4
-java/nio/ByteBufferAsCharBufferB
-sun/font/FontDesignMetrics$KeyReference
-sun/awt/image/PNGImageDecoder
-sun/awt/image/PNGFilterInputStream
-java/util/zip/InflaterInputStream
-java/util/zip/Inflater
-sun/awt/EventQueueItem
-sun/awt/SunToolkit$3
-sun/awt/X11/XExposeEvent
-sun/awt/X11/ComponentAccessor
-sun/awt/X11/ComponentAccessor$1
-sun/reflect/UnsafeBooleanFieldAccessorImpl
-sun/awt/event/IgnorePaintEvent
-java/awt/image/DataBufferInt
-java/awt/image/SinglePixelPackedSampleModel
-sun/awt/image/IntegerInterleavedRaster
-sun/java2d/x11/X11RemoteOffScreenImage
-sun/awt/image/RemoteOffScreenImage
-sun/awt/image/OffScreenImage
-sun/java2d/x11/X11RemoteOffScreenImage$X11RemoteSurfaceManager
-sun/awt/image/OffScreenSurfaceManager
-sun/awt/image/CachingSurfaceManager
-sun/awt/image/RasterListener
-sun/awt/image/BufImgSurfaceData
-sun/java2d/opengl/GLXGraphicsConfig
-sun/java2d/opengl/OGLGraphicsConfig
-sun/java2d/x11/X11SurfaceData$X11PixmapSurfaceData
-sun/awt/image/WritableRasterNative
-sun/awt/image/DataBufferNative
-sun/java2d/SurfaceManagerFactory
-sun/java2d/x11/X11CachingSurfaceManager
-sun/java2d/opengl/GLXSurfaceData
-sun/java2d/opengl/OGLSurfaceData
-sun/font/CompositeGlyphMapper
-sun/java2d/loops/FontInfo
-java/util/Date
-sun/util/calendar/CalendarSystem
-sun/util/calendar/Gregorian
-sun/util/calendar/BaseCalendar
-sun/util/calendar/AbstractCalendar
-java/util/TimeZone
-java/lang/InheritableThreadLocal
-sun/util/calendar/ZoneInfo
-sun/util/calendar/ZoneInfoFile
-sun/util/calendar/ZoneInfoFile$1
-java/util/TimeZone$1
-sun/util/calendar/Gregorian$Date
-sun/util/calendar/BaseCalendar$Date
-sun/util/calendar/CalendarDate
-sun/util/calendar/CalendarUtils
-java/util/TimeZone$DisplayNames
-sun/util/TimeZoneNameUtility
-sun/util/resources/TimeZoneNames
-sun/util/resources/TimeZoneNamesBundle
-sun/util/resources/TimeZoneNames_en
-java/util/spi/TimeZoneNameProvider
-java/lang/ProcessBuilder
-java/lang/ProcessImpl
-java/lang/UNIXProcess
-java/lang/Process
-java/lang/UNIXProcess$Gate
-java/lang/UNIXProcess$1
-java/lang/UNIXProcess$1$1
-java/lang/UNIXProcess$1$1$1
-java/net/ServerSocket
-java/util/Random
-java/util/concurrent/atomic/AtomicLong
-java/lang/InternalError
-java/io/StringReader
-java/lang/SecurityException
-java/io/FilterReader
-java/lang/reflect/Proxy
-java/lang/reflect/InvocationHandler
-java/lang/NoSuchFieldException
-java/lang/InstantiationException
-java/lang/ArrayIndexOutOfBoundsException
-java/lang/IndexOutOfBoundsException
-javax/swing/JDialog
-sun/awt/X11/XClipboard
-sun/awt/datatransfer/SunClipboard
-java/awt/datatransfer/Clipboard
-java/awt/datatransfer/SystemFlavorMap
-java/awt/datatransfer/FlavorMap
-java/awt/datatransfer/FlavorTable
-java/awt/datatransfer/SystemFlavorMap$1
-sun/net/ProgressMonitor
-sun/net/DefaultProgressMeteringPolicy
-sun/net/ProgressMeteringPolicy
-java/awt/datatransfer/SystemFlavorMap$2
-java/awt/datatransfer/MimeType
-java/io/Externalizable
-java/awt/datatransfer/MimeTypeParameterList
-sun/awt/datatransfer/DataTransferer
-java/util/Collections$SynchronizedSet
-java/util/Collections$SynchronizedCollection
-java/awt/datatransfer/DataFlavor
-java/awt/datatransfer/DataFlavor$1
-sun/awt/datatransfer/DataTransferer$CharsetComparator
-sun/awt/datatransfer/DataTransferer$IndexedComparator
-sun/nio/cs/UTF_16LE
-sun/nio/cs/UTF_16BE
-sun/awt/datatransfer/DataTransferer$DataFlavorComparator
-java/rmi/Remote
-sun/awt/datatransfer/DataTransferer$1
-sun/awt/X11/XDataTransferer
-sun/awt/datatransfer/ToolkitThreadBlockedHandler
-javax/imageio/ImageTypeSpecifier
-sun/awt/X11/XSelection
-sun/security/action/GetIntegerAction
-sun/awt/X11/XSelection$IncrementalTransferHandler
-sun/awt/X11/XSelection$SelectionEventHandler
-java/awt/datatransfer/Transferable
-java/io/EOFException
-java/util/Vector$1
-java/util/zip/ZipFile$1
-java/util/zip/ZipFile$2
-java/util/jar/JarFile$1
-java/util/PropertyResourceBundle
-java/util/ResourceBundle$Control$1
-java/util/Hashtable$EntrySet
-java/lang/IllegalAccessError
-java/text/MessageFormat
-java/text/MessageFormat$Field
-java/text/Format$Field
-java/lang/CloneNotSupportedException
-sun/reflect/MethodAccessorGenerator
-sun/reflect/AccessorGenerator
-sun/reflect/ClassFileConstants
-java/lang/Void
-sun/reflect/ByteVectorFactory
-sun/reflect/ByteVectorImpl
-sun/reflect/ByteVector
-sun/reflect/ClassFileAssembler
-sun/reflect/UTF8
-sun/reflect/Label
-sun/reflect/Label$PatchInfo
-sun/reflect/MethodAccessorGenerator$1
-sun/reflect/ClassDefiner
-sun/reflect/ClassDefiner$1
-sun/reflect/BootstrapConstructorAccessorImpl
-java/awt/event/ActionListener
-javax/swing/Timer
-javax/swing/Timer$DoPostEvent
-javax/swing/TimerQueue
-javax/swing/TimerQueue$1
-javax/swing/ToolTipManager
-java/awt/event/MouseAdapter
-javax/swing/ToolTipManager$insideTimerAction
-javax/swing/ToolTipManager$outsideTimerAction
-javax/swing/ToolTipManager$stillInsideTimerAction
-javax/swing/ToolTipManager$Actions
-sun/swing/UIAction
-javax/swing/Action
-javax/swing/ToolTipManager$MoveBeforeEnterListener
-java/awt/event/MouseMotionAdapter
-java/util/Hashtable$ValueCollection
-javax/swing/event/CaretListener
-javax/swing/JToolBar
-javax/swing/JSplitPane
-javax/swing/border/Border
-javax/swing/JToggleButton
-javax/swing/border/EmptyBorder
-javax/swing/border/AbstractBorder
-javax/swing/DefaultButtonModel
-javax/swing/ButtonModel
-javax/swing/AbstractButton$Handler
-javax/swing/event/ChangeListener
-java/awt/event/ItemListener
-javax/swing/plaf/metal/MetalButtonUI
-javax/swing/plaf/basic/BasicButtonUI
-javax/swing/plaf/ButtonUI
-javax/swing/plaf/metal/MetalBorders
-javax/swing/plaf/BorderUIResource$CompoundBorderUIResource
-javax/swing/border/CompoundBorder
-javax/swing/plaf/metal/MetalBorders$ButtonBorder
-javax/swing/plaf/basic/BasicBorders$MarginBorder
-javax/swing/plaf/basic/BasicButtonListener
-java/awt/AWTEventMulticaster
-java/awt/event/WindowFocusListener
-java/awt/event/WindowStateListener
-java/awt/event/AdjustmentListener
-java/awt/event/TextListener
-javax/swing/event/AncestorListener
-java/beans/VetoableChangeListener
-javax/swing/ButtonGroup
-javax/swing/JToggleButton$ToggleButtonModel
-javax/swing/plaf/metal/MetalToggleButtonUI
-javax/swing/plaf/basic/BasicToggleButtonUI
-javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder
-java/awt/CardLayout
-javax/swing/Box
-javax/swing/plaf/metal/MetalBorders$TextFieldBorder
-javax/swing/plaf/metal/MetalBorders$Flush3DBorder
-javax/swing/BoxLayout
-javax/swing/JMenuBar
-javax/swing/DefaultSingleSelectionModel
-javax/swing/SingleSelectionModel
-javax/swing/plaf/basic/BasicMenuBarUI
-javax/swing/plaf/MenuBarUI
-javax/swing/plaf/basic/DefaultMenuLayout
-javax/swing/plaf/metal/MetalBorders$MenuBarBorder
-javax/swing/plaf/basic/BasicMenuBarUI$Handler
-javax/swing/KeyboardManager
-javax/swing/event/MenuEvent
-javax/swing/JMenu$MenuChangeListener
-javax/swing/JMenuItem$MenuItemFocusListener
-javax/swing/plaf/basic/BasicMenuUI
-javax/swing/plaf/basic/BasicMenuItemUI
-javax/swing/plaf/MenuItemUI
-javax/swing/plaf/metal/MetalBorders$MenuItemBorder
-javax/swing/plaf/metal/MetalIconFactory
-javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon
-javax/swing/plaf/basic/BasicMenuUI$Handler
-javax/swing/event/MenuKeyListener
-javax/swing/plaf/basic/BasicMenuItemUI$Handler
-javax/swing/event/MenuDragMouseListener
-javax/swing/event/MouseInputListener
-javax/swing/event/ChangeEvent
-java/awt/event/ContainerEvent
-javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon
-javax/swing/JPopupMenu
-javax/swing/plaf/basic/BasicPopupMenuUI
-javax/swing/plaf/PopupMenuUI
-javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper
-java/awt/event/AWTEventListenerProxy
-java/awt/Toolkit$SelectiveAWTEventListener
-java/awt/Toolkit$ToolkitEventMulticaster
-javax/swing/plaf/basic/BasicLookAndFeel$1
-javax/swing/plaf/metal/MetalBorders$PopupMenuBorder
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener
-javax/swing/event/PopupMenuListener
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener
-javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber
-javax/swing/MenuSelectionManager
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1
-java/awt/event/FocusAdapter
-javax/swing/JMenu$WinListener
-java/awt/event/WindowAdapter
-javax/swing/JPopupMenu$Separator
-javax/swing/JSeparator
-javax/swing/plaf/metal/MetalPopupMenuSeparatorUI
-javax/swing/plaf/metal/MetalSeparatorUI
-javax/swing/plaf/basic/BasicSeparatorUI
-javax/swing/plaf/SeparatorUI
-javax/swing/JComboBox
-javax/swing/event/ListDataListener
-javax/swing/event/CaretEvent
-javax/swing/text/TabExpander
-javax/swing/JScrollBar
-java/awt/Adjustable
-javax/swing/event/MouseInputAdapter
-javax/swing/JScrollBar$ModelListener
-javax/swing/DefaultBoundedRangeModel
-javax/swing/BoundedRangeModel
-javax/swing/plaf/metal/MetalScrollBarUI
-javax/swing/plaf/basic/BasicScrollBarUI
-javax/swing/plaf/ScrollBarUI
-javax/swing/plaf/metal/MetalBumps
-javax/swing/plaf/metal/MetalScrollButton
-javax/swing/plaf/basic/BasicArrowButton
-javax/swing/plaf/basic/BasicScrollBarUI$TrackListener
-javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener
-javax/swing/plaf/basic/BasicScrollBarUI$ModelListener
-javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener
-javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicScrollBarUI$Handler
-javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener
-javax/swing/CellRendererPane
-java/util/HashMap$EntryIterator
-javax/swing/border/MatteBorder
-sun/font/StandardGlyphVector
-java/awt/font/GlyphVector
-sun/font/StandardGlyphVector$GlyphStrike
-sun/font/CoreMetrics
-sun/font/FontLineMetrics
-java/awt/font/LineMetrics
-javax/swing/ComboBoxModel
-javax/swing/ListModel
-javax/swing/ListCellRenderer
-javax/swing/DefaultComboBoxModel
-javax/swing/MutableComboBoxModel
-javax/swing/AbstractListModel
-javax/swing/JComboBox$1
-javax/swing/AncestorNotifier
-javax/swing/plaf/metal/MetalComboBoxUI
-javax/swing/plaf/basic/BasicComboBoxUI
-javax/swing/plaf/ComboBoxUI
-javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager
-javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager
-javax/swing/plaf/basic/BasicComboPopup
-javax/swing/plaf/basic/ComboPopup
-javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass
-javax/swing/border/LineBorder
-javax/swing/plaf/basic/BasicComboPopup$1
-javax/swing/JList
-javax/swing/DropMode
-javax/swing/DefaultListSelectionModel
-javax/swing/ListSelectionModel
-javax/swing/plaf/basic/BasicListUI
-javax/swing/plaf/ListUI
-javax/swing/plaf/basic/BasicListUI$ListTransferHandler
-javax/swing/TransferHandler
-javax/swing/TransferHandler$TransferAction
-javax/swing/DefaultListCellRenderer$UIResource
-javax/swing/DefaultListCellRenderer
-javax/swing/TransferHandler$SwingDropTarget
-java/awt/dnd/DropTargetContext
-javax/swing/TransferHandler$DropHandler
-javax/swing/TransferHandler$TransferSupport
-javax/swing/plaf/basic/BasicListUI$Handler
-javax/swing/event/ListSelectionListener
-javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag
-javax/swing/plaf/basic/BasicComboPopup$Handler
-javax/swing/JScrollPane
-javax/swing/ScrollPaneConstants
-javax/swing/ScrollPaneLayout$UIResource
-javax/swing/ScrollPaneLayout
-javax/swing/JViewport
-javax/swing/ViewportLayout
-javax/swing/plaf/basic/BasicViewportUI
-javax/swing/plaf/ViewportUI
-javax/swing/JScrollPane$ScrollBar
-javax/swing/JViewport$ViewListener
-java/awt/event/ComponentAdapter
-javax/swing/plaf/metal/MetalScrollPaneUI
-javax/swing/plaf/basic/BasicScrollPaneUI
-javax/swing/plaf/ScrollPaneUI
-javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder
-javax/swing/plaf/basic/BasicScrollPaneUI$Handler
-javax/swing/plaf/metal/MetalScrollPaneUI$1
-javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource
-javax/swing/plaf/basic/BasicComboBoxRenderer
-javax/swing/plaf/metal/MetalComboBoxEditor$UIResource
-javax/swing/plaf/metal/MetalComboBoxEditor
-javax/swing/plaf/basic/BasicComboBoxEditor
-javax/swing/ComboBoxEditor
-javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField
-javax/swing/JTextField$NotifyAction
-javax/swing/text/TextAction
-javax/swing/AbstractAction
-javax/swing/text/JTextComponent$MutableCaretEvent
-javax/swing/plaf/metal/MetalTextFieldUI
-javax/swing/plaf/basic/BasicTextFieldUI
-javax/swing/plaf/basic/BasicTextUI
-javax/swing/text/ViewFactory
-javax/swing/plaf/TextUI
-javax/swing/plaf/basic/BasicTextUI$BasicCursor
-javax/swing/text/DefaultEditorKit
-javax/swing/text/EditorKit
-javax/swing/text/DefaultEditorKit$InsertContentAction
-javax/swing/text/DefaultEditorKit$DeletePrevCharAction
-javax/swing/text/DefaultEditorKit$DeleteNextCharAction
-javax/swing/text/DefaultEditorKit$ReadOnlyAction
-javax/swing/text/DefaultEditorKit$DeleteWordAction
-javax/swing/text/DefaultEditorKit$WritableAction
-javax/swing/text/DefaultEditorKit$CutAction
-javax/swing/text/DefaultEditorKit$CopyAction
-javax/swing/text/DefaultEditorKit$PasteAction
-javax/swing/text/DefaultEditorKit$VerticalPageAction
-javax/swing/text/DefaultEditorKit$PageAction
-javax/swing/text/DefaultEditorKit$InsertBreakAction
-javax/swing/text/DefaultEditorKit$BeepAction
-javax/swing/text/DefaultEditorKit$NextVisualPositionAction
-javax/swing/text/DefaultEditorKit$BeginWordAction
-javax/swing/text/DefaultEditorKit$EndWordAction
-javax/swing/text/DefaultEditorKit$PreviousWordAction
-javax/swing/text/DefaultEditorKit$NextWordAction
-javax/swing/text/DefaultEditorKit$BeginLineAction
-javax/swing/text/DefaultEditorKit$EndLineAction
-javax/swing/text/DefaultEditorKit$BeginParagraphAction
-javax/swing/text/DefaultEditorKit$EndParagraphAction
-javax/swing/text/DefaultEditorKit$BeginAction
-javax/swing/text/DefaultEditorKit$EndAction
-javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction
-javax/swing/text/DefaultEditorKit$InsertTabAction
-javax/swing/text/DefaultEditorKit$SelectWordAction
-javax/swing/text/DefaultEditorKit$SelectLineAction
-javax/swing/text/DefaultEditorKit$SelectParagraphAction
-javax/swing/text/DefaultEditorKit$SelectAllAction
-javax/swing/text/DefaultEditorKit$UnselectAction
-javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction
-javax/swing/text/DefaultEditorKit$DumpModelAction
-javax/swing/plaf/basic/BasicTextUI$TextTransferHandler
-javax/swing/text/Position$Bias
-javax/swing/plaf/basic/BasicTextUI$RootView
-javax/swing/text/View
-javax/swing/plaf/basic/BasicTextUI$UpdateHandler
-javax/swing/event/DocumentListener
-javax/swing/plaf/basic/BasicTextUI$DragListener
-javax/swing/plaf/basic/BasicComboBoxEditor$UIResource
-javax/swing/plaf/basic/BasicTextUI$BasicCaret
-javax/swing/text/DefaultCaret
-javax/swing/text/Caret
-javax/swing/text/DefaultCaret$Handler
-java/awt/datatransfer/ClipboardOwner
-javax/swing/plaf/basic/BasicTextUI$BasicHighlighter
-javax/swing/text/DefaultHighlighter
-javax/swing/text/LayeredHighlighter
-javax/swing/text/Highlighter
-javax/swing/text/Highlighter$Highlight
-javax/swing/text/DefaultHighlighter$DefaultHighlightPainter
-javax/swing/text/LayeredHighlighter$LayerPainter
-javax/swing/text/Highlighter$HighlightPainter
-javax/swing/text/DefaultHighlighter$SafeDamager
-javax/swing/text/FieldView
-javax/swing/text/PlainView
-javax/swing/text/JTextComponent$DefaultKeymap
-javax/swing/text/Keymap
-javax/swing/text/JTextComponent$KeymapWrapper
-javax/swing/text/JTextComponent$KeymapActionMap
-javax/swing/plaf/basic/BasicTextUI$FocusAction
-javax/swing/plaf/basic/BasicTextUI$TextActionWrapper
-javax/swing/JTextArea
-javax/swing/JEditorPane
-javax/swing/JTextField$ScrollRepainter
-javax/swing/plaf/metal/MetalComboBoxEditor$1
-javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder
-javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener
-javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicComboBoxUI$Handler
-javax/swing/plaf/metal/MetalComboBoxButton
-javax/swing/plaf/metal/MetalComboBoxIcon
-javax/swing/plaf/metal/MetalComboBoxButton$1
-javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager
-javax/swing/JComboBox$KeySelectionManager
-javax/swing/JToolBar$DefaultToolBarLayout
-javax/swing/plaf/metal/MetalToolBarUI
-javax/swing/plaf/basic/BasicToolBarUI
-javax/swing/plaf/ToolBarUI
-javax/swing/plaf/metal/MetalBorders$ToolBarBorder
-javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue$1
-javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder
-javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder
-javax/swing/plaf/basic/BasicBorders$RadioButtonBorder
-javax/swing/plaf/basic/BasicBorders$ButtonBorder
-javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder
-javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener
-javax/swing/plaf/basic/BasicToolBarUI$DockingListener
-javax/swing/plaf/basic/BasicToolBarUI$Handler
-javax/swing/border/EtchedBorder
-javax/swing/JToolBar$Separator
-javax/swing/plaf/basic/BasicToolBarSeparatorUI
-sun/awt/color/CMM
-java/applet/Applet
-java/awt/Panel
-com/sun/awt/AWTUtilities
-javax/swing/KeyboardManager$ComponentKeyStrokePair
-sun/awt/EmbeddedFrame
-sun/awt/im/InputMethodContext
-java/awt/im/spi/InputMethodContext
-sun/awt/im/InputContext
-sun/awt/im/InputMethodManager
-sun/awt/im/ExecutableInputMethodManager
-sun/awt/X11/XInputMethodDescriptor
-sun/awt/X11InputMethodDescriptor
-java/awt/im/spi/InputMethodDescriptor
-sun/awt/im/InputMethodLocator
-sun/awt/im/ExecutableInputMethodManager$2
-sun/misc/Service
-sun/misc/Service$LazyIterator
-java/util/TreeSet
-java/util/NavigableSet
-java/util/SortedSet
-javax/swing/SizeRequirements
-javax/swing/plaf/basic/BasicGraphicsUtils
-java/awt/event/AdjustmentEvent
-java/awt/MenuBar
-sun/awt/X11/XComponentPeer$2
-java/awt/SequencedEvent
-java/beans/PropertyVetoException
-java/awt/DefaultKeyboardFocusManager$TypeAheadMarker
-java/awt/KeyboardFocusManager$HeavyweightFocusRequest
-java/awt/KeyboardFocusManager$LightweightFocusRequest
-sun/awt/KeyboardFocusManagerPeerImpl
-sun/awt/SunToolkit$7
-java/awt/Window$1DisposeAction
-java/awt/LightweightDispatcher$2
-sun/awt/X11/XReparentEvent
-sun/awt/X11/XWindowAttributes
-javax/swing/SystemEventQueueUtilities$ComponentWorkRequest
-sun/awt/X11/XFocusChangeEvent
-sun/awt/X11/XComponentPeer$1
-sun/awt/X11/XUnmapEvent
-java/io/StringWriter
-javax/swing/JWindow
-java/io/UnsupportedEncodingException
-java/net/UnknownHostException
-java/nio/channels/SocketChannel
-java/nio/channels/spi/AbstractSelectableChannel
-java/nio/channels/SelectableChannel
-java/net/SocketImplFactory
-javax/swing/UnsupportedLookAndFeelException
-java/lang/UnsatisfiedLinkError
-javax/swing/Box$Filler
-javax/swing/JComponent$2
-sun/net/www/MimeTable
-java/net/FileNameMap
-sun/net/www/MimeTable$1
-sun/net/www/MimeTable$2
-sun/net/www/MimeEntry
-java/net/URLConnection$1
-java/text/SimpleDateFormat
-java/text/DateFormat
-java/text/DateFormat$Field
-java/util/Calendar
-java/util/GregorianCalendar
-sun/util/resources/CalendarData
-sun/util/resources/CalendarData_en
-java/text/DateFormatSymbols
-java/text/spi/DateFormatSymbolsProvider
-java/text/DontCareFieldPosition
-java/text/DontCareFieldPosition$1
-java/text/Format$FieldDelegate
-javax/swing/plaf/BorderUIResource
-javax/swing/BorderFactory
-javax/swing/border/BevelBorder
-javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon
-javax/swing/plaf/metal/MetalIconFactory$FolderIcon16
-java/util/zip/ZipInputStream
-java/io/PushbackInputStream
-java/util/zip/CRC32
-java/util/zip/Checksum
-java/lang/Thread$State
-javax/swing/SwingUtilities$SharedOwnerFrame
-javax/swing/JTable
-javax/swing/event/TableModelListener
-javax/swing/event/TableColumnModelListener
-javax/swing/event/CellEditorListener
-javax/swing/event/RowSorterListener
-javax/swing/BufferStrategyPaintManager$BufferInfo
-java/awt/Component$BltSubRegionBufferStrategy
-sun/awt/SubRegionShowable
-java/awt/Component$BltBufferStrategy
-sun/awt/image/SunVolatileImage
-sun/awt/image/BufferedImageGraphicsConfig
-sun/print/PrinterGraphicsConfig
-sun/java2d/x11/X11VolatileSurfaceManager
-sun/awt/image/VolatileSurfaceManager
-java/awt/print/PrinterGraphics
-java/awt/PrintGraphics
-java/awt/GraphicsCallback$PaintCallback
-java/awt/GraphicsCallback
-sun/awt/SunGraphicsCallback
-javax/swing/JRadioButton
-java/lang/ClassFormatError
-javax/swing/JTabbedPane
-javax/swing/JTabbedPane$ModelListener
-javax/swing/plaf/metal/MetalTabbedPaneUI
-javax/swing/plaf/basic/BasicTabbedPaneUI
-javax/swing/plaf/TabbedPaneUI
-javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout
-javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout
-javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout
-javax/swing/plaf/basic/BasicTabbedPaneUI$Handler
-sun/swing/ImageIconUIResource
-javax/swing/GrayFilter
-java/awt/image/RGBImageFilter
-java/awt/image/ImageFilter
-java/awt/image/FilteredImageSource
-org/w3c/dom/Node
-org/xml/sax/SAXException
-javax/xml/parsers/ParserConfigurationException
-org/xml/sax/EntityResolver
-java/security/NoSuchAlgorithmException
-java/security/GeneralSecurityException
-java/util/zip/GZIPInputStream
-java/util/zip/DeflaterOutputStream
-org/xml/sax/InputSource
-javax/xml/parsers/DocumentBuilderFactory
-javax/xml/parsers/FactoryFinder
-javax/xml/parsers/SecuritySupport
-javax/xml/parsers/SecuritySupport$2
-javax/xml/parsers/SecuritySupport$5
-javax/xml/parsers/SecuritySupport$1
-javax/xml/parsers/SecuritySupport$4
-javax/xml/parsers/DocumentBuilder
-org/w3c/dom/Document
-org/xml/sax/helpers/DefaultHandler
-org/xml/sax/DTDHandler
-org/xml/sax/ContentHandler
-org/xml/sax/ErrorHandler
-org/xml/sax/SAXNotSupportedException
-org/xml/sax/Locator
-org/xml/sax/SAXNotRecognizedException
-org/xml/sax/SAXParseException
-org/w3c/dom/NodeList
-org/w3c/dom/events/EventTarget
-org/w3c/dom/traversal/DocumentTraversal
-org/w3c/dom/events/DocumentEvent
-org/w3c/dom/ranges/DocumentRange
-org/w3c/dom/Entity
-org/w3c/dom/Element
-org/w3c/dom/CharacterData
-org/w3c/dom/CDATASection
-org/w3c/dom/Text
-org/xml/sax/AttributeList
-org/w3c/dom/DOMException
-org/w3c/dom/Notation
-org/w3c/dom/DocumentType
-org/w3c/dom/Attr
-org/w3c/dom/EntityReference
-org/w3c/dom/ProcessingInstruction
-org/w3c/dom/Comment
-org/w3c/dom/DocumentFragment
-org/w3c/dom/events/Event
-org/w3c/dom/events/MutationEvent
-org/w3c/dom/traversal/TreeWalker
-org/w3c/dom/ranges/Range
-org/w3c/dom/traversal/NodeIterator
-org/w3c/dom/events/EventException
-org/w3c/dom/NamedNodeMap
-java/lang/StringIndexOutOfBoundsException
-java/awt/GridLayout
-javax/swing/plaf/metal/MetalRadioButtonUI
-javax/swing/plaf/basic/BasicRadioButtonUI
-javax/swing/plaf/basic/BasicBorders
-javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon
-java/awt/event/ItemEvent
-java/awt/CardLayout$Card
-javax/swing/JCheckBox
-javax/swing/event/ListSelectionEvent
-javax/swing/plaf/metal/MetalCheckBoxUI
-javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon
-java/lang/ExceptionInInitializerError
-com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI
-javax/swing/JProgressBar
-javax/swing/JProgressBar$ModelListener
-javax/swing/plaf/metal/MetalProgressBarUI
-javax/swing/plaf/basic/BasicProgressBarUI
-javax/swing/plaf/ProgressBarUI
-javax/swing/plaf/BorderUIResource$LineBorderUIResource
-javax/swing/plaf/basic/BasicProgressBarUI$Handler
-javax/swing/tree/TreeModel
-javax/swing/table/TableCellRenderer
-javax/swing/table/JTableHeader
-javax/swing/event/TreeExpansionListener
-javax/swing/table/AbstractTableModel
-javax/swing/table/TableModel
-javax/swing/table/DefaultTableCellRenderer
-javax/swing/JTree
-javax/swing/tree/TreeSelectionModel
-javax/swing/tree/DefaultTreeCellRenderer
-javax/swing/tree/TreeCellRenderer
-javax/swing/table/TableCellEditor
-javax/swing/CellEditor
-javax/swing/JToolTip
-javax/swing/table/TableColumn
-javax/swing/table/DefaultTableColumnModel
-javax/swing/table/TableColumnModel
-javax/swing/table/DefaultTableModel
-javax/swing/event/TableModelEvent
-sun/swing/table/DefaultTableCellHeaderRenderer
-javax/swing/plaf/basic/BasicTableHeaderUI
-javax/swing/plaf/TableHeaderUI
-javax/swing/plaf/basic/BasicTableHeaderUI$1
-javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler
-javax/swing/DefaultCellEditor
-javax/swing/tree/TreeCellEditor
-javax/swing/AbstractCellEditor
-javax/swing/plaf/basic/BasicTableUI
-javax/swing/plaf/TableUI
-javax/swing/plaf/basic/BasicTableUI$TableTransferHandler
-javax/swing/plaf/basic/BasicTableUI$Handler
-javax/swing/tree/DefaultTreeSelectionModel
-javax/swing/tree/TreePath
-javax/swing/plaf/metal/MetalTreeUI
-javax/swing/plaf/basic/BasicTreeUI
-javax/swing/plaf/TreeUI
-javax/swing/plaf/basic/BasicTreeUI$Actions
-javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler
-javax/swing/plaf/metal/MetalTreeUI$LineListener
-javax/swing/plaf/basic/BasicTreeUI$Handler
-javax/swing/event/TreeModelListener
-javax/swing/event/TreeSelectionListener
-javax/swing/event/SwingPropertyChangeSupport
-javax/swing/tree/VariableHeightLayoutCache
-javax/swing/tree/AbstractLayoutCache
-javax/swing/tree/RowMapper
-javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler
-javax/swing/tree/AbstractLayoutCache$NodeDimensions
-javax/swing/JTree$TreeModelHandler
-javax/swing/tree/VariableHeightLayoutCache$TreeStateNode
-javax/swing/tree/DefaultMutableTreeNode
-javax/swing/tree/MutableTreeNode
-javax/swing/tree/DefaultMutableTreeNode$1
-javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration
-javax/swing/event/TableColumnModelEvent
-java/text/ParseException
-java/text/NumberFormat$Field
-javax/swing/event/UndoableEditListener
-javax/swing/filechooser/FileFilter
-javax/swing/tree/DefaultTreeModel
-javax/swing/tree/DefaultTreeCellEditor
-javax/swing/tree/DefaultTreeCellEditor$1
-javax/swing/tree/DefaultTreeCellEditor$DefaultTextField
-javax/swing/DefaultCellEditor$1
-javax/swing/DefaultCellEditor$EditorDelegate
-javax/swing/tree/DefaultTreeCellEditor$EditorContainer
-javax/swing/JTree$TreeSelectionRedirector
-javax/swing/event/TreeModelEvent
-javax/swing/plaf/metal/MetalSplitPaneUI
-javax/swing/plaf/basic/BasicSplitPaneUI
-javax/swing/plaf/SplitPaneUI
-javax/swing/plaf/basic/BasicSplitPaneDivider
-javax/swing/plaf/basic/BasicBorders$SplitPaneBorder
-javax/swing/plaf/metal/MetalSplitPaneDivider
-javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout
-javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler
-javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder
-javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager
-javax/swing/plaf/basic/BasicSplitPaneUI$1
-javax/swing/plaf/basic/BasicSplitPaneUI$Handler
-javax/swing/plaf/metal/MetalSplitPaneDivider$1
-javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler
-javax/swing/plaf/metal/MetalSplitPaneDivider$2
-javax/swing/border/TitledBorder
-javax/swing/plaf/basic/BasicTextAreaUI
-java/util/Collections$UnmodifiableCollection$1
-java/io/InterruptedIOException
-java/net/NoRouteToHostException
-java/net/BindException
-javax/swing/tree/PathPlaceHolder
-javax/swing/event/TreeSelectionEvent
-javax/swing/JList$3
-javax/swing/JList$ListSelectionHandler
-javax/swing/JSlider
-javax/swing/JSlider$ModelListener
-javax/swing/plaf/metal/MetalSliderUI
-javax/swing/plaf/basic/BasicSliderUI
-javax/swing/plaf/SliderUI
-javax/swing/plaf/basic/BasicSliderUI$Actions
-javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon
-javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon
-javax/swing/plaf/basic/BasicSliderUI$TrackListener
-javax/swing/plaf/basic/BasicSliderUI$Handler
-javax/swing/plaf/basic/BasicSliderUI$ScrollListener
-javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener
-javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler
-sun/java2d/HeadlessGraphicsEnvironment
-java/util/Hashtable$KeySet
-java/awt/FontFormatException
-sun/java2d/SunGraphicsEnvironment$2
-sun/font/Type1Font$1
-java/nio/channels/FileChannel$MapMode
-sun/nio/ch/FileChannelImpl$Unmapper
-sun/nio/ch/Util$3
-java/nio/DirectByteBufferR
-java/nio/charset/Charset$3
-sun/nio/cs/ext/ExtendedCharsets
-sun/nio/cs/AbstractCharsetProvider
-sun/nio/cs/ext/SJIS
-sun/nio/cs/ext/SJIS$Decoder
-sun/nio/cs/ext/DelegatableDecoder
-sun/nio/cs/ext/JIS_X_0208_Decoder
-sun/nio/cs/ext/DoubleByteDecoder
-sun/nio/cs/ext/JIS_X_0201$Decoder
-sun/nio/cs/SingleByteDecoder
-java/lang/CharacterData00
-javax/swing/DefaultListModel
-javax/swing/event/ListDataEvent
-javax/sound/sampled/DataLine
-javax/sound/sampled/Line
-javax/sound/sampled/Line$Info
-javax/sound/sampled/DataLine$Info
-javax/sound/sampled/Control$Type
-javax/sound/sampled/FloatControl$Type
-javax/sound/sampled/LineUnavailableException
-javax/sound/sampled/UnsupportedAudioFileException
-javax/swing/JRadioButtonMenuItem
-javax/swing/JMenuItem$AccessibleJMenuItem
-javax/swing/AbstractButton$AccessibleAbstractButton
-javax/accessibility/AccessibleAction
-javax/accessibility/AccessibleValue
-javax/accessibility/AccessibleText
-javax/accessibility/AccessibleExtendedComponent
-javax/accessibility/AccessibleComponent
-javax/swing/JComponent$AccessibleJComponent
-java/awt/Container$AccessibleAWTContainer
-java/awt/Component$AccessibleAWTComponent
-javax/accessibility/AccessibleRelationSet
-javax/accessibility/AccessibleState
-javax/accessibility/AccessibleBundle
-javax/swing/plaf/basic/BasicCheckBoxMenuItemUI
-javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon
-javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem
-javax/swing/plaf/basic/BasicRadioButtonMenuItemUI
-javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon
-sun/awt/image/ImageDecoder$1
-javax/swing/JTabbedPane$Page
-java/net/DatagramSocket
-java/net/MulticastSocket
-java/net/DatagramPacket
-sun/net/InetAddressCachePolicy
-sun/net/InetAddressCachePolicy$1
-sun/net/InetAddressCachePolicy$2
-java/net/InetAddress$CacheEntry
-java/net/PlainDatagramSocketImpl
-java/net/DatagramSocketImpl
-java/net/NetworkInterface
-java/net/InterfaceAddress
-java/text/Collator
-java/text/spi/CollatorProvider
-sun/text/resources/CollationData
-sun/text/resources/CollationData_en
-sun/util/EmptyListResourceBundle
-java/text/RuleBasedCollator
-java/text/CollationRules
-java/text/RBCollationTables
-java/text/RBTableBuilder
-java/text/RBCollationTables$BuildAPI
-sun/text/IntHashtable
-sun/text/UCompactIntArray
-sun/text/normalizer/NormalizerImpl
-sun/text/normalizer/ICUData
-sun/text/normalizer/NormalizerDataReader
-sun/text/normalizer/ICUBinary$Authenticate
-sun/text/normalizer/ICUBinary
-sun/text/normalizer/NormalizerImpl$FCDTrieImpl
-sun/text/normalizer/Trie$DataManipulate
-sun/text/normalizer/NormalizerImpl$NormTrieImpl
-sun/text/normalizer/NormalizerImpl$AuxTrieImpl
-sun/text/normalizer/IntTrie
-sun/text/normalizer/Trie
-sun/text/normalizer/CharTrie
-sun/text/normalizer/CharTrie$FriendAgent
-sun/text/normalizer/UnicodeSet
-sun/text/normalizer/UnicodeMatcher
-sun/text/normalizer/NormalizerImpl$DecomposeArgs
-java/text/MergeCollation
-java/text/PatternEntry$Parser
-java/text/PatternEntry
-java/text/EntryPair
-sun/text/ComposedCharIter
-sun/text/normalizer/UTF16
-sun/net/www/protocol/http/Handler
-java/io/ObjectInputStream$BlockDataInputStream
-java/io/ObjectInputStream$PeekInputStream
-java/io/ObjectInputStream$HandleTable
-java/io/ObjectInputStream$ValidationList
-java/io/Bits
-java/io/ObjectStreamClass$Caches
-java/io/ObjectStreamClass$WeakClassKey
-java/io/ObjectStreamClass$EntryFuture
-java/io/ObjectStreamClass$2
-sun/reflect/SerializationConstructorAccessorImpl
-java/io/ObjectStreamClass$FieldReflectorKey
-java/io/ObjectStreamClass$FieldReflector
-java/io/ObjectStreamClass$1
-java/io/DataOutputStream
-java/io/ObjectStreamClass$MemberSignature
-java/io/ObjectStreamClass$3
-java/io/ObjectStreamClass$4
-java/io/ObjectStreamClass$5
-java/security/MessageDigest
-java/security/MessageDigestSpi
-sun/security/jca/GetInstance
-sun/security/jca/Providers
-sun/security/jca/ProviderList
-sun/security/jca/ProviderConfig
-sun/security/jca/ProviderList$3
-sun/security/jca/ProviderList$1
-sun/security/jca/ProviderList$2
-sun/security/jca/ProviderConfig$1
-sun/security/jca/ProviderConfig$3
-java/security/Provider$Service
-java/security/Provider$UString
-sun/security/provider/SHA
-sun/security/provider/DigestBase
-sun/security/jca/GetInstance$Instance
-java/security/MessageDigest$Delegate
-sun/security/provider/ByteArrayAccess
-java/io/ObjectStreamClass$ClassDataSlot
-java/io/ObjectInputStream$CallbackContext
-sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl
-java/security/SignatureException
-java/security/InvalidKeyException
-java/security/KeyException
-java/security/Signature
-java/security/SignatureSpi
-java/io/ObjectOutputStream$BlockDataOutputStream
-sun/security/provider/DSAPublicKey
-java/security/interfaces/DSAPublicKey
-java/security/interfaces/DSAKey
-java/security/PublicKey
-java/security/Key
-sun/security/x509/X509Key
-java/io/ObjectOutputStream$HandleTable
-java/io/ObjectOutputStream$ReplaceTable
-sun/security/x509/AlgorithmId
-sun/security/util/DerEncoder
-sun/security/util/BitArray
-sun/security/util/DerOutputStream
-sun/security/util/DerValue
-java/math/BigInteger
-java/security/interfaces/DSAParams
-sun/security/util/DerInputStream
-sun/security/util/DerInputBuffer
-sun/security/util/ObjectIdentifier
-java/security/AlgorithmParameters
-java/security/AlgorithmParametersSpi
-sun/security/provider/DSAParameters
-sun/security/util/ByteArrayLexOrder
-sun/security/util/ByteArrayTagOrder
-sun/security/util/DerIndefLenConverter
-java/io/InvalidClassException
-java/io/ObjectStreamException
-java/io/ObjectInputStream$GetFieldImpl
-java/io/ObjectInputStream$GetField
-sun/security/jca/ServiceId
-sun/security/jca/ProviderList$ServiceList
-sun/security/jca/ProviderList$ServiceList$1
-java/security/Signature$Delegate
-java/security/interfaces/DSAPrivateKey
-java/security/PrivateKey
-sun/security/provider/DSA$SHA1withDSA
-sun/security/provider/DSA
-java/security/spec/DSAParameterSpec
-java/security/spec/AlgorithmParameterSpec
-java/math/MutableBigInteger
-java/math/SignedMutableBigInteger
-java/awt/EventQueue$1AWTInvocationLock
-javax/swing/SystemEventQueueUtilities$RunnableCanvas
-javax/swing/SystemEventQueueUtilities$RunnableCanvasGraphics
-java/awt/Component$FlipBufferStrategy
-java/awt/SentEvent
-sun/awt/X11/XDestroyWindowEvent
-sun/awt/X11/XDropTargetRegistry
-sun/awt/X11/XEmbeddedFramePeer
-sun/awt/X11/XDragAndDropProtocols
-sun/awt/X11/XDropTargetContextPeer
-sun/awt/dnd/SunDropTargetContextPeer
-java/awt/dnd/peer/DropTargetContextPeer
-sun/awt/X11/XDropTargetContextPeer$XDropTargetProtocolListenerImpl
-sun/awt/X11/XDropTargetProtocolListener
-sun/awt/X11/XDnDDragSourceProtocol
-sun/awt/X11/XDragSourceProtocol
-sun/awt/X11/MotifDnDDragSourceProtocol
-sun/awt/X11/XDnDDropTargetProtocol
-sun/awt/X11/XDropTargetProtocol
-sun/awt/X11/MotifDnDDropTargetProtocol
-sun/awt/X11/XDnDConstants
-sun/awt/X11/MotifDnDConstants
-javax/swing/JTable$2
-javax/swing/JTable$Resizable3
-javax/swing/JTable$Resizable2
-javax/swing/JTable$5
-javax/swing/event/AncestorEvent
-sun/font/FontDesignMetrics$MetricsKey
-java/awt/geom/Line2D$Float
-java/awt/geom/Line2D
-com/sun/java/swing/plaf/gtk/GTKLookAndFeel
-javax/swing/plaf/synth/SynthLookAndFeel
-javax/swing/plaf/synth/DefaultSynthStyleFactory
-javax/swing/plaf/synth/SynthStyleFactory
-sun/swing/BakedArrayList
-javax/swing/plaf/synth/SynthLookAndFeel$Handler
-javax/swing/plaf/synth/SynthDefaultLookup
-com/sun/java/swing/plaf/gtk/GTKEngine
-com/sun/java/swing/plaf/gtk/GTKDefaultEngine
-com/sun/java/swing/plaf/gtk/GTKEngine$Settings
-com/sun/java/swing/plaf/gtk/GTKStyleFactory
-com/sun/java/swing/plaf/gtk/PangoFonts
-sun/font/FontManager$FontConfigInfo
-com/sun/java/swing/plaf/gtk/GTKLookAndFeel$WeakPCL
-javax/swing/plaf/synth/Region
-javax/swing/plaf/synth/SynthLookAndFeel$AATextListener
-com/sun/java/swing/plaf/gtk/GTKNativeEngine
-com/sun/java/swing/plaf/gtk/GTKNativeEngine$WidgetType
-com/sun/java/swing/plaf/gtk/GTKRegion
-com/sun/java/swing/plaf/gtk/GTKDefaultStyle
-com/sun/java/swing/plaf/gtk/GTKStyle
-com/sun/java/swing/plaf/gtk/GTKConstants
-javax/swing/plaf/synth/SynthStyle
-javax/swing/plaf/synth/SynthGraphicsUtils
-com/sun/java/swing/plaf/gtk/GTKGraphicsUtils
-com/sun/java/swing/plaf/gtk/GTKStyle$GTKStockIcon
-sun/swing/plaf/synth/SynthIcon
-com/sun/java/swing/plaf/gtk/GTKColorType
-javax/swing/plaf/synth/ColorType
-com/sun/java/swing/plaf/gtk/resources/gtk
-com/sun/swing/internal/plaf/synth/resources/synth
-com/sun/java/swing/plaf/gtk/GTKStyle$GTKLazyValue
-com/sun/java/swing/plaf/gtk/GTKLookAndFeel$1FontLazyValue
-com/sun/java/swing/plaf/gtk/GTKLookAndFeel$2
-com/sun/java/swing/plaf/gtk/GTKLookAndFeel$3
-javax/swing/plaf/synth/SynthPanelUI
-javax/swing/plaf/synth/SynthConstants
-javax/swing/plaf/synth/SynthContext
-javax/swing/plaf/synth/SynthBorder
-javax/swing/plaf/synth/SynthRootPaneUI
-javax/swing/plaf/synth/SynthLabelUI
-javax/swing/plaf/synth/SynthButtonUI
-javax/swing/plaf/synth/SynthToggleButtonUI
-javax/swing/plaf/basic/BasicBorders$FieldBorder
-javax/swing/plaf/synth/SynthMenuBarUI
-javax/swing/plaf/synth/DefaultMenuLayout
-javax/swing/plaf/synth/SynthMenuUI
-javax/swing/plaf/synth/SynthUI
-com/sun/java/swing/plaf/gtk/GTKIconFactory
-com/sun/java/swing/plaf/gtk/GTKIconFactory$MenuArrowIcon
-com/sun/java/swing/plaf/gtk/GTKIconFactory$DelegatingIcon
-com/sun/java/swing/plaf/gtk/GTKConstants$ArrowType
-javax/swing/plaf/basic/BasicIconFactory
-javax/swing/plaf/basic/BasicIconFactory$MenuItemCheckIcon
-javax/swing/plaf/synth/SynthMenuItemUI
-javax/swing/plaf/synth/SynthPopupMenuUI
-javax/swing/plaf/synth/SynthSeparatorUI
-javax/swing/plaf/synth/SynthScrollBarUI
-javax/swing/plaf/synth/SynthArrowButton
-javax/swing/plaf/synth/SynthArrowButton$SynthArrowButtonUI
-javax/swing/plaf/synth/SynthComboBoxUI
-javax/swing/plaf/synth/SynthComboPopup
-javax/swing/plaf/synth/SynthListUI
-javax/swing/plaf/synth/SynthListUI$SynthListCellRenderer
-javax/swing/plaf/synth/SynthViewportUI
-javax/swing/plaf/synth/SynthScrollPaneUI
-javax/swing/plaf/synth/SynthScrollPaneUI$ViewportBorder
-javax/swing/plaf/synth/SynthComboBoxUI$SynthComboBoxRenderer
-javax/swing/plaf/synth/SynthComboBoxUI$SynthComboBoxEditor
-javax/swing/plaf/synth/SynthTextFieldUI
-javax/swing/plaf/synth/SynthToolBarUI
-javax/swing/plaf/synth/SynthToolBarUI$SynthToolBarLayoutManager
-com/sun/java/swing/plaf/gtk/GTKIconFactory$ToolBarHandleIcon
-com/sun/java/swing/plaf/gtk/GTKConstants$Orientation
-sun/awt/X11/XTranslateCoordinates
-com/sun/java/swing/plaf/gtk/GTKPainter
-javax/swing/plaf/synth/SynthPainter
-javax/swing/plaf/synth/SynthPainter$1
-com/sun/java/swing/plaf/gtk/GTKConstants$PositionType
-com/sun/java/swing/plaf/gtk/GTKConstants$ShadowType
-java/io/ObjectInputStream$HandleTable$HandleList
-sun/java2d/pipe/ShapeSpanIterator
-sun/java2d/pipe/SpanIterator
-sun/dc/path/PathConsumer
-sun/dc/pr/PathStroker
-sun/dc/pr/PathDasher
-java/awt/geom/LineIterator
-java/awt/geom/PathIterator
-sun/applet/Main
-sun/applet/AppletMessageHandler
-sun/applet/resources/MsgAppletViewer
-sun/applet/AppletSecurity
-sun/awt/AWTSecurityManager
-java/lang/SecurityManager
-java/security/DomainCombiner
-sun/applet/AppletSecurity$1
-java/lang/SecurityManager$1
-java/security/SecurityPermission
-java/util/PropertyPermission
-sun/applet/AppletViewer
-java/applet/AppletContext
-java/awt/print/Printable
-sun/security/util/SecurityConstants
-java/awt/AWTPermission
-java/net/NetPermission
-java/net/SocketPermission
-javax/security/auth/AuthPermission
-java/lang/Thread$1
-java/util/logging/LogManager$5
-java/util/logging/LogManager$6
-sun/applet/StdAppletViewerFactory
-sun/applet/AppletViewerFactory
-sun/applet/AppletViewer$UserActionListener
-sun/applet/AppletViewerPanel
-sun/applet/AppletPanel
-java/applet/AppletStub
-sun/misc/MessageUtils
-sun/applet/AppletPanel$10
-java/security/Policy$1
-sun/security/provider/PolicyFile$1
-sun/security/provider/PolicyInfo
-sun/security/provider/PolicyFile$3
-sun/security/util/PropertyExpander
-sun/security/provider/PolicyParser
-sun/security/util/PolicyUtil
-sun/security/provider/PolicyParser$GrantEntry
-sun/security/provider/PolicyParser$PermissionEntry
-sun/security/provider/PolicyFile$PolicyEntry
-sun/security/provider/PolicyFile$6
-sun/security/provider/PolicyFile$7
-sun/security/provider/SelfPermission
-java/net/SocketPermissionCollection
-java/util/PropertyPermissionCollection
-sun/applet/AppletPanel$9
-sun/applet/AppletClassLoader
-sun/applet/AppletClassLoader$4
-sun/applet/AppletThreadGroup
-sun/applet/AppContextCreator
-sun/applet/AppletPanel$1
-sun/awt/X11/XMenuBarPeer
-java/awt/peer/MenuBarPeer
-java/awt/peer/MenuComponentPeer
-sun/awt/X11/XBaseMenuWindow
-sun/awt/X11/XMenuPeer
-java/awt/peer/MenuPeer
-java/awt/peer/MenuItemPeer
-sun/awt/X11/XMenuItemPeer
-java/awt/MenuShortcut
-sun/awt/X11/XMenuWindow
-sun/awt/X11/XMenuBarPeer$1
-sun/awt/X11/XMenuItemPeer$TextMetrics
-sun/awt/AppContext$3
-sun/awt/MostRecentThreadAppContext
-sun/awt/X11/XMenuBarPeer$MappingData
-sun/awt/X11/XBaseMenuWindow$MappingData
-sun/applet/AppletViewer$1
-sun/applet/AppletViewer$1AppletEventListener
-sun/applet/AppletListener
-sun/applet/AppletEventMulticaster
-sun/misc/Queue
-sun/misc/QueueElement
-sun/applet/AppletEvent
-sun/applet/AppletClassLoader$1
-sun/awt/X11/XBaseMenuWindow$3
-java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent
-sun/awt/CausedFocusEvent
-sun/awt/X11/XWindow$1
-java/net/URLClassLoader$4
-sun/applet/AppletClassLoader$2
-javax/swing/JApplet
-java/lang/ClassLoader$1
-sun/security/provider/PolicyFile$5
-java/security/PermissionsEnumerator
-java/util/Collections$1
-sun/applet/AppletPanel$11
-sun/applet/AppletPanel$8
-sun/applet/AppletPanel$2
-sun/applet/AppletPanel$3
-sun/applet/AppletPanel$6
-javax/swing/BufferStrategyPaintManager$1
-# f3ac8b467e7f8c49
--- a/jdk/make/data/classlist/classlist.linux	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2454 +0,0 @@
-com/sun/java/swing/SwingUtilities3
-com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI
-com/sun/swing/internal/plaf/basic/resources/basic
-com/sun/swing/internal/plaf/metal/resources/metal
-java/applet/Applet
-java/awt/AWTEvent
-java/awt/AWTEvent$1
-java/awt/AWTEventMulticaster
-java/awt/AWTKeyStroke
-java/awt/AWTKeyStroke$1
-java/awt/ActiveEvent
-java/awt/Adjustable
-java/awt/AlphaComposite
-java/awt/BasicStroke
-java/awt/BorderLayout
-java/awt/BufferCapabilities
-java/awt/Canvas
-java/awt/CardLayout
-java/awt/CardLayout$Card
-java/awt/Color
-java/awt/Component
-java/awt/Component$1
-java/awt/Component$3
-java/awt/Component$AWTTreeLock
-java/awt/Component$AccessibleAWTComponent
-java/awt/Component$BaselineResizeBehavior
-java/awt/Component$BltBufferStrategy
-java/awt/Component$BltSubRegionBufferStrategy
-java/awt/Component$DummyRequestFocusController
-java/awt/Component$FlipBufferStrategy
-java/awt/ComponentOrientation
-java/awt/Composite
-java/awt/Conditional
-java/awt/Container
-java/awt/Container$1
-java/awt/Container$AccessibleAWTContainer
-java/awt/ContainerOrderFocusTraversalPolicy
-java/awt/Cursor
-java/awt/Cursor$1
-java/awt/DefaultFocusTraversalPolicy
-java/awt/DefaultKeyboardFocusManager
-java/awt/DefaultKeyboardFocusManager$1
-java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent
-java/awt/DefaultKeyboardFocusManager$TypeAheadMarker
-java/awt/Dialog
-java/awt/Dialog$ModalExclusionType
-java/awt/Dialog$ModalityType
-java/awt/Dimension
-java/awt/Event
-java/awt/EventDispatchThread
-java/awt/EventDispatchThread$1
-java/awt/EventDispatchThread$HierarchyEventFilter
-java/awt/EventFilter
-java/awt/EventFilter$FilterAction
-java/awt/EventQueue
-java/awt/EventQueue$1
-java/awt/EventQueue$1AWTInvocationLock
-java/awt/EventQueue$2
-java/awt/EventQueue$3
-java/awt/EventQueue$4
-java/awt/EventQueue$5
-java/awt/FlowLayout
-java/awt/FocusTraversalPolicy
-java/awt/Font
-java/awt/Font$FontAccessImpl
-java/awt/FontFormatException
-java/awt/FontMetrics
-java/awt/Frame
-java/awt/Frame$1
-java/awt/Graphics
-java/awt/Graphics2D
-java/awt/GraphicsCallback
-java/awt/GraphicsCallback$PaintCallback
-java/awt/GraphicsConfiguration
-java/awt/GraphicsDevice
-java/awt/GraphicsEnvironment
-java/awt/GraphicsEnvironment$1
-java/awt/GridLayout
-java/awt/Image
-java/awt/Image$1
-java/awt/ImageCapabilities
-java/awt/ImageMediaEntry
-java/awt/Insets
-java/awt/ItemSelectable
-java/awt/KeyEventDispatcher
-java/awt/KeyEventPostProcessor
-java/awt/KeyboardFocusManager
-java/awt/KeyboardFocusManager$1
-java/awt/KeyboardFocusManager$3
-java/awt/KeyboardFocusManager$HeavyweightFocusRequest
-java/awt/KeyboardFocusManager$LightweightFocusRequest
-java/awt/Label
-java/awt/LayoutManager
-java/awt/LayoutManager2
-java/awt/LightweightDispatcher
-java/awt/LightweightDispatcher$2
-java/awt/MediaEntry
-java/awt/MediaTracker
-java/awt/MenuBar
-java/awt/MenuComponent
-java/awt/MenuContainer
-java/awt/ModalEventFilter
-java/awt/Paint
-java/awt/Panel
-java/awt/Point
-java/awt/PrintGraphics
-java/awt/Queue
-java/awt/Rectangle
-java/awt/RenderingHints
-java/awt/RenderingHints$Key
-java/awt/SentEvent
-java/awt/SequencedEvent
-java/awt/SequencedEvent$1
-java/awt/Shape
-java/awt/SplashScreen
-java/awt/Stroke
-java/awt/SystemColor
-java/awt/Toolkit
-java/awt/Toolkit$1
-java/awt/Toolkit$2
-java/awt/Toolkit$3
-java/awt/Toolkit$4
-java/awt/Toolkit$5
-java/awt/Toolkit$DesktopPropertyChangeSupport
-java/awt/Toolkit$DesktopPropertyChangeSupport$1
-java/awt/Toolkit$SelectiveAWTEventListener
-java/awt/Toolkit$ToolkitEventMulticaster
-java/awt/Transparency
-java/awt/TrayIcon
-java/awt/VKCollection
-java/awt/Window
-java/awt/Window$1
-java/awt/Window$1DisposeAction
-java/awt/Window$Type
-java/awt/Window$WindowDisposerRecord
-java/awt/color/ColorSpace
-java/awt/color/ICC_ColorSpace
-java/awt/color/ICC_Profile
-java/awt/color/ICC_Profile$1
-java/awt/color/ICC_ProfileRGB
-java/awt/datatransfer/Clipboard
-java/awt/datatransfer/ClipboardOwner
-java/awt/datatransfer/FlavorMap
-java/awt/datatransfer/FlavorTable
-java/awt/datatransfer/SystemFlavorMap
-java/awt/datatransfer/Transferable
-java/awt/dnd/DropTarget
-java/awt/dnd/DropTargetContext
-java/awt/dnd/DropTargetListener
-java/awt/dnd/peer/DragSourceContextPeer
-java/awt/dnd/peer/DropTargetContextPeer
-java/awt/dnd/peer/DropTargetPeer
-java/awt/event/AWTEventListener
-java/awt/event/AWTEventListenerProxy
-java/awt/event/ActionEvent
-java/awt/event/ActionListener
-java/awt/event/AdjustmentEvent
-java/awt/event/AdjustmentListener
-java/awt/event/ComponentAdapter
-java/awt/event/ComponentEvent
-java/awt/event/ComponentListener
-java/awt/event/ContainerEvent
-java/awt/event/ContainerListener
-java/awt/event/FocusAdapter
-java/awt/event/FocusEvent
-java/awt/event/FocusListener
-java/awt/event/HierarchyBoundsListener
-java/awt/event/HierarchyListener
-java/awt/event/InputEvent
-java/awt/event/InputEvent$1
-java/awt/event/InputMethodEvent
-java/awt/event/InputMethodListener
-java/awt/event/InvocationEvent
-java/awt/event/InvocationEvent$1
-java/awt/event/ItemEvent
-java/awt/event/ItemListener
-java/awt/event/KeyAdapter
-java/awt/event/KeyEvent
-java/awt/event/KeyEvent$1
-java/awt/event/KeyListener
-java/awt/event/MouseAdapter
-java/awt/event/MouseEvent
-java/awt/event/MouseListener
-java/awt/event/MouseMotionAdapter
-java/awt/event/MouseMotionListener
-java/awt/event/MouseWheelListener
-java/awt/event/NativeLibLoader
-java/awt/event/NativeLibLoader$1
-java/awt/event/PaintEvent
-java/awt/event/TextListener
-java/awt/event/WindowAdapter
-java/awt/event/WindowEvent
-java/awt/event/WindowFocusListener
-java/awt/event/WindowListener
-java/awt/event/WindowStateListener
-java/awt/font/FontRenderContext
-java/awt/font/GlyphVector
-java/awt/font/LineMetrics
-java/awt/font/TextAttribute
-java/awt/geom/AffineTransform
-java/awt/geom/Dimension2D
-java/awt/geom/GeneralPath
-java/awt/geom/Line2D
-java/awt/geom/Line2D$Float
-java/awt/geom/Path2D
-java/awt/geom/Path2D$Float
-java/awt/geom/PathIterator
-java/awt/geom/Point2D
-java/awt/geom/Point2D$Float
-java/awt/geom/RectIterator
-java/awt/geom/Rectangle2D
-java/awt/geom/Rectangle2D$Float
-java/awt/geom/RectangularShape
-java/awt/im/InputContext
-java/awt/im/InputMethodRequests
-java/awt/im/spi/InputMethod
-java/awt/im/spi/InputMethodContext
-java/awt/im/spi/InputMethodDescriptor
-java/awt/image/BufferStrategy
-java/awt/image/BufferedImage
-java/awt/image/BufferedImage$1
-java/awt/image/ColorModel
-java/awt/image/ColorModel$1
-java/awt/image/ComponentSampleModel
-java/awt/image/DataBuffer
-java/awt/image/DataBuffer$1
-java/awt/image/DataBufferByte
-java/awt/image/DataBufferInt
-java/awt/image/DirectColorModel
-java/awt/image/FilteredImageSource
-java/awt/image/ImageConsumer
-java/awt/image/ImageFilter
-java/awt/image/ImageObserver
-java/awt/image/ImageProducer
-java/awt/image/IndexColorModel
-java/awt/image/PackedColorModel
-java/awt/image/PixelInterleavedSampleModel
-java/awt/image/RGBImageFilter
-java/awt/image/Raster
-java/awt/image/RenderedImage
-java/awt/image/SampleModel
-java/awt/image/SinglePixelPackedSampleModel
-java/awt/image/VolatileImage
-java/awt/image/WritableRaster
-java/awt/image/WritableRenderedImage
-java/awt/peer/CanvasPeer
-java/awt/peer/ComponentPeer
-java/awt/peer/ContainerPeer
-java/awt/peer/FramePeer
-java/awt/peer/KeyboardFocusManagerPeer
-java/awt/peer/LabelPeer
-java/awt/peer/LightweightPeer
-java/awt/peer/PanelPeer
-java/awt/peer/SystemTrayPeer
-java/awt/peer/WindowPeer
-java/awt/print/PrinterGraphics
-java/beans/ChangeListenerMap
-java/beans/PropertyChangeEvent
-java/beans/PropertyChangeListener
-java/beans/PropertyChangeListenerProxy
-java/beans/PropertyChangeSupport
-java/beans/PropertyChangeSupport$PropertyChangeListenerMap
-java/beans/VetoableChangeListener
-java/io/Bits
-java/io/BufferedInputStream
-java/io/BufferedOutputStream
-java/io/BufferedReader
-java/io/BufferedWriter
-java/io/ByteArrayInputStream
-java/io/ByteArrayOutputStream
-java/io/Closeable
-java/io/DataInput
-java/io/DataInputStream
-java/io/DataOutput
-java/io/DataOutputStream
-java/io/DefaultFileSystem
-java/io/EOFException
-java/io/ExpiringCache
-java/io/ExpiringCache$1
-java/io/ExpiringCache$Entry
-java/io/Externalizable
-java/io/File
-java/io/File$PathStatus
-java/io/FileDescriptor
-java/io/FileDescriptor$1
-java/io/FileInputStream
-java/io/FileInputStream$1
-java/io/FileNotFoundException
-java/io/FileOutputStream
-java/io/FileOutputStream$1
-java/io/FilePermission
-java/io/FilePermission$1
-java/io/FilePermissionCollection
-java/io/FileReader
-java/io/FileSystem
-java/io/FileWriter
-java/io/FilenameFilter
-java/io/FilterInputStream
-java/io/FilterOutputStream
-java/io/FilterReader
-java/io/Flushable
-java/io/IOException
-java/io/InputStream
-java/io/InputStreamReader
-java/io/InterruptedIOException
-java/io/ObjectInput
-java/io/ObjectInputStream
-java/io/ObjectInputStream$BlockDataInputStream
-java/io/ObjectInputStream$GetField
-java/io/ObjectInputStream$GetFieldImpl
-java/io/ObjectInputStream$HandleTable
-java/io/ObjectInputStream$HandleTable$HandleList
-java/io/ObjectInputStream$PeekInputStream
-java/io/ObjectInputStream$ValidationList
-java/io/ObjectOutput
-java/io/ObjectOutputStream
-java/io/ObjectOutputStream$BlockDataOutputStream
-java/io/ObjectOutputStream$HandleTable
-java/io/ObjectOutputStream$ReplaceTable
-java/io/ObjectStreamClass
-java/io/ObjectStreamClass$1
-java/io/ObjectStreamClass$2
-java/io/ObjectStreamClass$3
-java/io/ObjectStreamClass$4
-java/io/ObjectStreamClass$5
-java/io/ObjectStreamClass$Caches
-java/io/ObjectStreamClass$ClassDataSlot
-java/io/ObjectStreamClass$EntryFuture
-java/io/ObjectStreamClass$ExceptionInfo
-java/io/ObjectStreamClass$FieldReflector
-java/io/ObjectStreamClass$FieldReflectorKey
-java/io/ObjectStreamClass$MemberSignature
-java/io/ObjectStreamClass$WeakClassKey
-java/io/ObjectStreamConstants
-java/io/ObjectStreamField
-java/io/OutputStream
-java/io/OutputStreamWriter
-java/io/PrintStream
-java/io/PushbackInputStream
-java/io/RandomAccessFile
-java/io/RandomAccessFile$1
-java/io/Reader
-java/io/SerialCallbackContext
-java/io/Serializable
-java/io/StreamTokenizer
-java/io/StringReader
-java/io/StringWriter
-java/io/UnixFileSystem
-java/io/UnsupportedEncodingException
-java/io/Writer
-java/lang/AbstractStringBuilder
-java/lang/Appendable
-java/lang/ApplicationShutdownHooks
-java/lang/ApplicationShutdownHooks$1
-java/lang/ArithmeticException
-java/lang/ArrayIndexOutOfBoundsException
-java/lang/ArrayStoreException
-java/lang/AutoCloseable
-java/lang/Boolean
-java/lang/BootstrapMethodError
-java/lang/Byte
-java/lang/CharSequence
-java/lang/Character
-java/lang/Character$CharacterCache
-java/lang/CharacterData
-java/lang/CharacterData00
-java/lang/CharacterDataLatin1
-java/lang/Class
-java/lang/Class$1
-java/lang/Class$3
-java/lang/Class$4
-java/lang/Class$AnnotationData
-java/lang/Class$Atomic
-java/lang/Class$ReflectionData
-java/lang/ClassCastException
-java/lang/ClassFormatError
-java/lang/ClassLoader
-java/lang/ClassLoader$2
-java/lang/ClassLoader$3
-java/lang/ClassLoader$NativeLibrary
-java/lang/ClassLoader$ParallelLoaders
-java/lang/ClassNotFoundException
-java/lang/ClassValue$ClassValueMap
-java/lang/CloneNotSupportedException
-java/lang/Cloneable
-java/lang/Comparable
-java/lang/Compiler
-java/lang/Compiler$1
-java/lang/Double
-java/lang/Enum
-java/lang/Error
-java/lang/Exception
-java/lang/ExceptionInInitializerError
-java/lang/Float
-java/lang/IllegalAccessError
-java/lang/IllegalAccessException
-java/lang/IllegalArgumentException
-java/lang/IllegalMonitorStateException
-java/lang/IllegalStateException
-java/lang/IncompatibleClassChangeError
-java/lang/IndexOutOfBoundsException
-java/lang/InheritableThreadLocal
-java/lang/InstantiationException
-java/lang/Integer
-java/lang/Integer$IntegerCache
-java/lang/InternalError
-java/lang/InterruptedException
-java/lang/Iterable
-java/lang/LinkageError
-java/lang/Long
-java/lang/Long$LongCache
-java/lang/Math
-java/lang/NoClassDefFoundError
-java/lang/NoSuchFieldException
-java/lang/NoSuchMethodError
-java/lang/NoSuchMethodException
-java/lang/NullPointerException
-java/lang/Number
-java/lang/NumberFormatException
-java/lang/Object
-java/lang/OutOfMemoryError
-java/lang/Package
-java/lang/Process
-java/lang/ProcessBuilder
-java/lang/ProcessBuilder$NullOutputStream
-java/lang/ProcessEnvironment
-java/lang/ProcessEnvironment$ExternalData
-java/lang/ProcessEnvironment$StringEnvironment
-java/lang/ProcessEnvironment$Value
-java/lang/ProcessEnvironment$Variable
-java/lang/ProcessImpl
-java/lang/Readable
-java/lang/ReflectiveOperationException
-java/lang/Runnable
-java/lang/Runtime
-java/lang/RuntimeException
-java/lang/RuntimePermission
-java/lang/SecurityException
-java/lang/SecurityManager
-java/lang/Short
-java/lang/Shutdown
-java/lang/Shutdown$Lock
-java/lang/StackOverflowError
-java/lang/StackTraceElement
-java/lang/StrictMath
-java/lang/String
-java/lang/String$CaseInsensitiveComparator
-java/lang/StringBuffer
-java/lang/StringBuilder
-java/lang/StringCoding
-java/lang/StringCoding$StringDecoder
-java/lang/StringCoding$StringEncoder
-java/lang/StringIndexOutOfBoundsException
-java/lang/System
-java/lang/System$2
-java/lang/SystemClassLoaderAction
-java/lang/Terminator
-java/lang/Terminator$1
-java/lang/Thread
-java/lang/Thread$State
-java/lang/Thread$UncaughtExceptionHandler
-java/lang/ThreadDeath
-java/lang/ThreadGroup
-java/lang/ThreadLocal
-java/lang/ThreadLocal$ThreadLocalMap
-java/lang/ThreadLocal$ThreadLocalMap$Entry
-java/lang/Throwable
-java/lang/Throwable$PrintStreamOrWriter
-java/lang/Throwable$WrappedPrintStream
-java/lang/UNIXProcess
-java/lang/UNIXProcess$1
-java/lang/UNIXProcess$2
-java/lang/UNIXProcess$3
-java/lang/UNIXProcess$4
-java/lang/UNIXProcess$LaunchMechanism
-java/lang/UNIXProcess$ProcessPipeInputStream
-java/lang/UNIXProcess$ProcessPipeOutputStream
-java/lang/UNIXProcess$ProcessReaperThreadFactory
-java/lang/UNIXProcess$ProcessReaperThreadFactory$1
-java/lang/UnsatisfiedLinkError
-java/lang/UnsupportedOperationException
-java/lang/VirtualMachineError
-java/lang/Void
-java/lang/annotation/Annotation
-java/lang/invoke/CallSite
-java/lang/invoke/ConstantCallSite
-java/lang/invoke/DirectMethodHandle
-java/lang/invoke/Invokers
-java/lang/invoke/LambdaForm
-java/lang/invoke/LambdaForm$NamedFunction
-java/lang/invoke/MemberName
-java/lang/invoke/MemberName$Factory
-java/lang/invoke/MethodHandle
-java/lang/invoke/MethodHandleImpl
-java/lang/invoke/MethodHandleNatives
-java/lang/invoke/MethodHandleStatics
-java/lang/invoke/MethodHandleStatics$1
-java/lang/invoke/MethodType
-java/lang/invoke/MethodType$ConcurrentWeakInternSet
-java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry
-java/lang/invoke/MethodTypeForm
-java/lang/invoke/MutableCallSite
-java/lang/invoke/VolatileCallSite
-java/lang/ref/FinalReference
-java/lang/ref/Finalizer
-java/lang/ref/Finalizer$FinalizerThread
-java/lang/ref/PhantomReference
-java/lang/ref/Reference
-java/lang/ref/Reference$Lock
-java/lang/ref/Reference$ReferenceHandler
-java/lang/ref/ReferenceQueue
-java/lang/ref/ReferenceQueue$Lock
-java/lang/ref/ReferenceQueue$Null
-java/lang/ref/SoftReference
-java/lang/ref/WeakReference
-java/lang/reflect/AccessibleObject
-java/lang/reflect/AnnotatedElement
-java/lang/reflect/Array
-java/lang/reflect/Constructor
-java/lang/reflect/Executable
-java/lang/reflect/Field
-java/lang/reflect/GenericDeclaration
-java/lang/reflect/InvocationHandler
-java/lang/reflect/InvocationTargetException
-java/lang/reflect/Member
-java/lang/reflect/Method
-java/lang/reflect/Modifier
-java/lang/reflect/Parameter
-java/lang/reflect/Proxy
-java/lang/reflect/Proxy$KeyFactory
-java/lang/reflect/Proxy$ProxyClassFactory
-java/lang/reflect/ReflectAccess
-java/lang/reflect/ReflectPermission
-java/lang/reflect/Type
-java/lang/reflect/WeakCache
-java/math/BigInteger
-java/math/BigInteger$UnsafeHolder
-java/math/MutableBigInteger
-java/math/RoundingMode
-java/math/SignedMutableBigInteger
-java/net/AbstractPlainDatagramSocketImpl
-java/net/AbstractPlainDatagramSocketImpl$1
-java/net/AbstractPlainSocketImpl
-java/net/AbstractPlainSocketImpl$1
-java/net/Authenticator
-java/net/BindException
-java/net/ConnectException
-java/net/DatagramPacket
-java/net/DatagramPacket$1
-java/net/DatagramSocket
-java/net/DatagramSocket$1
-java/net/DatagramSocketImpl
-java/net/DefaultDatagramSocketImplFactory
-java/net/DefaultInterface
-java/net/FileNameMap
-java/net/HttpURLConnection
-java/net/Inet4Address
-java/net/Inet4AddressImpl
-java/net/Inet6Address
-java/net/Inet6Address$Inet6AddressHolder
-java/net/Inet6AddressImpl
-java/net/InetAddress
-java/net/InetAddress$1
-java/net/InetAddress$2
-java/net/InetAddress$Cache
-java/net/InetAddress$Cache$Type
-java/net/InetAddress$CacheEntry
-java/net/InetAddress$InetAddressHolder
-java/net/InetAddressImpl
-java/net/InetAddressImplFactory
-java/net/InetSocketAddress
-java/net/InetSocketAddress$InetSocketAddressHolder
-java/net/InterfaceAddress
-java/net/JarURLConnection
-java/net/MalformedURLException
-java/net/MulticastSocket
-java/net/NetworkInterface
-java/net/NetworkInterface$1
-java/net/NoRouteToHostException
-java/net/Parts
-java/net/PlainDatagramSocketImpl
-java/net/PlainSocketImpl
-java/net/Proxy
-java/net/Proxy$Type
-java/net/ProxySelector
-java/net/ServerSocket
-java/net/Socket
-java/net/SocketAddress
-java/net/SocketException
-java/net/SocketImpl
-java/net/SocketImplFactory
-java/net/SocketOptions
-java/net/SocksConsts
-java/net/SocksSocketImpl
-java/net/SocksSocketImpl$3
-java/net/URI
-java/net/URI$Parser
-java/net/URL
-java/net/URLClassLoader
-java/net/URLClassLoader$1
-java/net/URLClassLoader$2
-java/net/URLClassLoader$3
-java/net/URLClassLoader$3$1
-java/net/URLClassLoader$7
-java/net/URLConnection
-java/net/URLConnection$1
-java/net/URLStreamHandler
-java/net/URLStreamHandlerFactory
-java/net/UnknownHostException
-java/nio/Bits
-java/nio/Bits$1
-java/nio/Buffer
-java/nio/ByteBuffer
-java/nio/ByteBufferAsIntBufferB
-java/nio/ByteBufferAsShortBufferB
-java/nio/ByteOrder
-java/nio/CharBuffer
-java/nio/DirectByteBuffer
-java/nio/DirectByteBuffer$Deallocator
-java/nio/DirectByteBufferR
-java/nio/DirectLongBufferU
-java/nio/HeapByteBuffer
-java/nio/HeapCharBuffer
-java/nio/IntBuffer
-java/nio/LongBuffer
-java/nio/MappedByteBuffer
-java/nio/ShortBuffer
-java/nio/channels/ByteChannel
-java/nio/channels/Channel
-java/nio/channels/FileChannel
-java/nio/channels/FileChannel$MapMode
-java/nio/channels/GatheringByteChannel
-java/nio/channels/InterruptibleChannel
-java/nio/channels/NetworkChannel
-java/nio/channels/ReadableByteChannel
-java/nio/channels/ScatteringByteChannel
-java/nio/channels/SeekableByteChannel
-java/nio/channels/SelectableChannel
-java/nio/channels/SocketChannel
-java/nio/channels/WritableByteChannel
-java/nio/channels/spi/AbstractInterruptibleChannel
-java/nio/channels/spi/AbstractInterruptibleChannel$1
-java/nio/channels/spi/AbstractSelectableChannel
-java/nio/charset/Charset
-java/nio/charset/CharsetDecoder
-java/nio/charset/CharsetEncoder
-java/nio/charset/CoderResult
-java/nio/charset/CoderResult$1
-java/nio/charset/CoderResult$2
-java/nio/charset/CoderResult$Cache
-java/nio/charset/CodingErrorAction
-java/nio/charset/StandardCharsets
-java/nio/charset/spi/CharsetProvider
-java/nio/file/Path
-java/nio/file/Watchable
-java/nio/file/attribute/FileAttribute
-java/security/AccessControlContext
-java/security/AccessController
-java/security/AlgorithmParameters
-java/security/AlgorithmParametersSpi
-java/security/AllPermission
-java/security/AllPermissionCollection
-java/security/BasicPermission
-java/security/BasicPermissionCollection
-java/security/CodeSigner
-java/security/CodeSource
-java/security/GeneralSecurityException
-java/security/Guard
-java/security/InvalidKeyException
-java/security/Key
-java/security/KeyException
-java/security/MessageDigest
-java/security/MessageDigest$Delegate
-java/security/MessageDigestSpi
-java/security/NoSuchAlgorithmException
-java/security/Permission
-java/security/PermissionCollection
-java/security/Permissions
-java/security/Principal
-java/security/PrivateKey
-java/security/PrivilegedAction
-java/security/PrivilegedActionException
-java/security/PrivilegedExceptionAction
-java/security/ProtectionDomain
-java/security/ProtectionDomain$1
-java/security/ProtectionDomain$3
-java/security/ProtectionDomain$Key
-java/security/Provider
-java/security/Provider$EngineDescription
-java/security/Provider$Service
-java/security/Provider$ServiceKey
-java/security/Provider$UString
-java/security/PublicKey
-java/security/SecureClassLoader
-java/security/SecureRandomSpi
-java/security/Security
-java/security/Security$1
-java/security/Signature
-java/security/Signature$Delegate
-java/security/SignatureException
-java/security/SignatureSpi
-java/security/UnresolvedPermission
-java/security/cert/Certificate
-java/security/interfaces/DSAKey
-java/security/interfaces/DSAParams
-java/security/interfaces/DSAPrivateKey
-java/security/interfaces/DSAPublicKey
-java/security/spec/AlgorithmParameterSpec
-java/security/spec/DSAParameterSpec
-java/text/AttributedCharacterIterator$Attribute
-java/text/CharacterIterator
-java/text/Collator
-java/text/DateFormat
-java/text/DateFormat$Field
-java/text/DateFormatSymbols
-java/text/DecimalFormat
-java/text/DecimalFormatSymbols
-java/text/DigitList
-java/text/DontCareFieldPosition
-java/text/DontCareFieldPosition$1
-java/text/EntryPair
-java/text/FieldPosition
-java/text/Format
-java/text/Format$Field
-java/text/Format$FieldDelegate
-java/text/MergeCollation
-java/text/MessageFormat
-java/text/MessageFormat$Field
-java/text/NumberFormat
-java/text/NumberFormat$Field
-java/text/ParseException
-java/text/PatternEntry
-java/text/PatternEntry$Parser
-java/text/RBCollationTables
-java/text/RBCollationTables$BuildAPI
-java/text/RBTableBuilder
-java/text/RuleBasedCollator
-java/text/SimpleDateFormat
-java/text/spi/BreakIteratorProvider
-java/text/spi/CollatorProvider
-java/text/spi/DateFormatProvider
-java/text/spi/DateFormatSymbolsProvider
-java/text/spi/DecimalFormatSymbolsProvider
-java/text/spi/NumberFormatProvider
-java/util/AbstractCollection
-java/util/AbstractList
-java/util/AbstractList$Itr
-java/util/AbstractList$ListItr
-java/util/AbstractMap
-java/util/AbstractQueue
-java/util/AbstractSequentialList
-java/util/AbstractSet
-java/util/ArrayDeque
-java/util/ArrayList
-java/util/ArrayList$Itr
-java/util/ArrayList$ListItr
-java/util/ArrayList$SubList
-java/util/ArrayList$SubList$1
-java/util/Arrays
-java/util/Arrays$ArrayList
-java/util/Arrays$LegacyMergeSort
-java/util/BitSet
-java/util/Calendar
-java/util/Calendar$Builder
-java/util/Collection
-java/util/Collections
-java/util/Collections$3
-java/util/Collections$EmptyEnumeration
-java/util/Collections$EmptyIterator
-java/util/Collections$EmptyList
-java/util/Collections$EmptyMap
-java/util/Collections$EmptySet
-java/util/Collections$SetFromMap
-java/util/Collections$SynchronizedCollection
-java/util/Collections$SynchronizedMap
-java/util/Collections$SynchronizedSet
-java/util/Collections$UnmodifiableCollection
-java/util/Collections$UnmodifiableCollection$1
-java/util/Collections$UnmodifiableList
-java/util/Collections$UnmodifiableList$1
-java/util/Collections$UnmodifiableMap
-java/util/Collections$UnmodifiableRandomAccessList
-java/util/Collections$UnmodifiableSet
-java/util/ComparableTimSort
-java/util/Comparator
-java/util/Currency
-java/util/Currency$1
-java/util/Currency$CurrencyNameGetter
-java/util/Date
-java/util/Deque
-java/util/Dictionary
-java/util/Enumeration
-java/util/EventListener
-java/util/EventListenerProxy
-java/util/EventObject
-java/util/GregorianCalendar
-java/util/HashMap
-java/util/HashMap$EntryIterator
-java/util/HashMap$EntrySet
-java/util/HashMap$HashIterator
-java/util/HashMap$KeyIterator
-java/util/HashMap$KeySet
-java/util/HashMap$Node
-java/util/HashMap$TreeNode
-java/util/HashMap$ValueIterator
-java/util/HashMap$Values
-java/util/HashSet
-java/util/Hashtable
-java/util/Hashtable$Entry
-java/util/Hashtable$EntrySet
-java/util/Hashtable$Enumerator
-java/util/Hashtable$ValueCollection
-java/util/IdentityHashMap
-java/util/IdentityHashMap$IdentityHashMapIterator
-java/util/IdentityHashMap$KeyIterator
-java/util/IdentityHashMap$KeySet
-java/util/IdentityHashMap$ValueIterator
-java/util/IdentityHashMap$Values
-java/util/Iterator
-java/util/LinkedHashMap
-java/util/LinkedHashMap$Entry
-java/util/LinkedHashMap$LinkedEntryIterator
-java/util/LinkedHashMap$LinkedEntrySet
-java/util/LinkedHashMap$LinkedHashIterator
-java/util/LinkedHashMap$LinkedKeyIterator
-java/util/LinkedHashMap$LinkedKeySet
-java/util/LinkedList
-java/util/LinkedList$ListItr
-java/util/LinkedList$Node
-java/util/List
-java/util/ListIterator
-java/util/ListResourceBundle
-java/util/Locale
-java/util/Locale$1
-java/util/Locale$Cache
-java/util/Locale$Category
-java/util/Locale$LocaleKey
-java/util/Map
-java/util/Map$Entry
-java/util/MissingResourceException
-java/util/NavigableMap
-java/util/Objects
-java/util/PriorityQueue
-java/util/Properties
-java/util/Properties$LineReader
-java/util/PropertyResourceBundle
-java/util/Queue
-java/util/Random
-java/util/RandomAccess
-java/util/ResourceBundle
-java/util/ResourceBundle$1
-java/util/ResourceBundle$BundleReference
-java/util/ResourceBundle$CacheKey
-java/util/ResourceBundle$CacheKeyReference
-java/util/ResourceBundle$Control
-java/util/ResourceBundle$Control$1
-java/util/ResourceBundle$Control$CandidateListCache
-java/util/ResourceBundle$LoaderReference
-java/util/ResourceBundle$RBClassLoader
-java/util/ResourceBundle$RBClassLoader$1
-java/util/ResourceBundle$SingleFormatControl
-java/util/ServiceLoader
-java/util/ServiceLoader$1
-java/util/ServiceLoader$LazyIterator
-java/util/Set
-java/util/SortedMap
-java/util/Stack
-java/util/StringTokenizer
-java/util/TimSort
-java/util/TimeZone
-java/util/TimeZone$1
-java/util/TreeMap
-java/util/TreeMap$Entry
-java/util/Vector
-java/util/Vector$1
-java/util/Vector$Itr
-java/util/Vector$ListItr
-java/util/WeakHashMap
-java/util/WeakHashMap$Entry
-java/util/WeakHashMap$KeySet
-java/util/concurrent/AbstractExecutorService
-java/util/concurrent/BlockingQueue
-java/util/concurrent/ConcurrentHashMap
-java/util/concurrent/ConcurrentHashMap$BaseIterator
-java/util/concurrent/ConcurrentHashMap$CollectionView
-java/util/concurrent/ConcurrentHashMap$CounterCell
-java/util/concurrent/ConcurrentHashMap$EntrySetView
-java/util/concurrent/ConcurrentHashMap$ForwardingNode
-java/util/concurrent/ConcurrentHashMap$KeyIterator
-java/util/concurrent/ConcurrentHashMap$KeySetView
-java/util/concurrent/ConcurrentHashMap$Node
-java/util/concurrent/ConcurrentHashMap$Segment
-java/util/concurrent/ConcurrentHashMap$Traverser
-java/util/concurrent/ConcurrentHashMap$ValueIterator
-java/util/concurrent/ConcurrentHashMap$ValuesView
-java/util/concurrent/ConcurrentMap
-java/util/concurrent/CopyOnWriteArrayList
-java/util/concurrent/DelayQueue
-java/util/concurrent/Delayed
-java/util/concurrent/Executor
-java/util/concurrent/ExecutorService
-java/util/concurrent/Executors
-java/util/concurrent/RejectedExecutionHandler
-java/util/concurrent/SynchronousQueue
-java/util/concurrent/SynchronousQueue$TransferStack
-java/util/concurrent/SynchronousQueue$TransferStack$SNode
-java/util/concurrent/SynchronousQueue$Transferer
-java/util/concurrent/ThreadFactory
-java/util/concurrent/ThreadPoolExecutor
-java/util/concurrent/ThreadPoolExecutor$AbortPolicy
-java/util/concurrent/ThreadPoolExecutor$Worker
-java/util/concurrent/TimeUnit
-java/util/concurrent/TimeUnit$1
-java/util/concurrent/TimeUnit$2
-java/util/concurrent/TimeUnit$3
-java/util/concurrent/TimeUnit$4
-java/util/concurrent/TimeUnit$5
-java/util/concurrent/TimeUnit$6
-java/util/concurrent/TimeUnit$7
-java/util/concurrent/atomic/AtomicBoolean
-java/util/concurrent/atomic/AtomicInteger
-java/util/concurrent/atomic/AtomicLong
-java/util/concurrent/atomic/AtomicMarkableReference
-java/util/concurrent/atomic/AtomicMarkableReference$Pair
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1
-java/util/concurrent/locks/AbstractOwnableSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject
-java/util/concurrent/locks/AbstractQueuedSynchronizer$Node
-java/util/concurrent/locks/Condition
-java/util/concurrent/locks/Lock
-java/util/concurrent/locks/LockSupport
-java/util/concurrent/locks/ReentrantLock
-java/util/concurrent/locks/ReentrantLock$NonfairSync
-java/util/concurrent/locks/ReentrantLock$Sync
-java/util/function/BiFunction
-java/util/jar/Attributes
-java/util/jar/Attributes$Name
-java/util/jar/JarEntry
-java/util/jar/JarFile
-java/util/jar/JarFile$JarEntryIterator
-java/util/jar/JarFile$JarFileEntry
-java/util/jar/JarVerifier
-java/util/jar/JarVerifier$3
-java/util/jar/JavaUtilJarAccessImpl
-java/util/jar/Manifest
-java/util/jar/Manifest$FastInputStream
-java/util/logging/Handler
-java/util/logging/Level
-java/util/logging/Level$KnownLevel
-java/util/logging/LogManager
-java/util/logging/LogManager$1
-java/util/logging/LogManager$2
-java/util/logging/LogManager$3
-java/util/logging/LogManager$5
-java/util/logging/LogManager$Cleaner
-java/util/logging/LogManager$LogNode
-java/util/logging/LogManager$LoggerContext
-java/util/logging/LogManager$LoggerContext$1
-java/util/logging/LogManager$LoggerWeakRef
-java/util/logging/LogManager$RootLogger
-java/util/logging/LogManager$SystemLoggerContext
-java/util/logging/Logger
-java/util/logging/Logger$1
-java/util/logging/LoggingPermission
-java/util/logging/LoggingProxyImpl
-java/util/spi/CalendarDataProvider
-java/util/spi/CurrencyNameProvider
-java/util/spi/LocaleNameProvider
-java/util/spi/LocaleServiceProvider
-java/util/spi/ResourceBundleControlProvider
-java/util/spi/TimeZoneNameProvider
-java/util/zip/CRC32
-java/util/zip/Checksum
-java/util/zip/DeflaterOutputStream
-java/util/zip/GZIPInputStream
-java/util/zip/Inflater
-java/util/zip/InflaterInputStream
-java/util/zip/ZStreamRef
-java/util/zip/ZipCoder
-java/util/zip/ZipConstants
-java/util/zip/ZipEntry
-java/util/zip/ZipFile
-java/util/zip/ZipFile$1
-java/util/zip/ZipFile$ZipEntryIterator
-java/util/zip/ZipFile$ZipFileInflaterInputStream
-java/util/zip/ZipFile$ZipFileInputStream
-java/util/zip/ZipInputStream
-java/util/zip/ZipUtils
-javax/accessibility/Accessible
-javax/accessibility/AccessibleAction
-javax/accessibility/AccessibleBundle
-javax/accessibility/AccessibleComponent
-javax/accessibility/AccessibleContext
-javax/accessibility/AccessibleExtendedComponent
-javax/accessibility/AccessibleRelationSet
-javax/accessibility/AccessibleState
-javax/accessibility/AccessibleText
-javax/accessibility/AccessibleValue
-javax/security/auth/Destroyable
-javax/sound/sampled/Control$Type
-javax/sound/sampled/DataLine
-javax/sound/sampled/DataLine$Info
-javax/sound/sampled/FloatControl$Type
-javax/sound/sampled/Line
-javax/sound/sampled/Line$Info
-javax/sound/sampled/LineUnavailableException
-javax/sound/sampled/UnsupportedAudioFileException
-javax/swing/AbstractAction
-javax/swing/AbstractButton
-javax/swing/AbstractButton$AccessibleAbstractButton
-javax/swing/AbstractButton$Handler
-javax/swing/AbstractCellEditor
-javax/swing/AbstractListModel
-javax/swing/Action
-javax/swing/ActionMap
-javax/swing/AncestorNotifier
-javax/swing/ArrayTable
-javax/swing/BorderFactory
-javax/swing/BoundedRangeModel
-javax/swing/Box
-javax/swing/Box$Filler
-javax/swing/BoxLayout
-javax/swing/BufferStrategyPaintManager
-javax/swing/BufferStrategyPaintManager$BufferInfo
-javax/swing/ButtonGroup
-javax/swing/ButtonModel
-javax/swing/CellEditor
-javax/swing/CellRendererPane
-javax/swing/ClientPropertyKey
-javax/swing/ClientPropertyKey$1
-javax/swing/ComboBoxEditor
-javax/swing/ComboBoxModel
-javax/swing/ComponentInputMap
-javax/swing/DefaultBoundedRangeModel
-javax/swing/DefaultButtonModel
-javax/swing/DefaultCellEditor
-javax/swing/DefaultCellEditor$1
-javax/swing/DefaultCellEditor$EditorDelegate
-javax/swing/DefaultComboBoxModel
-javax/swing/DefaultListCellRenderer
-javax/swing/DefaultListCellRenderer$UIResource
-javax/swing/DefaultListModel
-javax/swing/DefaultListSelectionModel
-javax/swing/DefaultSingleSelectionModel
-javax/swing/DropMode
-javax/swing/FocusManager
-javax/swing/GrayFilter
-javax/swing/Icon
-javax/swing/ImageIcon
-javax/swing/ImageIcon$1
-javax/swing/ImageIcon$2
-javax/swing/ImageIcon$2$1
-javax/swing/ImageIcon$3
-javax/swing/InputMap
-javax/swing/InternalFrameFocusTraversalPolicy
-javax/swing/JButton
-javax/swing/JCheckBox
-javax/swing/JCheckBoxMenuItem
-javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem
-javax/swing/JComboBox
-javax/swing/JComboBox$1
-javax/swing/JComboBox$KeySelectionManager
-javax/swing/JComponent
-javax/swing/JComponent$1
-javax/swing/JComponent$2
-javax/swing/JComponent$AccessibleJComponent
-javax/swing/JDialog
-javax/swing/JEditorPane
-javax/swing/JFrame
-javax/swing/JInternalFrame
-javax/swing/JLabel
-javax/swing/JLayer
-javax/swing/JLayeredPane
-javax/swing/JList
-javax/swing/JList$3
-javax/swing/JList$ListSelectionHandler
-javax/swing/JMenu
-javax/swing/JMenu$MenuChangeListener
-javax/swing/JMenu$WinListener
-javax/swing/JMenuBar
-javax/swing/JMenuItem
-javax/swing/JMenuItem$AccessibleJMenuItem
-javax/swing/JMenuItem$MenuItemFocusListener
-javax/swing/JPanel
-javax/swing/JPopupMenu
-javax/swing/JPopupMenu$Separator
-javax/swing/JProgressBar
-javax/swing/JProgressBar$ModelListener
-javax/swing/JRadioButton
-javax/swing/JRadioButtonMenuItem
-javax/swing/JRootPane
-javax/swing/JRootPane$1
-javax/swing/JRootPane$RootLayout
-javax/swing/JScrollBar
-javax/swing/JScrollBar$ModelListener
-javax/swing/JScrollPane
-javax/swing/JScrollPane$ScrollBar
-javax/swing/JSeparator
-javax/swing/JSlider
-javax/swing/JSlider$ModelListener
-javax/swing/JSplitPane
-javax/swing/JTabbedPane
-javax/swing/JTabbedPane$ModelListener
-javax/swing/JTabbedPane$Page
-javax/swing/JTable
-javax/swing/JTable$2
-javax/swing/JTable$5
-javax/swing/JTable$Resizable2
-javax/swing/JTable$Resizable3
-javax/swing/JTextArea
-javax/swing/JTextField
-javax/swing/JTextField$NotifyAction
-javax/swing/JTextField$ScrollRepainter
-javax/swing/JToggleButton
-javax/swing/JToggleButton$ToggleButtonModel
-javax/swing/JToolBar
-javax/swing/JToolBar$DefaultToolBarLayout
-javax/swing/JToolBar$Separator
-javax/swing/JToolTip
-javax/swing/JTree
-javax/swing/JTree$TreeModelHandler
-javax/swing/JTree$TreeSelectionRedirector
-javax/swing/JViewport
-javax/swing/JViewport$ViewListener
-javax/swing/JWindow
-javax/swing/KeyStroke
-javax/swing/KeyboardManager
-javax/swing/KeyboardManager$ComponentKeyStrokePair
-javax/swing/LayoutComparator
-javax/swing/LayoutFocusTraversalPolicy
-javax/swing/ListCellRenderer
-javax/swing/ListModel
-javax/swing/ListSelectionModel
-javax/swing/LookAndFeel
-javax/swing/MenuElement
-javax/swing/MenuSelectionManager
-javax/swing/MultiUIDefaults
-javax/swing/MutableComboBoxModel
-javax/swing/RepaintManager
-javax/swing/RepaintManager$2
-javax/swing/RepaintManager$3
-javax/swing/RepaintManager$DisplayChangedHandler
-javax/swing/RepaintManager$PaintManager
-javax/swing/RepaintManager$ProcessingRunnable
-javax/swing/RootPaneContainer
-javax/swing/ScrollPaneConstants
-javax/swing/ScrollPaneLayout
-javax/swing/ScrollPaneLayout$UIResource
-javax/swing/Scrollable
-javax/swing/SingleSelectionModel
-javax/swing/SizeRequirements
-javax/swing/SortingFocusTraversalPolicy
-javax/swing/SwingConstants
-javax/swing/SwingContainerOrderFocusTraversalPolicy
-javax/swing/SwingDefaultFocusTraversalPolicy
-javax/swing/SwingPaintEventDispatcher
-javax/swing/SwingUtilities
-javax/swing/SwingUtilities$SharedOwnerFrame
-javax/swing/Timer
-javax/swing/Timer$DoPostEvent
-javax/swing/TimerQueue
-javax/swing/TimerQueue$1
-javax/swing/TimerQueue$DelayedTimer
-javax/swing/ToolTipManager
-javax/swing/ToolTipManager$AccessibilityKeyListener
-javax/swing/ToolTipManager$MoveBeforeEnterListener
-javax/swing/ToolTipManager$insideTimerAction
-javax/swing/ToolTipManager$outsideTimerAction
-javax/swing/ToolTipManager$stillInsideTimerAction
-javax/swing/TransferHandler
-javax/swing/TransferHandler$DropHandler
-javax/swing/TransferHandler$HasGetTransferHandler
-javax/swing/TransferHandler$SwingDropTarget
-javax/swing/TransferHandler$TransferAction
-javax/swing/TransferHandler$TransferSupport
-javax/swing/UIDefaults
-javax/swing/UIDefaults$ActiveValue
-javax/swing/UIDefaults$LazyInputMap
-javax/swing/UIDefaults$LazyValue
-javax/swing/UIDefaults$TextAndMnemonicHashMap
-javax/swing/UIManager
-javax/swing/UIManager$1
-javax/swing/UIManager$2
-javax/swing/UIManager$LAFState
-javax/swing/UIManager$LookAndFeelInfo
-javax/swing/UnsupportedLookAndFeelException
-javax/swing/ViewportLayout
-javax/swing/WindowConstants
-javax/swing/border/AbstractBorder
-javax/swing/border/BevelBorder
-javax/swing/border/Border
-javax/swing/border/CompoundBorder
-javax/swing/border/EmptyBorder
-javax/swing/border/EtchedBorder
-javax/swing/border/LineBorder
-javax/swing/border/MatteBorder
-javax/swing/border/TitledBorder
-javax/swing/event/AncestorEvent
-javax/swing/event/AncestorListener
-javax/swing/event/CaretEvent
-javax/swing/event/CaretListener
-javax/swing/event/CellEditorListener
-javax/swing/event/ChangeEvent
-javax/swing/event/ChangeListener
-javax/swing/event/DocumentEvent
-javax/swing/event/DocumentEvent$ElementChange
-javax/swing/event/DocumentEvent$EventType
-javax/swing/event/DocumentListener
-javax/swing/event/EventListenerList
-javax/swing/event/ListDataEvent
-javax/swing/event/ListDataListener
-javax/swing/event/ListSelectionEvent
-javax/swing/event/ListSelectionListener
-javax/swing/event/MenuDragMouseListener
-javax/swing/event/MenuEvent
-javax/swing/event/MenuKeyListener
-javax/swing/event/MenuListener
-javax/swing/event/MouseInputAdapter
-javax/swing/event/MouseInputListener
-javax/swing/event/PopupMenuListener
-javax/swing/event/RowSorterListener
-javax/swing/event/SwingPropertyChangeSupport
-javax/swing/event/TableColumnModelEvent
-javax/swing/event/TableColumnModelListener
-javax/swing/event/TableModelEvent
-javax/swing/event/TableModelListener
-javax/swing/event/TreeExpansionListener
-javax/swing/event/TreeModelEvent
-javax/swing/event/TreeModelListener
-javax/swing/event/TreeSelectionEvent
-javax/swing/event/TreeSelectionListener
-javax/swing/event/UndoableEditEvent
-javax/swing/event/UndoableEditListener
-javax/swing/filechooser/FileFilter
-javax/swing/plaf/ActionMapUIResource
-javax/swing/plaf/BorderUIResource
-javax/swing/plaf/BorderUIResource$CompoundBorderUIResource
-javax/swing/plaf/BorderUIResource$EmptyBorderUIResource
-javax/swing/plaf/BorderUIResource$LineBorderUIResource
-javax/swing/plaf/ButtonUI
-javax/swing/plaf/ColorUIResource
-javax/swing/plaf/ComboBoxUI
-javax/swing/plaf/ComponentInputMapUIResource
-javax/swing/plaf/ComponentUI
-javax/swing/plaf/DimensionUIResource
-javax/swing/plaf/FontUIResource
-javax/swing/plaf/InputMapUIResource
-javax/swing/plaf/InsetsUIResource
-javax/swing/plaf/LabelUI
-javax/swing/plaf/ListUI
-javax/swing/plaf/MenuBarUI
-javax/swing/plaf/MenuItemUI
-javax/swing/plaf/PanelUI
-javax/swing/plaf/PopupMenuUI
-javax/swing/plaf/ProgressBarUI
-javax/swing/plaf/RootPaneUI
-javax/swing/plaf/ScrollBarUI
-javax/swing/plaf/ScrollPaneUI
-javax/swing/plaf/SeparatorUI
-javax/swing/plaf/SliderUI
-javax/swing/plaf/SplitPaneUI
-javax/swing/plaf/TabbedPaneUI
-javax/swing/plaf/TableHeaderUI
-javax/swing/plaf/TableUI
-javax/swing/plaf/TextUI
-javax/swing/plaf/ToolBarUI
-javax/swing/plaf/TreeUI
-javax/swing/plaf/UIResource
-javax/swing/plaf/ViewportUI
-javax/swing/plaf/basic/BasicArrowButton
-javax/swing/plaf/basic/BasicBorders
-javax/swing/plaf/basic/BasicBorders$ButtonBorder
-javax/swing/plaf/basic/BasicBorders$MarginBorder
-javax/swing/plaf/basic/BasicBorders$RadioButtonBorder
-javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder
-javax/swing/plaf/basic/BasicBorders$SplitPaneBorder
-javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder
-javax/swing/plaf/basic/BasicButtonListener
-javax/swing/plaf/basic/BasicButtonUI
-javax/swing/plaf/basic/BasicCheckBoxMenuItemUI
-javax/swing/plaf/basic/BasicComboBoxEditor
-javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField
-javax/swing/plaf/basic/BasicComboBoxEditor$UIResource
-javax/swing/plaf/basic/BasicComboBoxRenderer
-javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource
-javax/swing/plaf/basic/BasicComboBoxUI
-javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager
-javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager
-javax/swing/plaf/basic/BasicComboBoxUI$Handler
-javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicComboPopup
-javax/swing/plaf/basic/BasicComboPopup$1
-javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass
-javax/swing/plaf/basic/BasicComboPopup$Handler
-javax/swing/plaf/basic/BasicGraphicsUtils
-javax/swing/plaf/basic/BasicHTML
-javax/swing/plaf/basic/BasicLabelUI
-javax/swing/plaf/basic/BasicListUI
-javax/swing/plaf/basic/BasicListUI$Handler
-javax/swing/plaf/basic/BasicListUI$ListTransferHandler
-javax/swing/plaf/basic/BasicLookAndFeel
-javax/swing/plaf/basic/BasicLookAndFeel$1
-javax/swing/plaf/basic/BasicLookAndFeel$2
-javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper
-javax/swing/plaf/basic/BasicMenuBarUI
-javax/swing/plaf/basic/BasicMenuBarUI$Handler
-javax/swing/plaf/basic/BasicMenuItemUI
-javax/swing/plaf/basic/BasicMenuItemUI$Handler
-javax/swing/plaf/basic/BasicMenuUI
-javax/swing/plaf/basic/BasicMenuUI$Handler
-javax/swing/plaf/basic/BasicPanelUI
-javax/swing/plaf/basic/BasicPopupMenuUI
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1
-javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber
-javax/swing/plaf/basic/BasicProgressBarUI
-javax/swing/plaf/basic/BasicProgressBarUI$Handler
-javax/swing/plaf/basic/BasicRadioButtonMenuItemUI
-javax/swing/plaf/basic/BasicRadioButtonUI
-javax/swing/plaf/basic/BasicRootPaneUI
-javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap
-javax/swing/plaf/basic/BasicScrollBarUI
-javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener
-javax/swing/plaf/basic/BasicScrollBarUI$Handler
-javax/swing/plaf/basic/BasicScrollBarUI$ModelListener
-javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener
-javax/swing/plaf/basic/BasicScrollBarUI$TrackListener
-javax/swing/plaf/basic/BasicScrollPaneUI
-javax/swing/plaf/basic/BasicScrollPaneUI$Handler
-javax/swing/plaf/basic/BasicSeparatorUI
-javax/swing/plaf/basic/BasicSliderUI
-javax/swing/plaf/basic/BasicSliderUI$Actions
-javax/swing/plaf/basic/BasicSliderUI$Handler
-javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicSliderUI$ScrollListener
-javax/swing/plaf/basic/BasicSliderUI$TrackListener
-javax/swing/plaf/basic/BasicSplitPaneDivider
-javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout
-javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler
-javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler
-javax/swing/plaf/basic/BasicSplitPaneUI
-javax/swing/plaf/basic/BasicSplitPaneUI$1
-javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager
-javax/swing/plaf/basic/BasicSplitPaneUI$Handler
-javax/swing/plaf/basic/BasicTabbedPaneUI
-javax/swing/plaf/basic/BasicTabbedPaneUI$Handler
-javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout
-javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout
-javax/swing/plaf/basic/BasicTableHeaderUI
-javax/swing/plaf/basic/BasicTableHeaderUI$1
-javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler
-javax/swing/plaf/basic/BasicTableUI
-javax/swing/plaf/basic/BasicTableUI$Handler
-javax/swing/plaf/basic/BasicTableUI$TableTransferHandler
-javax/swing/plaf/basic/BasicTextAreaUI
-javax/swing/plaf/basic/BasicTextFieldUI
-javax/swing/plaf/basic/BasicTextUI
-javax/swing/plaf/basic/BasicTextUI$BasicCaret
-javax/swing/plaf/basic/BasicTextUI$BasicCursor
-javax/swing/plaf/basic/BasicTextUI$BasicHighlighter
-javax/swing/plaf/basic/BasicTextUI$DragListener
-javax/swing/plaf/basic/BasicTextUI$FocusAction
-javax/swing/plaf/basic/BasicTextUI$RootView
-javax/swing/plaf/basic/BasicTextUI$TextActionWrapper
-javax/swing/plaf/basic/BasicTextUI$TextTransferHandler
-javax/swing/plaf/basic/BasicTextUI$UpdateHandler
-javax/swing/plaf/basic/BasicToggleButtonUI
-javax/swing/plaf/basic/BasicToolBarSeparatorUI
-javax/swing/plaf/basic/BasicToolBarUI
-javax/swing/plaf/basic/BasicToolBarUI$DockingListener
-javax/swing/plaf/basic/BasicToolBarUI$Handler
-javax/swing/plaf/basic/BasicTreeUI
-javax/swing/plaf/basic/BasicTreeUI$Actions
-javax/swing/plaf/basic/BasicTreeUI$Handler
-javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler
-javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler
-javax/swing/plaf/basic/BasicViewportUI
-javax/swing/plaf/basic/ComboPopup
-javax/swing/plaf/basic/DefaultMenuLayout
-javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag
-javax/swing/plaf/basic/LazyActionMap
-javax/swing/plaf/metal/DefaultMetalTheme
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1
-javax/swing/plaf/metal/MetalBorders
-javax/swing/plaf/metal/MetalBorders$ButtonBorder
-javax/swing/plaf/metal/MetalBorders$Flush3DBorder
-javax/swing/plaf/metal/MetalBorders$MenuBarBorder
-javax/swing/plaf/metal/MetalBorders$MenuItemBorder
-javax/swing/plaf/metal/MetalBorders$PopupMenuBorder
-javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder
-javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder
-javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder
-javax/swing/plaf/metal/MetalBorders$TextFieldBorder
-javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder
-javax/swing/plaf/metal/MetalBorders$ToolBarBorder
-javax/swing/plaf/metal/MetalBumps
-javax/swing/plaf/metal/MetalButtonUI
-javax/swing/plaf/metal/MetalCheckBoxUI
-javax/swing/plaf/metal/MetalComboBoxButton
-javax/swing/plaf/metal/MetalComboBoxButton$1
-javax/swing/plaf/metal/MetalComboBoxEditor
-javax/swing/plaf/metal/MetalComboBoxEditor$1
-javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder
-javax/swing/plaf/metal/MetalComboBoxEditor$UIResource
-javax/swing/plaf/metal/MetalComboBoxIcon
-javax/swing/plaf/metal/MetalComboBoxUI
-javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager
-javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener
-javax/swing/plaf/metal/MetalIconFactory
-javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon
-javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon
-javax/swing/plaf/metal/MetalIconFactory$FolderIcon16
-javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon
-javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon
-javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon
-javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon
-javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon
-javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon
-javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon
-javax/swing/plaf/metal/MetalLabelUI
-javax/swing/plaf/metal/MetalLookAndFeel
-javax/swing/plaf/metal/MetalLookAndFeel$AATextListener
-javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue
-javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue
-javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue$1
-javax/swing/plaf/metal/MetalPopupMenuSeparatorUI
-javax/swing/plaf/metal/MetalProgressBarUI
-javax/swing/plaf/metal/MetalRadioButtonUI
-javax/swing/plaf/metal/MetalRootPaneUI
-javax/swing/plaf/metal/MetalScrollBarUI
-javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener
-javax/swing/plaf/metal/MetalScrollButton
-javax/swing/plaf/metal/MetalScrollPaneUI
-javax/swing/plaf/metal/MetalScrollPaneUI$1
-javax/swing/plaf/metal/MetalSeparatorUI
-javax/swing/plaf/metal/MetalSliderUI
-javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener
-javax/swing/plaf/metal/MetalSplitPaneDivider
-javax/swing/plaf/metal/MetalSplitPaneDivider$1
-javax/swing/plaf/metal/MetalSplitPaneDivider$2
-javax/swing/plaf/metal/MetalSplitPaneUI
-javax/swing/plaf/metal/MetalTabbedPaneUI
-javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout
-javax/swing/plaf/metal/MetalTextFieldUI
-javax/swing/plaf/metal/MetalTheme
-javax/swing/plaf/metal/MetalToggleButtonUI
-javax/swing/plaf/metal/MetalToolBarUI
-javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener
-javax/swing/plaf/metal/MetalTreeUI
-javax/swing/plaf/metal/MetalTreeUI$LineListener
-javax/swing/plaf/metal/OceanTheme
-javax/swing/plaf/metal/OceanTheme$1
-javax/swing/plaf/metal/OceanTheme$2
-javax/swing/plaf/metal/OceanTheme$3
-javax/swing/plaf/metal/OceanTheme$4
-javax/swing/plaf/metal/OceanTheme$5
-javax/swing/plaf/metal/OceanTheme$6
-javax/swing/plaf/synth/SynthConstants
-javax/swing/plaf/synth/SynthUI
-javax/swing/table/AbstractTableModel
-javax/swing/table/DefaultTableCellRenderer
-javax/swing/table/DefaultTableColumnModel
-javax/swing/table/DefaultTableModel
-javax/swing/table/JTableHeader
-javax/swing/table/TableCellEditor
-javax/swing/table/TableCellRenderer
-javax/swing/table/TableColumn
-javax/swing/table/TableColumnModel
-javax/swing/table/TableModel
-javax/swing/text/AbstractDocument
-javax/swing/text/AbstractDocument$1
-javax/swing/text/AbstractDocument$AbstractElement
-javax/swing/text/AbstractDocument$AttributeContext
-javax/swing/text/AbstractDocument$BidiElement
-javax/swing/text/AbstractDocument$BidiRootElement
-javax/swing/text/AbstractDocument$BranchElement
-javax/swing/text/AbstractDocument$Content
-javax/swing/text/AbstractDocument$DefaultDocumentEvent
-javax/swing/text/AbstractDocument$ElementEdit
-javax/swing/text/AbstractDocument$InsertStringResult
-javax/swing/text/AbstractDocument$LeafElement
-javax/swing/text/AttributeSet
-javax/swing/text/AttributeSet$CharacterAttribute
-javax/swing/text/AttributeSet$ColorAttribute
-javax/swing/text/AttributeSet$FontAttribute
-javax/swing/text/AttributeSet$ParagraphAttribute
-javax/swing/text/Caret
-javax/swing/text/DefaultCaret
-javax/swing/text/DefaultCaret$Handler
-javax/swing/text/DefaultEditorKit
-javax/swing/text/DefaultEditorKit$BeepAction
-javax/swing/text/DefaultEditorKit$BeginAction
-javax/swing/text/DefaultEditorKit$BeginLineAction
-javax/swing/text/DefaultEditorKit$BeginParagraphAction
-javax/swing/text/DefaultEditorKit$BeginWordAction
-javax/swing/text/DefaultEditorKit$CopyAction
-javax/swing/text/DefaultEditorKit$CutAction
-javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction
-javax/swing/text/DefaultEditorKit$DeleteNextCharAction
-javax/swing/text/DefaultEditorKit$DeletePrevCharAction
-javax/swing/text/DefaultEditorKit$DeleteWordAction
-javax/swing/text/DefaultEditorKit$DumpModelAction
-javax/swing/text/DefaultEditorKit$EndAction
-javax/swing/text/DefaultEditorKit$EndLineAction
-javax/swing/text/DefaultEditorKit$EndParagraphAction
-javax/swing/text/DefaultEditorKit$EndWordAction
-javax/swing/text/DefaultEditorKit$InsertBreakAction
-javax/swing/text/DefaultEditorKit$InsertContentAction
-javax/swing/text/DefaultEditorKit$InsertTabAction
-javax/swing/text/DefaultEditorKit$NextVisualPositionAction
-javax/swing/text/DefaultEditorKit$NextWordAction
-javax/swing/text/DefaultEditorKit$PageAction
-javax/swing/text/DefaultEditorKit$PasteAction
-javax/swing/text/DefaultEditorKit$PreviousWordAction
-javax/swing/text/DefaultEditorKit$ReadOnlyAction
-javax/swing/text/DefaultEditorKit$SelectAllAction
-javax/swing/text/DefaultEditorKit$SelectLineAction
-javax/swing/text/DefaultEditorKit$SelectParagraphAction
-javax/swing/text/DefaultEditorKit$SelectWordAction
-javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction
-javax/swing/text/DefaultEditorKit$UnselectAction
-javax/swing/text/DefaultEditorKit$VerticalPageAction
-javax/swing/text/DefaultEditorKit$WritableAction
-javax/swing/text/DefaultHighlighter
-javax/swing/text/DefaultHighlighter$DefaultHighlightPainter
-javax/swing/text/DefaultHighlighter$SafeDamager
-javax/swing/text/Document
-javax/swing/text/EditorKit
-javax/swing/text/Element
-javax/swing/text/FieldView
-javax/swing/text/GapContent
-javax/swing/text/GapContent$InsertUndo
-javax/swing/text/GapContent$MarkData
-javax/swing/text/GapContent$MarkVector
-javax/swing/text/GapContent$StickyPosition
-javax/swing/text/GapVector
-javax/swing/text/Highlighter
-javax/swing/text/Highlighter$Highlight
-javax/swing/text/Highlighter$HighlightPainter
-javax/swing/text/JTextComponent
-javax/swing/text/JTextComponent$1
-javax/swing/text/JTextComponent$DefaultKeymap
-javax/swing/text/JTextComponent$KeymapActionMap
-javax/swing/text/JTextComponent$KeymapWrapper
-javax/swing/text/JTextComponent$MutableCaretEvent
-javax/swing/text/Keymap
-javax/swing/text/LayeredHighlighter
-javax/swing/text/LayeredHighlighter$LayerPainter
-javax/swing/text/MutableAttributeSet
-javax/swing/text/PlainDocument
-javax/swing/text/PlainView
-javax/swing/text/Position
-javax/swing/text/Position$Bias
-javax/swing/text/Segment
-javax/swing/text/SegmentCache
-javax/swing/text/SegmentCache$CachedSegment
-javax/swing/text/SimpleAttributeSet
-javax/swing/text/SimpleAttributeSet$EmptyAttributeSet
-javax/swing/text/Style
-javax/swing/text/StyleConstants
-javax/swing/text/StyleConstants$CharacterConstants
-javax/swing/text/StyleConstants$ColorConstants
-javax/swing/text/StyleConstants$FontConstants
-javax/swing/text/StyleConstants$ParagraphConstants
-javax/swing/text/StyleContext
-javax/swing/text/StyleContext$FontKey
-javax/swing/text/StyleContext$KeyEnumeration
-javax/swing/text/StyleContext$NamedStyle
-javax/swing/text/StyleContext$SmallAttributeSet
-javax/swing/text/TabExpander
-javax/swing/text/TextAction
-javax/swing/text/Utilities
-javax/swing/text/View
-javax/swing/text/ViewFactory
-javax/swing/tree/AbstractLayoutCache
-javax/swing/tree/AbstractLayoutCache$NodeDimensions
-javax/swing/tree/DefaultMutableTreeNode
-javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration
-javax/swing/tree/DefaultTreeCellEditor
-javax/swing/tree/DefaultTreeCellEditor$1
-javax/swing/tree/DefaultTreeCellEditor$DefaultTextField
-javax/swing/tree/DefaultTreeCellEditor$EditorContainer
-javax/swing/tree/DefaultTreeCellRenderer
-javax/swing/tree/DefaultTreeModel
-javax/swing/tree/DefaultTreeSelectionModel
-javax/swing/tree/MutableTreeNode
-javax/swing/tree/PathPlaceHolder
-javax/swing/tree/RowMapper
-javax/swing/tree/TreeCellEditor
-javax/swing/tree/TreeCellRenderer
-javax/swing/tree/TreeModel
-javax/swing/tree/TreeNode
-javax/swing/tree/TreePath
-javax/swing/tree/TreeSelectionModel
-javax/swing/tree/VariableHeightLayoutCache
-javax/swing/tree/VariableHeightLayoutCache$TreeStateNode
-javax/swing/undo/AbstractUndoableEdit
-javax/swing/undo/CompoundEdit
-javax/swing/undo/UndoableEdit
-javax/xml/parsers/DocumentBuilder
-javax/xml/parsers/DocumentBuilderFactory
-javax/xml/parsers/FactoryFinder
-javax/xml/parsers/FactoryFinder$1
-javax/xml/parsers/ParserConfigurationException
-javax/xml/parsers/SecuritySupport
-javax/xml/parsers/SecuritySupport$2
-javax/xml/parsers/SecuritySupport$5
-org/w3c/dom/Attr
-org/w3c/dom/CDATASection
-org/w3c/dom/CharacterData
-org/w3c/dom/Comment
-org/w3c/dom/DOMException
-org/w3c/dom/Document
-org/w3c/dom/DocumentFragment
-org/w3c/dom/DocumentType
-org/w3c/dom/Element
-org/w3c/dom/Entity
-org/w3c/dom/EntityReference
-org/w3c/dom/NamedNodeMap
-org/w3c/dom/Node
-org/w3c/dom/NodeList
-org/w3c/dom/Notation
-org/w3c/dom/ProcessingInstruction
-org/w3c/dom/Text
-org/w3c/dom/events/DocumentEvent
-org/w3c/dom/events/Event
-org/w3c/dom/events/EventException
-org/w3c/dom/events/EventTarget
-org/w3c/dom/events/MutationEvent
-org/w3c/dom/ranges/DocumentRange
-org/w3c/dom/ranges/Range
-org/w3c/dom/traversal/DocumentTraversal
-org/w3c/dom/traversal/NodeIterator
-org/w3c/dom/traversal/TreeWalker
-org/xml/sax/AttributeList
-org/xml/sax/ContentHandler
-org/xml/sax/DTDHandler
-org/xml/sax/EntityResolver
-org/xml/sax/ErrorHandler
-org/xml/sax/InputSource
-org/xml/sax/Locator
-org/xml/sax/SAXException
-org/xml/sax/SAXNotRecognizedException
-org/xml/sax/SAXNotSupportedException
-org/xml/sax/SAXParseException
-org/xml/sax/helpers/DefaultHandler
-sun/awt/AWTAccessor
-sun/awt/AWTAccessor$AWTEventAccessor
-sun/awt/AWTAccessor$ClientPropertyKeyAccessor
-sun/awt/AWTAccessor$ComponentAccessor
-sun/awt/AWTAccessor$ContainerAccessor
-sun/awt/AWTAccessor$CursorAccessor
-sun/awt/AWTAccessor$DefaultKeyboardFocusManagerAccessor
-sun/awt/AWTAccessor$EventQueueAccessor
-sun/awt/AWTAccessor$FrameAccessor
-sun/awt/AWTAccessor$InputEventAccessor
-sun/awt/AWTAccessor$InvocationEventAccessor
-sun/awt/AWTAccessor$KeyEventAccessor
-sun/awt/AWTAccessor$KeyboardFocusManagerAccessor
-sun/awt/AWTAccessor$SequencedEventAccessor
-sun/awt/AWTAccessor$ToolkitAccessor
-sun/awt/AWTAccessor$WindowAccessor
-sun/awt/AWTAutoShutdown
-sun/awt/AWTIcon32_java_icon16_png
-sun/awt/AWTIcon32_java_icon24_png
-sun/awt/AWTIcon32_java_icon32_png
-sun/awt/AWTIcon32_java_icon48_png
-sun/awt/AppContext
-sun/awt/AppContext$1
-sun/awt/AppContext$2
-sun/awt/AppContext$3
-sun/awt/AppContext$6
-sun/awt/AppContext$GetAppContextLock
-sun/awt/AppContext$State
-sun/awt/CausedFocusEvent
-sun/awt/CausedFocusEvent$Cause
-sun/awt/ComponentFactory
-sun/awt/ConstrainableGraphics
-sun/awt/DisplayChangedListener
-sun/awt/EmbeddedFrame
-sun/awt/EventQueueDelegate
-sun/awt/EventQueueItem
-sun/awt/FontConfiguration
-sun/awt/FontDescriptor
-sun/awt/GlobalCursorManager
-sun/awt/GlobalCursorManager$NativeUpdater
-sun/awt/HeadlessToolkit
-sun/awt/IconInfo
-sun/awt/InputMethodSupport
-sun/awt/KeyboardFocusManagerPeerImpl
-sun/awt/KeyboardFocusManagerPeerProvider
-sun/awt/LightweightFrame
-sun/awt/ModalityListener
-sun/awt/MostRecentKeyValue
-sun/awt/NullComponentPeer
-sun/awt/OSInfo
-sun/awt/OSInfo$1
-sun/awt/OSInfo$OSType
-sun/awt/OSInfo$WindowsVersion
-sun/awt/PaintEventDispatcher
-sun/awt/PeerEvent
-sun/awt/PostEventQueue
-sun/awt/RepaintArea
-sun/awt/RequestFocusController
-sun/awt/SubRegionShowable
-sun/awt/SunDisplayChanger
-sun/awt/SunGraphicsCallback
-sun/awt/SunHints
-sun/awt/SunHints$Key
-sun/awt/SunHints$LCDContrastKey
-sun/awt/SunHints$Value
-sun/awt/SunToolkit
-sun/awt/SunToolkit$ModalityListenerList
-sun/awt/TimedWindowEvent
-sun/awt/UNIXToolkit
-sun/awt/WindowClosingListener
-sun/awt/WindowClosingSupport
-sun/awt/X11/AwtGraphicsConfigData
-sun/awt/X11/AwtScreenData
-sun/awt/X11/MotifColorUtilities
-sun/awt/X11/MotifDnDConstants
-sun/awt/X11/MotifDnDDragSourceProtocol
-sun/awt/X11/MotifDnDDropTargetProtocol
-sun/awt/X11/Native
-sun/awt/X11/Native$1
-sun/awt/X11/OwnershipListener
-sun/awt/X11/PropMwmHints
-sun/awt/X11/UnsafeXDisposerRecord
-sun/awt/X11/WindowDimensions
-sun/awt/X11/WindowPropertyGetter
-sun/awt/X11/XAWTXSettings
-sun/awt/X11/XAnyEvent
-sun/awt/X11/XAtom
-sun/awt/X11/XAtomList
-sun/awt/X11/XAwtState
-sun/awt/X11/XBaseWindow
-sun/awt/X11/XBaseWindow$1
-sun/awt/X11/XBaseWindow$InitialiseState
-sun/awt/X11/XBaseWindow$StateLock
-sun/awt/X11/XCanvasPeer
-sun/awt/X11/XClientMessageEvent
-sun/awt/X11/XClipboard
-sun/awt/X11/XComponentPeer
-sun/awt/X11/XComponentPeer$1
-sun/awt/X11/XConfigureEvent
-sun/awt/X11/XContentWindow
-sun/awt/X11/XCreateWindowParams
-sun/awt/X11/XDecoratedPeer
-sun/awt/X11/XDnDConstants
-sun/awt/X11/XDnDDragSourceProtocol
-sun/awt/X11/XDnDDropTargetProtocol
-sun/awt/X11/XDragAndDropProtocols
-sun/awt/X11/XDragSourceContextPeer
-sun/awt/X11/XDragSourceProtocol
-sun/awt/X11/XDragSourceProtocolListener
-sun/awt/X11/XDropTargetContextPeer
-sun/awt/X11/XDropTargetContextPeer$XDropTargetProtocolListenerImpl
-sun/awt/X11/XDropTargetEventProcessor
-sun/awt/X11/XDropTargetProtocol
-sun/awt/X11/XDropTargetProtocolListener
-sun/awt/X11/XDropTargetRegistry
-sun/awt/X11/XEmbeddedFramePeer
-sun/awt/X11/XErrorEvent
-sun/awt/X11/XErrorHandler
-sun/awt/X11/XErrorHandler$IgnoreBadWindowHandler
-sun/awt/X11/XErrorHandler$VerifyChangePropertyHandler
-sun/awt/X11/XErrorHandler$XBaseErrorHandler
-sun/awt/X11/XErrorHandler$XErrorHandlerWithFlag
-sun/awt/X11/XErrorHandler$XShmAttachHandler
-sun/awt/X11/XErrorHandlerUtil
-sun/awt/X11/XEvent
-sun/awt/X11/XEventDispatcher
-sun/awt/X11/XExposeEvent
-sun/awt/X11/XFocusChangeEvent
-sun/awt/X11/XFocusProxyWindow
-sun/awt/X11/XFramePeer
-sun/awt/X11/XGlobalCursorManager
-sun/awt/X11/XInputMethod
-sun/awt/X11/XInputMethodDescriptor
-sun/awt/X11/XKeyboardFocusManagerPeer
-sun/awt/X11/XLabelPeer
-sun/awt/X11/XLayerProtocol
-sun/awt/X11/XMSelection
-sun/awt/X11/XMSelection$1
-sun/awt/X11/XMSelection$3
-sun/awt/X11/XMSelectionListener
-sun/awt/X11/XModifierKeymap
-sun/awt/X11/XNETProtocol
-sun/awt/X11/XPanelPeer
-sun/awt/X11/XPropertyCache
-sun/awt/X11/XPropertyEvent
-sun/awt/X11/XProtocol
-sun/awt/X11/XRepaintArea
-sun/awt/X11/XReparentEvent
-sun/awt/X11/XRootWindow
-sun/awt/X11/XSelection
-sun/awt/X11/XSelection$IncrementalTransferHandler
-sun/awt/X11/XSelection$SelectionEventHandler
-sun/awt/X11/XSetWindowAttributes
-sun/awt/X11/XSizeHints
-sun/awt/X11/XStateProtocol
-sun/awt/X11/XSystemTrayPeer
-sun/awt/X11/XToolkit
-sun/awt/X11/XToolkit$1
-sun/awt/X11/XToolkit$2
-sun/awt/X11/XToolkit$2$1
-sun/awt/X11/XToolkit$3
-sun/awt/X11/XToolkit$4
-sun/awt/X11/XToolkit$5
-sun/awt/X11/XUnmapEvent
-sun/awt/X11/XVisibilityEvent
-sun/awt/X11/XVisualInfo
-sun/awt/X11/XWINProtocol
-sun/awt/X11/XWM
-sun/awt/X11/XWM$1
-sun/awt/X11/XWMHints
-sun/awt/X11/XWindow
-sun/awt/X11/XWindowAttributes
-sun/awt/X11/XWindowAttributesData
-sun/awt/X11/XWindowPeer
-sun/awt/X11/XWindowPeer$2
-sun/awt/X11/XWindowPeer$4
-sun/awt/X11/XWrapperBase
-sun/awt/X11/XlibUtil
-sun/awt/X11/XlibWrapper
-sun/awt/X11ComponentPeer
-sun/awt/X11FontManager
-sun/awt/X11GraphicsConfig
-sun/awt/X11GraphicsConfig$X11GCDisposerRecord
-sun/awt/X11GraphicsDevice
-sun/awt/X11GraphicsEnvironment
-sun/awt/X11GraphicsEnvironment$1
-sun/awt/X11InputMethod
-sun/awt/X11InputMethodDescriptor
-sun/awt/XSettings
-sun/awt/XSettings$Update
-sun/awt/datatransfer/SunClipboard
-sun/awt/dnd/SunDragSourceContextPeer
-sun/awt/dnd/SunDropTargetContextPeer
-sun/awt/dnd/SunDropTargetEvent
-sun/awt/event/IgnorePaintEvent
-sun/awt/geom/PathConsumer2D
-sun/awt/im/ExecutableInputMethodManager
-sun/awt/im/ExecutableInputMethodManager$3
-sun/awt/im/InputContext
-sun/awt/im/InputMethodAdapter
-sun/awt/im/InputMethodContext
-sun/awt/im/InputMethodLocator
-sun/awt/im/InputMethodManager
-sun/awt/image/BufImgSurfaceData
-sun/awt/image/BufImgSurfaceData$ICMColorData
-sun/awt/image/BufImgSurfaceManager
-sun/awt/image/BufferedImageGraphicsConfig
-sun/awt/image/ByteComponentRaster
-sun/awt/image/ByteInterleavedRaster
-sun/awt/image/BytePackedRaster
-sun/awt/image/FetcherInfo
-sun/awt/image/GifFrame
-sun/awt/image/GifImageDecoder
-sun/awt/image/ImageConsumerQueue
-sun/awt/image/ImageDecoder
-sun/awt/image/ImageDecoder$1
-sun/awt/image/ImageFetchable
-sun/awt/image/ImageFetcher
-sun/awt/image/ImageFetcher$1
-sun/awt/image/ImageRepresentation
-sun/awt/image/ImageWatched
-sun/awt/image/ImageWatched$Link
-sun/awt/image/ImageWatched$WeakLink
-sun/awt/image/InputStreamImageSource
-sun/awt/image/IntegerComponentRaster
-sun/awt/image/IntegerInterleavedRaster
-sun/awt/image/NativeLibLoader
-sun/awt/image/NativeLibLoader$1
-sun/awt/image/OffScreenImage
-sun/awt/image/PNGFilterInputStream
-sun/awt/image/PNGImageDecoder
-sun/awt/image/PixelConverter
-sun/awt/image/PixelConverter$Argb
-sun/awt/image/PixelConverter$ArgbBm
-sun/awt/image/PixelConverter$ArgbPre
-sun/awt/image/PixelConverter$Bgrx
-sun/awt/image/PixelConverter$ByteGray
-sun/awt/image/PixelConverter$Rgba
-sun/awt/image/PixelConverter$RgbaPre
-sun/awt/image/PixelConverter$Rgbx
-sun/awt/image/PixelConverter$Ushort4444Argb
-sun/awt/image/PixelConverter$Ushort555Rgb
-sun/awt/image/PixelConverter$Ushort555Rgbx
-sun/awt/image/PixelConverter$Ushort565Rgb
-sun/awt/image/PixelConverter$UshortGray
-sun/awt/image/PixelConverter$Xbgr
-sun/awt/image/PixelConverter$Xrgb
-sun/awt/image/SunVolatileImage
-sun/awt/image/SunWritableRaster
-sun/awt/image/SunWritableRaster$DataStealer
-sun/awt/image/SurfaceManager
-sun/awt/image/SurfaceManager$ImageAccessor
-sun/awt/image/SurfaceManager$ProxiedGraphicsConfig
-sun/awt/image/ToolkitImage
-sun/awt/image/URLImageSource
-sun/awt/image/VolatileSurfaceManager
-sun/awt/motif/MFontConfiguration
-sun/awt/resources/awt
-sun/awt/util/IdentityArrayList
-sun/dc/DuctusRenderingEngine
-sun/dc/path/PathConsumer
-sun/dc/pr/PathDasher
-sun/dc/pr/PathDasher$1
-sun/dc/pr/PathStroker
-sun/dc/pr/PathStroker$1
-sun/font/AttributeValues
-sun/font/CMap
-sun/font/CMap$CMapFormat12
-sun/font/CMap$NullCMapClass
-sun/font/CharToGlyphMapper
-sun/font/CompositeFont
-sun/font/CompositeFontDescriptor
-sun/font/CompositeGlyphMapper
-sun/font/CompositeStrike
-sun/font/CoreMetrics
-sun/font/EAttribute
-sun/font/FcFontConfiguration
-sun/font/FileFont
-sun/font/FileFontStrike
-sun/font/Font2D
-sun/font/Font2DHandle
-sun/font/FontAccess
-sun/font/FontConfigManager
-sun/font/FontConfigManager$FcCompFont
-sun/font/FontConfigManager$FontConfigFont
-sun/font/FontConfigManager$FontConfigInfo
-sun/font/FontDesignMetrics
-sun/font/FontDesignMetrics$KeyReference
-sun/font/FontDesignMetrics$MetricsKey
-sun/font/FontFamily
-sun/font/FontLineMetrics
-sun/font/FontManager
-sun/font/FontManagerFactory
-sun/font/FontManagerFactory$1
-sun/font/FontManagerForSGE
-sun/font/FontManagerNativeLibrary
-sun/font/FontManagerNativeLibrary$1
-sun/font/FontScaler
-sun/font/FontStrike
-sun/font/FontStrikeDesc
-sun/font/FontStrikeDisposer
-sun/font/FontUtilities
-sun/font/FontUtilities$1
-sun/font/GlyphList
-sun/font/PhysicalFont
-sun/font/PhysicalStrike
-sun/font/StandardGlyphVector
-sun/font/StandardGlyphVector$GlyphStrike
-sun/font/StrikeCache
-sun/font/StrikeCache$1
-sun/font/StrikeCache$DisposableStrike
-sun/font/StrikeCache$SoftDisposerRef
-sun/font/StrikeMetrics
-sun/font/SunFontManager
-sun/font/SunFontManager$1
-sun/font/SunFontManager$11
-sun/font/SunFontManager$2
-sun/font/SunFontManager$3
-sun/font/SunFontManager$FontRegistrationInfo
-sun/font/SunFontManager$T1Filter
-sun/font/SunFontManager$TTFilter
-sun/font/T2KFontScaler
-sun/font/T2KFontScaler$1
-sun/font/TrueTypeFont
-sun/font/TrueTypeFont$1
-sun/font/TrueTypeFont$DirectoryEntry
-sun/font/TrueTypeFont$TTDisposerRecord
-sun/font/TrueTypeGlyphMapper
-sun/font/Type1Font
-sun/font/Type1Font$1
-sun/font/X11TextRenderer
-sun/java2d/BackBufferCapsProvider
-sun/java2d/DefaultDisposerRecord
-sun/java2d/DestSurfaceProvider
-sun/java2d/Disposer
-sun/java2d/Disposer$1
-sun/java2d/Disposer$2
-sun/java2d/Disposer$PollDisposable
-sun/java2d/DisposerRecord
-sun/java2d/DisposerTarget
-sun/java2d/FontSupport
-sun/java2d/InvalidPipeException
-sun/java2d/NullSurfaceData
-sun/java2d/StateTrackable
-sun/java2d/StateTrackable$State
-sun/java2d/StateTrackableDelegate
-sun/java2d/StateTrackableDelegate$2
-sun/java2d/SunGraphics2D
-sun/java2d/SunGraphicsEnvironment
-sun/java2d/SunGraphicsEnvironment$1
-sun/java2d/Surface
-sun/java2d/SurfaceData
-sun/java2d/SurfaceData$PixelToPgramLoopConverter
-sun/java2d/SurfaceData$PixelToShapeLoopConverter
-sun/java2d/SurfaceManagerFactory
-sun/java2d/UnixSurfaceManagerFactory
-sun/java2d/cmm/CMSManager
-sun/java2d/cmm/ProfileActivator
-sun/java2d/cmm/ProfileDeferralInfo
-sun/java2d/cmm/ProfileDeferralMgr
-sun/java2d/loops/Blit
-sun/java2d/loops/BlitBg
-sun/java2d/loops/CompositeType
-sun/java2d/loops/CustomComponent
-sun/java2d/loops/DrawGlyphList
-sun/java2d/loops/DrawGlyphListAA
-sun/java2d/loops/DrawGlyphListLCD
-sun/java2d/loops/DrawLine
-sun/java2d/loops/DrawParallelogram
-sun/java2d/loops/DrawPath
-sun/java2d/loops/DrawPolygons
-sun/java2d/loops/DrawRect
-sun/java2d/loops/FillParallelogram
-sun/java2d/loops/FillPath
-sun/java2d/loops/FillRect
-sun/java2d/loops/FillSpans
-sun/java2d/loops/FontInfo
-sun/java2d/loops/GeneralRenderer
-sun/java2d/loops/GraphicsPrimitive
-sun/java2d/loops/GraphicsPrimitiveMgr
-sun/java2d/loops/GraphicsPrimitiveMgr$1
-sun/java2d/loops/GraphicsPrimitiveMgr$2
-sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec
-sun/java2d/loops/GraphicsPrimitiveProxy
-sun/java2d/loops/MaskBlit
-sun/java2d/loops/MaskFill
-sun/java2d/loops/RenderCache
-sun/java2d/loops/RenderCache$Entry
-sun/java2d/loops/RenderLoops
-sun/java2d/loops/ScaledBlit
-sun/java2d/loops/SurfaceType
-sun/java2d/loops/TransformHelper
-sun/java2d/loops/XORComposite
-sun/java2d/opengl/GLXGraphicsConfig
-sun/java2d/opengl/OGLGraphicsConfig
-sun/java2d/pipe/AAShapePipe
-sun/java2d/pipe/AATextRenderer
-sun/java2d/pipe/AlphaColorPipe
-sun/java2d/pipe/AlphaPaintPipe
-sun/java2d/pipe/CompositePipe
-sun/java2d/pipe/DrawImage
-sun/java2d/pipe/DrawImagePipe
-sun/java2d/pipe/GeneralCompositePipe
-sun/java2d/pipe/GlyphListLoopPipe
-sun/java2d/pipe/GlyphListPipe
-sun/java2d/pipe/LCDTextRenderer
-sun/java2d/pipe/LoopBasedPipe
-sun/java2d/pipe/LoopPipe
-sun/java2d/pipe/NullPipe
-sun/java2d/pipe/OutlineTextRenderer
-sun/java2d/pipe/ParallelogramPipe
-sun/java2d/pipe/PixelDrawPipe
-sun/java2d/pipe/PixelFillPipe
-sun/java2d/pipe/PixelToParallelogramConverter
-sun/java2d/pipe/PixelToShapeConverter
-sun/java2d/pipe/Region
-sun/java2d/pipe/Region$ImmutableRegion
-sun/java2d/pipe/RegionIterator
-sun/java2d/pipe/RenderingEngine
-sun/java2d/pipe/RenderingEngine$1
-sun/java2d/pipe/ShapeDrawPipe
-sun/java2d/pipe/ShapeSpanIterator
-sun/java2d/pipe/SolidTextRenderer
-sun/java2d/pipe/SpanClipRenderer
-sun/java2d/pipe/SpanIterator
-sun/java2d/pipe/SpanShapeRenderer
-sun/java2d/pipe/SpanShapeRenderer$Composite
-sun/java2d/pipe/TextPipe
-sun/java2d/pipe/TextRenderer
-sun/java2d/pipe/ValidatePipe
-sun/java2d/pipe/hw/AccelGraphicsConfig
-sun/java2d/pipe/hw/BufferedContextProvider
-sun/java2d/x11/X11Renderer
-sun/java2d/x11/X11SurfaceData
-sun/java2d/x11/X11SurfaceData$LazyPipe
-sun/java2d/x11/X11SurfaceData$X11WindowSurfaceData
-sun/java2d/x11/X11VolatileSurfaceManager
-sun/java2d/x11/XSurfaceData
-sun/java2d/xr/XRGraphicsConfig
-sun/launcher/LauncherHelper
-sun/launcher/LauncherHelper$FXHelper
-sun/misc/ASCIICaseInsensitiveComparator
-sun/misc/Cleaner
-sun/misc/CompoundEnumeration
-sun/misc/ExtensionDependency
-sun/misc/FDBigInteger
-sun/misc/FileURLMapper
-sun/misc/FloatingDecimal
-sun/misc/FloatingDecimal$1
-sun/misc/FloatingDecimal$ASCIIToBinaryBuffer
-sun/misc/FloatingDecimal$ASCIIToBinaryConverter
-sun/misc/FloatingDecimal$BinaryToASCIIBuffer
-sun/misc/FloatingDecimal$BinaryToASCIIConverter
-sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
-sun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer
-sun/misc/IOUtils
-sun/misc/JarIndex
-sun/misc/JavaAWTAccess
-sun/misc/JavaIOFileDescriptorAccess
-sun/misc/JavaLangAccess
-sun/misc/JavaNetAccess
-sun/misc/JavaNioAccess
-sun/misc/JavaSecurityAccess
-sun/misc/JavaSecurityProtectionDomainAccess
-sun/misc/JavaUtilJarAccess
-sun/misc/JavaUtilZipFileAccess
-sun/misc/Launcher
-sun/misc/Launcher$AppClassLoader
-sun/misc/Launcher$AppClassLoader$1
-sun/misc/Launcher$BootClassPathHolder
-sun/misc/Launcher$BootClassPathHolder$1
-sun/misc/Launcher$ExtClassLoader
-sun/misc/Launcher$ExtClassLoader$1
-sun/misc/Launcher$Factory
-sun/misc/MetaIndex
-sun/misc/NativeSignalHandler
-sun/misc/OSEnvironment
-sun/misc/Perf
-sun/misc/Perf$GetPerfAction
-sun/misc/PerfCounter
-sun/misc/PerfCounter$CoreCounters
-sun/misc/PerformanceLogger
-sun/misc/PerformanceLogger$TimeData
-sun/misc/PostVMInitHook
-sun/misc/Resource
-sun/misc/SharedSecrets
-sun/misc/Signal
-sun/misc/SignalHandler
-sun/misc/SoftCache
-sun/misc/SoftCache$ValueCell
-sun/misc/URLClassPath
-sun/misc/URLClassPath$1
-sun/misc/URLClassPath$2
-sun/misc/URLClassPath$3
-sun/misc/URLClassPath$FileLoader
-sun/misc/URLClassPath$JarLoader
-sun/misc/URLClassPath$JarLoader$1
-sun/misc/URLClassPath$JarLoader$2
-sun/misc/URLClassPath$Loader
-sun/misc/Unsafe
-sun/misc/VM
-sun/misc/Version
-sun/net/DefaultProgressMeteringPolicy
-sun/net/InetAddressCachePolicy
-sun/net/InetAddressCachePolicy$1
-sun/net/InetAddressCachePolicy$2
-sun/net/NetHooks
-sun/net/NetHooks$Provider
-sun/net/NetProperties
-sun/net/NetProperties$1
-sun/net/ProgressMeteringPolicy
-sun/net/ProgressMonitor
-sun/net/ResourceManager
-sun/net/sdp/SdpProvider
-sun/net/spi/DefaultProxySelector
-sun/net/spi/DefaultProxySelector$1
-sun/net/spi/DefaultProxySelector$3
-sun/net/spi/DefaultProxySelector$NonProxyInfo
-sun/net/spi/nameservice/NameService
-sun/net/util/IPAddressUtil
-sun/net/util/URLUtil
-sun/net/www/MessageHeader
-sun/net/www/MimeEntry
-sun/net/www/MimeTable
-sun/net/www/MimeTable$1
-sun/net/www/MimeTable$DefaultInstanceHolder
-sun/net/www/MimeTable$DefaultInstanceHolder$1
-sun/net/www/ParseUtil
-sun/net/www/URLConnection
-sun/net/www/protocol/file/FileURLConnection
-sun/net/www/protocol/file/Handler
-sun/net/www/protocol/http/Handler
-sun/net/www/protocol/jar/Handler
-sun/net/www/protocol/jar/JarFileFactory
-sun/net/www/protocol/jar/JarURLConnection
-sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream
-sun/net/www/protocol/jar/URLJarFile
-sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController
-sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry
-sun/nio/ByteBuffered
-sun/nio/ch/DirectBuffer
-sun/nio/ch/FileChannelImpl
-sun/nio/ch/FileChannelImpl$Unmapper
-sun/nio/ch/FileDispatcher
-sun/nio/ch/FileDispatcherImpl
-sun/nio/ch/IOStatus
-sun/nio/ch/IOUtil
-sun/nio/ch/IOUtil$1
-sun/nio/ch/Interruptible
-sun/nio/ch/NativeDispatcher
-sun/nio/ch/NativeThread
-sun/nio/ch/NativeThreadSet
-sun/nio/ch/Util
-sun/nio/ch/Util$1
-sun/nio/ch/Util$4
-sun/nio/ch/Util$BufferCache
-sun/nio/cs/ArrayDecoder
-sun/nio/cs/ArrayEncoder
-sun/nio/cs/FastCharsetProvider
-sun/nio/cs/HistoricallyNamedCharset
-sun/nio/cs/ISO_8859_1
-sun/nio/cs/ISO_8859_1$Encoder
-sun/nio/cs/StandardCharsets
-sun/nio/cs/StandardCharsets$Aliases
-sun/nio/cs/StandardCharsets$Cache
-sun/nio/cs/StandardCharsets$Classes
-sun/nio/cs/StreamDecoder
-sun/nio/cs/StreamEncoder
-sun/nio/cs/Surrogate
-sun/nio/cs/Surrogate$Parser
-sun/nio/cs/US_ASCII
-sun/nio/cs/US_ASCII$Decoder
-sun/nio/cs/UTF_16
-sun/nio/cs/UTF_16$Decoder
-sun/nio/cs/UTF_16BE
-sun/nio/cs/UTF_16LE
-sun/nio/cs/UTF_8
-sun/nio/cs/UTF_8$Decoder
-sun/nio/cs/UTF_8$Encoder
-sun/nio/cs/Unicode
-sun/nio/cs/UnicodeDecoder
-sun/print/PrinterGraphicsConfig
-sun/reflect/AccessorGenerator
-sun/reflect/BootstrapConstructorAccessorImpl
-sun/reflect/ByteVector
-sun/reflect/ByteVectorFactory
-sun/reflect/ByteVectorImpl
-sun/reflect/CallerSensitive
-sun/reflect/ClassDefiner
-sun/reflect/ClassDefiner$1
-sun/reflect/ClassFileAssembler
-sun/reflect/ClassFileConstants
-sun/reflect/ConstantPool
-sun/reflect/ConstructorAccessor
-sun/reflect/ConstructorAccessorImpl
-sun/reflect/DelegatingClassLoader
-sun/reflect/DelegatingConstructorAccessorImpl
-sun/reflect/DelegatingMethodAccessorImpl
-sun/reflect/FieldAccessor
-sun/reflect/FieldAccessorImpl
-sun/reflect/Label
-sun/reflect/Label$PatchInfo
-sun/reflect/LangReflectAccess
-sun/reflect/MagicAccessorImpl
-sun/reflect/MethodAccessor
-sun/reflect/MethodAccessorGenerator
-sun/reflect/MethodAccessorGenerator$1
-sun/reflect/MethodAccessorImpl
-sun/reflect/NativeConstructorAccessorImpl
-sun/reflect/NativeMethodAccessorImpl
-sun/reflect/Reflection
-sun/reflect/ReflectionFactory
-sun/reflect/ReflectionFactory$1
-sun/reflect/ReflectionFactory$GetReflectionFactoryAction
-sun/reflect/SerializationConstructorAccessorImpl
-sun/reflect/UTF8
-sun/reflect/UnsafeFieldAccessorFactory
-sun/reflect/UnsafeFieldAccessorImpl
-sun/reflect/UnsafeObjectFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl
-sun/reflect/UnsafeStaticFieldAccessorImpl
-sun/reflect/annotation/AnnotationType
-sun/reflect/generics/repository/AbstractRepository
-sun/reflect/generics/repository/ClassRepository
-sun/reflect/generics/repository/GenericDeclRepository
-sun/reflect/misc/MethodUtil
-sun/reflect/misc/MethodUtil$1
-sun/reflect/misc/ReflectUtil
-sun/security/action/GetBooleanAction
-sun/security/action/GetIntegerAction
-sun/security/action/GetPropertyAction
-sun/security/jca/GetInstance
-sun/security/jca/GetInstance$Instance
-sun/security/jca/ProviderConfig
-sun/security/jca/ProviderConfig$2
-sun/security/jca/ProviderList
-sun/security/jca/ProviderList$1
-sun/security/jca/ProviderList$2
-sun/security/jca/ProviderList$3
-sun/security/jca/ProviderList$ServiceList
-sun/security/jca/ProviderList$ServiceList$1
-sun/security/jca/Providers
-sun/security/jca/ServiceId
-sun/security/provider/ByteArrayAccess
-sun/security/provider/DSA
-sun/security/provider/DSA$LegacyDSA
-sun/security/provider/DSA$SHA1withDSA
-sun/security/provider/DSAParameters
-sun/security/provider/DSAPublicKey
-sun/security/provider/DigestBase
-sun/security/provider/NativePRNG
-sun/security/provider/NativePRNG$1
-sun/security/provider/NativePRNG$2
-sun/security/provider/NativePRNG$Blocking
-sun/security/provider/NativePRNG$NonBlocking
-sun/security/provider/NativePRNG$RandomIO
-sun/security/provider/NativePRNG$Variant
-sun/security/provider/SHA
-sun/security/provider/Sun
-sun/security/provider/SunEntries
-sun/security/provider/SunEntries$1
-sun/security/util/BitArray
-sun/security/util/ByteArrayLexOrder
-sun/security/util/Debug
-sun/security/util/DerEncoder
-sun/security/util/DerIndefLenConverter
-sun/security/util/DerInputBuffer
-sun/security/util/DerInputStream
-sun/security/util/DerOutputStream
-sun/security/util/DerValue
-sun/security/util/ManifestEntryVerifier
-sun/security/util/ObjectIdentifier
-sun/security/util/SignatureFileVerifier
-sun/security/x509/AlgorithmId
-sun/security/x509/X509Key
-sun/swing/DefaultLookup
-sun/swing/ImageIconUIResource
-sun/swing/JLightweightFrame
-sun/swing/MenuItemLayoutHelper
-sun/swing/MenuItemLayoutHelper$ColumnAlignment
-sun/swing/MenuItemLayoutHelper$LayoutResult
-sun/swing/MenuItemLayoutHelper$RectSize
-sun/swing/PrintColorUIResource
-sun/swing/StringUIClientPropertyKey
-sun/swing/SwingAccessor
-sun/swing/SwingAccessor$JTextComponentAccessor
-sun/swing/SwingLazyValue
-sun/swing/SwingLazyValue$1
-sun/swing/SwingUtilities2
-sun/swing/SwingUtilities2$2
-sun/swing/SwingUtilities2$AATextInfo
-sun/swing/SwingUtilities2$LSBCacheEntry
-sun/swing/UIAction
-sun/swing/UIClientPropertyKey
-sun/swing/table/DefaultTableCellHeaderRenderer
-sun/swing/table/DefaultTableCellHeaderRenderer$EmptyIcon
-sun/text/ComposedCharIter
-sun/text/IntHashtable
-sun/text/UCompactIntArray
-sun/text/normalizer/CharTrie
-sun/text/normalizer/CharTrie$FriendAgent
-sun/text/normalizer/ICUBinary
-sun/text/normalizer/ICUBinary$Authenticate
-sun/text/normalizer/ICUData
-sun/text/normalizer/IntTrie
-sun/text/normalizer/NormalizerDataReader
-sun/text/normalizer/NormalizerImpl
-sun/text/normalizer/NormalizerImpl$AuxTrieImpl
-sun/text/normalizer/NormalizerImpl$DecomposeArgs
-sun/text/normalizer/NormalizerImpl$FCDTrieImpl
-sun/text/normalizer/NormalizerImpl$NormTrieImpl
-sun/text/normalizer/Trie
-sun/text/normalizer/Trie$DataManipulate
-sun/text/normalizer/UTF16
-sun/text/normalizer/UnicodeMatcher
-sun/text/normalizer/UnicodeSet
-sun/text/resources/CollationData
-sun/text/resources/FormatData
-sun/text/resources/en/FormatData_en
-sun/text/resources/en/FormatData_en_US
-sun/util/CoreResourceBundleControl
-sun/util/PreHashedMap
-sun/util/ResourceBundleEnumeration
-sun/util/calendar/AbstractCalendar
-sun/util/calendar/BaseCalendar
-sun/util/calendar/BaseCalendar$Date
-sun/util/calendar/CalendarDate
-sun/util/calendar/CalendarSystem
-sun/util/calendar/CalendarUtils
-sun/util/calendar/Gregorian
-sun/util/calendar/Gregorian$Date
-sun/util/calendar/ZoneInfo
-sun/util/calendar/ZoneInfoFile
-sun/util/calendar/ZoneInfoFile$1
-sun/util/calendar/ZoneInfoFile$Checksum
-sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule
-sun/util/locale/BaseLocale
-sun/util/locale/BaseLocale$Cache
-sun/util/locale/BaseLocale$Key
-sun/util/locale/LanguageTag
-sun/util/locale/LocaleObjectCache
-sun/util/locale/LocaleObjectCache$CacheEntry
-sun/util/locale/LocaleUtils
-sun/util/locale/provider/AuxLocaleProviderAdapter
-sun/util/locale/provider/AuxLocaleProviderAdapter$NullProvider
-sun/util/locale/provider/AvailableLanguageTags
-sun/util/locale/provider/CalendarDataProviderImpl
-sun/util/locale/provider/CalendarDataUtility
-sun/util/locale/provider/CalendarDataUtility$CalendarWeekParameterGetter
-sun/util/locale/provider/CalendarProviderImpl
-sun/util/locale/provider/CollatorProviderImpl
-sun/util/locale/provider/CurrencyNameProviderImpl
-sun/util/locale/provider/DateFormatSymbolsProviderImpl
-sun/util/locale/provider/DecimalFormatSymbolsProviderImpl
-sun/util/locale/provider/JRELocaleProviderAdapter
-sun/util/locale/provider/JRELocaleProviderAdapter$1
-sun/util/locale/provider/LocaleDataMetaInfo
-sun/util/locale/provider/LocaleProviderAdapter
-sun/util/locale/provider/LocaleProviderAdapter$1
-sun/util/locale/provider/LocaleProviderAdapter$Type
-sun/util/locale/provider/LocaleResources
-sun/util/locale/provider/LocaleResources$ResourceReference
-sun/util/locale/provider/LocaleServiceProviderPool
-sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter
-sun/util/locale/provider/NumberFormatProviderImpl
-sun/util/locale/provider/ResourceBundleBasedAdapter
-sun/util/locale/provider/SPILocaleProviderAdapter
-sun/util/locale/provider/SPILocaleProviderAdapter$1
-sun/util/locale/provider/TimeZoneNameProviderImpl
-sun/util/locale/provider/TimeZoneNameUtility
-sun/util/locale/provider/TimeZoneNameUtility$TimeZoneNameGetter
-sun/util/logging/LoggingProxy
-sun/util/logging/LoggingSupport
-sun/util/logging/LoggingSupport$1
-sun/util/logging/LoggingSupport$2
-sun/util/logging/PlatformLogger
-sun/util/logging/PlatformLogger$1
-sun/util/logging/PlatformLogger$DefaultLoggerProxy
-sun/util/logging/PlatformLogger$JavaLoggerProxy
-sun/util/logging/PlatformLogger$Level
-sun/util/logging/PlatformLogger$LoggerProxy
-sun/util/logging/resources/logging
-sun/util/resources/CalendarData
-sun/util/resources/CurrencyNames
-sun/util/resources/LocaleData
-sun/util/resources/LocaleData$1
-sun/util/resources/LocaleData$LocaleDataResourceBundleControl
-sun/util/resources/LocaleNamesBundle
-sun/util/resources/OpenListResourceBundle
-sun/util/resources/ParallelListResourceBundle
-sun/util/resources/ParallelListResourceBundle$KeySet
-sun/util/resources/TimeZoneNames
-sun/util/resources/TimeZoneNamesBundle
-sun/util/resources/en/CalendarData_en
-sun/util/resources/en/CurrencyNames_en_US
-sun/util/resources/en/TimeZoneNames_en
-sun/util/spi/CalendarProvider
-# e4fe875988768cf5
--- a/jdk/make/data/classlist/classlist.macosx	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2208 +0,0 @@
-apple/laf/JRSUIConstants
-apple/laf/JRSUIConstants$AlignmentHorizontal
-apple/laf/JRSUIConstants$AlignmentVertical
-apple/laf/JRSUIConstants$Animating
-apple/laf/JRSUIConstants$DoubleValue
-apple/laf/JRSUIConstants$Focused
-apple/laf/JRSUIConstants$FrameOnly
-apple/laf/JRSUIConstants$Hit
-apple/laf/JRSUIConstants$IndicatorOnly
-apple/laf/JRSUIConstants$Key
-apple/laf/JRSUIConstants$NothingToScroll
-apple/laf/JRSUIConstants$Orientation
-apple/laf/JRSUIConstants$Property
-apple/laf/JRSUIConstants$PropertyEncoding
-apple/laf/JRSUIConstants$ScrollBarPart
-apple/laf/JRSUIConstants$SegmentPosition
-apple/laf/JRSUIConstants$SegmentTrailingSeparator
-apple/laf/JRSUIConstants$ShowArrows
-apple/laf/JRSUIConstants$Size
-apple/laf/JRSUIConstants$State
-apple/laf/JRSUIConstants$Widget
-apple/laf/JRSUIControl
-apple/laf/JRSUIControl$BufferState
-apple/laf/JRSUIControl$ThreadLocalByteBuffer
-apple/laf/JRSUIState
-apple/laf/JRSUIState$ScrollBarState
-apple/laf/JRSUIState$ValueState
-apple/laf/JRSUIStateFactory
-apple/laf/JRSUIUtils
-apple/laf/JRSUIUtils$NineSliceMetricsProvider
-apple/laf/JRSUIUtils$TabbedPane
-com/apple/eawt/AboutHandler
-com/apple/eawt/AppEventListener
-com/apple/eawt/AppReOpenedListener
-com/apple/eawt/OpenFilesHandler
-com/apple/eawt/PreferencesHandler
-com/apple/eawt/PrintFilesHandler
-com/apple/eawt/QuitHandler
-com/apple/eawt/QuitStrategy
-com/apple/eawt/_AppEventHandler
-com/apple/eawt/_AppEventHandler$_AboutDispatcher
-com/apple/eawt/_AppEventHandler$_AppEventDispatcher
-com/apple/eawt/_AppEventHandler$_AppEventMultiplexor
-com/apple/eawt/_AppEventHandler$_AppForegroundDispatcher
-com/apple/eawt/_AppEventHandler$_AppReOpenedDispatcher
-com/apple/eawt/_AppEventHandler$_BooleanAppEventMultiplexor
-com/apple/eawt/_AppEventHandler$_HiddenAppDispatcher
-com/apple/eawt/_AppEventHandler$_NativeEvent
-com/apple/eawt/_AppEventHandler$_OpenAppDispatcher
-com/apple/eawt/_AppEventHandler$_OpenFileDispatcher
-com/apple/eawt/_AppEventHandler$_OpenURIDispatcher
-com/apple/eawt/_AppEventHandler$_PreferencesDispatcher
-com/apple/eawt/_AppEventHandler$_PrintFileDispatcher
-com/apple/eawt/_AppEventHandler$_QueuingAppEventDispatcher
-com/apple/eawt/_AppEventHandler$_QuitDispatcher
-com/apple/eawt/_AppEventHandler$_ScreenSleepDispatcher
-com/apple/eawt/_AppEventHandler$_SystemSleepDispatcher
-com/apple/eawt/_AppEventHandler$_UserSessionDispatcher
-com/apple/eawt/_AppEventLegacyHandler
-com/apple/eawt/_AppMenuBarHandler
-com/apple/eawt/_OpenAppHandler
-com/apple/laf/AquaBorder
-com/apple/laf/AquaButtonBorder
-com/apple/laf/AquaButtonBorder$1
-com/apple/laf/AquaButtonBorder$Dynamic
-com/apple/laf/AquaButtonBorder$Dynamic$1
-com/apple/laf/AquaButtonBorder$Named
-com/apple/laf/AquaButtonBorder$Toggle
-com/apple/laf/AquaButtonBorder$Toolbar
-com/apple/laf/AquaButtonExtendedTypes
-com/apple/laf/AquaButtonExtendedTypes$1
-com/apple/laf/AquaButtonExtendedTypes$2
-com/apple/laf/AquaButtonExtendedTypes$3
-com/apple/laf/AquaButtonExtendedTypes$4
-com/apple/laf/AquaButtonExtendedTypes$5
-com/apple/laf/AquaButtonExtendedTypes$6
-com/apple/laf/AquaButtonExtendedTypes$7
-com/apple/laf/AquaButtonExtendedTypes$8
-com/apple/laf/AquaButtonExtendedTypes$BorderDefinedTypeSpecifier
-com/apple/laf/AquaButtonExtendedTypes$BorderDefinedTypeSpecifier$1
-com/apple/laf/AquaButtonExtendedTypes$SegmentedBorderDefinedTypeSpecifier
-com/apple/laf/AquaButtonExtendedTypes$SegmentedNamedBorder
-com/apple/laf/AquaButtonExtendedTypes$TypeSpecifier
-com/apple/laf/AquaButtonToggleUI
-com/apple/laf/AquaButtonUI
-com/apple/laf/AquaButtonUI$AquaButtonListener
-com/apple/laf/AquaButtonUI$AquaHierarchyButtonListener
-com/apple/laf/AquaCaret
-com/apple/laf/AquaComboBoxButton
-com/apple/laf/AquaComboBoxButton$1
-com/apple/laf/AquaComboBoxPopup
-com/apple/laf/AquaComboBoxPopup$1
-com/apple/laf/AquaComboBoxRenderer
-com/apple/laf/AquaComboBoxRendererInternal
-com/apple/laf/AquaComboBoxUI
-com/apple/laf/AquaComboBoxUI$1
-com/apple/laf/AquaComboBoxUI$10
-com/apple/laf/AquaComboBoxUI$11
-com/apple/laf/AquaComboBoxUI$12
-com/apple/laf/AquaComboBoxUI$12$1
-com/apple/laf/AquaComboBoxUI$12$2
-com/apple/laf/AquaComboBoxUI$12$3
-com/apple/laf/AquaComboBoxUI$12$4
-com/apple/laf/AquaComboBoxUI$12$5
-com/apple/laf/AquaComboBoxUI$12$6
-com/apple/laf/AquaComboBoxUI$12$7
-com/apple/laf/AquaComboBoxUI$2
-com/apple/laf/AquaComboBoxUI$3
-com/apple/laf/AquaComboBoxUI$4
-com/apple/laf/AquaComboBoxUI$5
-com/apple/laf/AquaComboBoxUI$6
-com/apple/laf/AquaComboBoxUI$7
-com/apple/laf/AquaComboBoxUI$8
-com/apple/laf/AquaComboBoxUI$9
-com/apple/laf/AquaComboBoxUI$AquaComboBoxEditor
-com/apple/laf/AquaComboBoxUI$AquaComboBoxLayoutManager
-com/apple/laf/AquaComboBoxUI$AquaCustomComboTextField
-com/apple/laf/AquaComboBoxUI$AquaCustomComboTextField$1
-com/apple/laf/AquaComboBoxUI$ComboBoxAction
-com/apple/laf/AquaFocusHandler
-com/apple/laf/AquaFocusHandler$1
-com/apple/laf/AquaFonts
-com/apple/laf/AquaFonts$1
-com/apple/laf/AquaFonts$2
-com/apple/laf/AquaFonts$3
-com/apple/laf/AquaFonts$4
-com/apple/laf/AquaFonts$5
-com/apple/laf/AquaFonts$6
-com/apple/laf/AquaFonts$7
-com/apple/laf/AquaFonts$DerivedUIResourceFont
-com/apple/laf/AquaHighlighter
-com/apple/laf/AquaHighlighter$1
-com/apple/laf/AquaHighlighter$AquaHighlightPainter
-com/apple/laf/AquaIcon$CachingScalingIcon
-com/apple/laf/AquaIcon$InvertableIcon
-com/apple/laf/AquaIcon$SystemIcon
-com/apple/laf/AquaIcon$SystemIconSingleton
-com/apple/laf/AquaIcon$SystemIconUIResourceSingleton
-com/apple/laf/AquaImageFactory
-com/apple/laf/AquaImageFactory$IconUIResourceSingleton
-com/apple/laf/AquaImageFactory$InvertableImageIcon
-com/apple/laf/AquaImageFactory$NamedImageSingleton
-com/apple/laf/AquaImageFactory$SystemColorProxy
-com/apple/laf/AquaKeyBindings
-com/apple/laf/AquaKeyBindings$AquaMultilineAction
-com/apple/laf/AquaKeyBindings$BindingsProvider
-com/apple/laf/AquaKeyBindings$LateBoundInputMap
-com/apple/laf/AquaKeyBindings$SimpleBinding
-com/apple/laf/AquaLabelUI
-com/apple/laf/AquaListUI
-com/apple/laf/AquaListUI$AquaHomeEndAction
-com/apple/laf/AquaListUI$AquaPropertyChangeHandler
-com/apple/laf/AquaListUI$FocusHandler
-com/apple/laf/AquaListUI$MouseInputHandler
-com/apple/laf/AquaLookAndFeel
-com/apple/laf/AquaLookAndFeel$1
-com/apple/laf/AquaLookAndFeel$2
-com/apple/laf/AquaLookAndFeel$3
-com/apple/laf/AquaMenuBarBorder
-com/apple/laf/AquaMenuBarUI
-com/apple/laf/AquaMenuBorder
-com/apple/laf/AquaMenuItemUI
-com/apple/laf/AquaMenuItemUI$IndeterminateListener
-com/apple/laf/AquaMenuPainter
-com/apple/laf/AquaMenuPainter$Client
-com/apple/laf/AquaMenuPainter$RecyclableBorder
-com/apple/laf/AquaMenuUI
-com/apple/laf/AquaMenuUI$AquaMouseInputHandler
-com/apple/laf/AquaMenuUI$MenuDragMouseHandler
-com/apple/laf/AquaMnemonicHandler
-com/apple/laf/AquaMnemonicHandler$AltProcessor
-com/apple/laf/AquaPainter
-com/apple/laf/AquaPainter$1
-com/apple/laf/AquaPainter$AquaNineSlicingImagePainter
-com/apple/laf/AquaPainter$AquaSingleImagePainter
-com/apple/laf/AquaPanelUI
-com/apple/laf/AquaPopupMenuSeparatorUI
-com/apple/laf/AquaPopupMenuUI
-com/apple/laf/AquaRootPaneUI
-com/apple/laf/AquaScrollBarUI
-com/apple/laf/AquaScrollBarUI$1
-com/apple/laf/AquaScrollBarUI$ModelListener
-com/apple/laf/AquaScrollBarUI$PropertyChangeHandler
-com/apple/laf/AquaScrollBarUI$ScrollListener
-com/apple/laf/AquaScrollBarUI$TrackListener
-com/apple/laf/AquaScrollPaneUI
-com/apple/laf/AquaScrollPaneUI$XYMouseWheelHandler
-com/apple/laf/AquaScrollRegionBorder
-com/apple/laf/AquaTableHeaderBorder
-com/apple/laf/AquaTableHeaderBorder$1
-com/apple/laf/AquaTextAreaUI
-com/apple/laf/AquaTextFieldBorder
-com/apple/laf/AquaTextFieldSearch
-com/apple/laf/AquaTextFieldSearch$SearchFieldBorder
-com/apple/laf/AquaTextFieldSearch$SearchFieldPropertyListener
-com/apple/laf/AquaTextFieldUI
-com/apple/laf/AquaToolBarSeparatorUI
-com/apple/laf/AquaToolBarUI
-com/apple/laf/AquaToolBarUI$ToolBarBorder
-com/apple/laf/AquaUtilControlSize
-com/apple/laf/AquaUtilControlSize$PropertySizeListener
-com/apple/laf/AquaUtilControlSize$SizeDescriptor
-com/apple/laf/AquaUtilControlSize$SizeVariant
-com/apple/laf/AquaUtilControlSize$Sizeable
-com/apple/laf/AquaUtils
-com/apple/laf/AquaUtils$2
-com/apple/laf/AquaUtils$5
-com/apple/laf/AquaUtils$6
-com/apple/laf/AquaUtils$JComponentPainter
-com/apple/laf/AquaUtils$RecyclableSingleton
-com/apple/laf/AquaUtils$RecyclableSingletonFromDefaultConstructor
-com/apple/laf/ClientPropertyApplicator
-com/apple/laf/ClientPropertyApplicator$Property
-com/apple/laf/ImageCache
-com/apple/laf/ImageCache$1
-com/apple/laf/ImageCache$PixelCountSoftReference
-com/apple/laf/ScreenMenuBar
-com/apple/laf/ScreenMenuBarProvider
-com/apple/laf/ScreenMenuPropertyHandler
-com/apple/laf/ScreenPopupFactory
-com/apple/laf/ScreenPopupFactory$1
-com/apple/laf/resources/aqua
-com/sun/java/swing/SwingUtilities3
-com/sun/swing/internal/plaf/basic/resources/basic
-java/applet/Applet
-java/awt/AWTEvent
-java/awt/AWTEvent$1
-java/awt/AWTEvent$2
-java/awt/AWTEventMulticaster
-java/awt/AWTKeyStroke
-java/awt/AWTKeyStroke$1
-java/awt/ActiveEvent
-java/awt/Adjustable
-java/awt/AlphaComposite
-java/awt/BasicStroke
-java/awt/BorderLayout
-java/awt/Canvas
-java/awt/CardLayout
-java/awt/Color
-java/awt/Component
-java/awt/Component$1
-java/awt/Component$3
-java/awt/Component$AWTTreeLock
-java/awt/Component$DummyRequestFocusController
-java/awt/ComponentOrientation
-java/awt/Composite
-java/awt/Conditional
-java/awt/Container
-java/awt/Container$1
-java/awt/Container$EventTargetFilter
-java/awt/Container$MouseEventTargetFilter
-java/awt/ContainerOrderFocusTraversalPolicy
-java/awt/Cursor
-java/awt/Cursor$1
-java/awt/DefaultFocusTraversalPolicy
-java/awt/DefaultKeyboardFocusManager
-java/awt/DefaultKeyboardFocusManager$1
-java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent
-java/awt/DefaultKeyboardFocusManager$TypeAheadMarker
-java/awt/Dialog
-java/awt/Dialog$1
-java/awt/Dialog$3
-java/awt/Dialog$ModalExclusionType
-java/awt/Dialog$ModalityType
-java/awt/Dimension
-java/awt/Event
-java/awt/EventDispatchThread
-java/awt/EventDispatchThread$1
-java/awt/EventDispatchThread$HierarchyEventFilter
-java/awt/EventFilter
-java/awt/EventFilter$FilterAction
-java/awt/EventQueue
-java/awt/EventQueue$1
-java/awt/EventQueue$2
-java/awt/EventQueue$3
-java/awt/EventQueue$4
-java/awt/EventQueue$5
-java/awt/FlowLayout
-java/awt/FocusTraversalPolicy
-java/awt/Font
-java/awt/Font$FontAccessImpl
-java/awt/FontMetrics
-java/awt/Frame
-java/awt/Frame$1
-java/awt/Graphics
-java/awt/Graphics2D
-java/awt/GraphicsCallback
-java/awt/GraphicsCallback$PaintCallback
-java/awt/GraphicsConfiguration
-java/awt/GraphicsDevice
-java/awt/GraphicsEnvironment
-java/awt/GraphicsEnvironment$1
-java/awt/Image
-java/awt/Image$1
-java/awt/ImageCapabilities
-java/awt/ImageMediaEntry
-java/awt/Insets
-java/awt/ItemSelectable
-java/awt/KeyEventDispatcher
-java/awt/KeyEventPostProcessor
-java/awt/KeyboardFocusManager
-java/awt/KeyboardFocusManager$1
-java/awt/KeyboardFocusManager$2
-java/awt/KeyboardFocusManager$3
-java/awt/KeyboardFocusManager$HeavyweightFocusRequest
-java/awt/KeyboardFocusManager$LightweightFocusRequest
-java/awt/Label
-java/awt/LayoutManager
-java/awt/LayoutManager2
-java/awt/LightweightDispatcher
-java/awt/LightweightDispatcher$1
-java/awt/LightweightDispatcher$2
-java/awt/MediaEntry
-java/awt/MediaTracker
-java/awt/MenuBar
-java/awt/MenuComponent
-java/awt/MenuContainer
-java/awt/ModalEventFilter
-java/awt/ModalEventFilter$1
-java/awt/ModalEventFilter$ApplicationModalEventFilter
-java/awt/Paint
-java/awt/Panel
-java/awt/Point
-java/awt/PrintGraphics
-java/awt/Queue
-java/awt/Rectangle
-java/awt/RenderingHints
-java/awt/RenderingHints$Key
-java/awt/SecondaryLoop
-java/awt/SentEvent
-java/awt/SequencedEvent
-java/awt/Shape
-java/awt/SplashScreen
-java/awt/Stroke
-java/awt/SystemColor
-java/awt/Toolkit
-java/awt/Toolkit$1
-java/awt/Toolkit$2
-java/awt/Toolkit$3
-java/awt/Toolkit$4
-java/awt/Toolkit$5
-java/awt/Toolkit$DesktopPropertyChangeSupport
-java/awt/Toolkit$SelectiveAWTEventListener
-java/awt/Toolkit$ToolkitEventMulticaster
-java/awt/Transparency
-java/awt/TrayIcon
-java/awt/VKCollection
-java/awt/WaitDispatchSupport
-java/awt/WaitDispatchSupport$1
-java/awt/WaitDispatchSupport$2
-java/awt/WaitDispatchSupport$5
-java/awt/Window
-java/awt/Window$1
-java/awt/Window$1DisposeAction
-java/awt/Window$Type
-java/awt/Window$WindowDisposerRecord
-java/awt/color/ColorSpace
-java/awt/color/ICC_ColorSpace
-java/awt/color/ICC_Profile
-java/awt/color/ICC_Profile$1
-java/awt/color/ICC_ProfileRGB
-java/awt/datatransfer/Clipboard
-java/awt/datatransfer/ClipboardOwner
-java/awt/datatransfer/DataFlavor
-java/awt/datatransfer/FlavorMap
-java/awt/datatransfer/FlavorTable
-java/awt/datatransfer/MimeType
-java/awt/datatransfer/MimeTypeParameterList
-java/awt/datatransfer/MimeTypeParseException
-java/awt/datatransfer/SystemFlavorMap
-java/awt/datatransfer/SystemFlavorMap$1
-java/awt/datatransfer/SystemFlavorMap$2
-java/awt/datatransfer/Transferable
-java/awt/dnd/DropTarget
-java/awt/dnd/DropTargetContext
-java/awt/dnd/DropTargetListener
-java/awt/dnd/peer/DragSourceContextPeer
-java/awt/dnd/peer/DropTargetPeer
-java/awt/event/AWTEventListener
-java/awt/event/AWTEventListenerProxy
-java/awt/event/ActionEvent
-java/awt/event/ActionListener
-java/awt/event/AdjustmentEvent
-java/awt/event/AdjustmentListener
-java/awt/event/ComponentAdapter
-java/awt/event/ComponentEvent
-java/awt/event/ComponentListener
-java/awt/event/ContainerEvent
-java/awt/event/ContainerListener
-java/awt/event/FocusAdapter
-java/awt/event/FocusEvent
-java/awt/event/FocusListener
-java/awt/event/HierarchyBoundsListener
-java/awt/event/HierarchyEvent
-java/awt/event/HierarchyListener
-java/awt/event/InputEvent
-java/awt/event/InputEvent$1
-java/awt/event/InputMethodEvent
-java/awt/event/InputMethodListener
-java/awt/event/InvocationEvent
-java/awt/event/ItemListener
-java/awt/event/KeyAdapter
-java/awt/event/KeyEvent
-java/awt/event/KeyEvent$1
-java/awt/event/KeyListener
-java/awt/event/MouseAdapter
-java/awt/event/MouseEvent
-java/awt/event/MouseListener
-java/awt/event/MouseMotionAdapter
-java/awt/event/MouseMotionListener
-java/awt/event/MouseWheelEvent
-java/awt/event/MouseWheelListener
-java/awt/event/NativeLibLoader
-java/awt/event/NativeLibLoader$1
-java/awt/event/PaintEvent
-java/awt/event/TextListener
-java/awt/event/WindowAdapter
-java/awt/event/WindowEvent
-java/awt/event/WindowFocusListener
-java/awt/event/WindowListener
-java/awt/event/WindowStateListener
-java/awt/font/FontRenderContext
-java/awt/font/GlyphVector
-java/awt/font/LineMetrics
-java/awt/font/TextAttribute
-java/awt/geom/AffineTransform
-java/awt/geom/Dimension2D
-java/awt/geom/GeneralPath
-java/awt/geom/Path2D
-java/awt/geom/Path2D$Float
-java/awt/geom/Point2D
-java/awt/geom/Point2D$Double
-java/awt/geom/Point2D$Float
-java/awt/geom/Rectangle2D
-java/awt/geom/Rectangle2D$Double
-java/awt/geom/Rectangle2D$Float
-java/awt/geom/RectangularShape
-java/awt/im/InputContext
-java/awt/im/InputMethodRequests
-java/awt/im/spi/InputMethod
-java/awt/im/spi/InputMethodContext
-java/awt/im/spi/InputMethodDescriptor
-java/awt/image/BufferStrategy
-java/awt/image/BufferedImage
-java/awt/image/BufferedImage$1
-java/awt/image/ColorModel
-java/awt/image/ColorModel$1
-java/awt/image/ComponentSampleModel
-java/awt/image/DataBuffer
-java/awt/image/DataBuffer$1
-java/awt/image/DataBufferByte
-java/awt/image/DataBufferInt
-java/awt/image/DirectColorModel
-java/awt/image/FilteredImageSource
-java/awt/image/ImageConsumer
-java/awt/image/ImageFilter
-java/awt/image/ImageObserver
-java/awt/image/ImageProducer
-java/awt/image/IndexColorModel
-java/awt/image/PackedColorModel
-java/awt/image/PixelInterleavedSampleModel
-java/awt/image/RGBImageFilter
-java/awt/image/Raster
-java/awt/image/RenderedImage
-java/awt/image/SampleModel
-java/awt/image/SinglePixelPackedSampleModel
-java/awt/image/VolatileImage
-java/awt/image/WritableRaster
-java/awt/image/WritableRenderedImage
-java/awt/peer/CanvasPeer
-java/awt/peer/ComponentPeer
-java/awt/peer/ContainerPeer
-java/awt/peer/DialogPeer
-java/awt/peer/FramePeer
-java/awt/peer/KeyboardFocusManagerPeer
-java/awt/peer/LabelPeer
-java/awt/peer/LightweightPeer
-java/awt/peer/PanelPeer
-java/awt/peer/WindowPeer
-java/awt/print/PrinterGraphics
-java/beans/ChangeListenerMap
-java/beans/PropertyChangeEvent
-java/beans/PropertyChangeListener
-java/beans/PropertyChangeListenerProxy
-java/beans/PropertyChangeSupport
-java/beans/PropertyChangeSupport$PropertyChangeListenerMap
-java/io/Bits
-java/io/BufferedInputStream
-java/io/BufferedOutputStream
-java/io/BufferedReader
-java/io/BufferedWriter
-java/io/ByteArrayInputStream
-java/io/ByteArrayOutputStream
-java/io/Closeable
-java/io/DataInput
-java/io/DataInputStream
-java/io/DataOutput
-java/io/DataOutputStream
-java/io/DefaultFileSystem
-java/io/EOFException
-java/io/ExpiringCache
-java/io/ExpiringCache$1
-java/io/ExpiringCache$Entry
-java/io/Externalizable
-java/io/File
-java/io/File$PathStatus
-java/io/FileDescriptor
-java/io/FileDescriptor$1
-java/io/FileInputStream
-java/io/FileInputStream$1
-java/io/FileNotFoundException
-java/io/FileOutputStream
-java/io/FileOutputStream$1
-java/io/FilePermission
-java/io/FilePermission$1
-java/io/FilePermissionCollection
-java/io/FileReader
-java/io/FileSystem
-java/io/FileWriter
-java/io/FilenameFilter
-java/io/FilterInputStream
-java/io/FilterOutputStream
-java/io/FilterReader
-java/io/Flushable
-java/io/IOException
-java/io/InputStream
-java/io/InputStreamReader
-java/io/ObjectInput
-java/io/ObjectInputStream
-java/io/ObjectOutput
-java/io/ObjectOutputStream
-java/io/ObjectOutputStream$BlockDataOutputStream
-java/io/ObjectOutputStream$HandleTable
-java/io/ObjectOutputStream$ReplaceTable
-java/io/ObjectStreamClass
-java/io/ObjectStreamClass$2
-java/io/ObjectStreamClass$Caches
-java/io/ObjectStreamClass$EntryFuture
-java/io/ObjectStreamClass$FieldReflector
-java/io/ObjectStreamClass$FieldReflectorKey
-java/io/ObjectStreamClass$WeakClassKey
-java/io/ObjectStreamConstants
-java/io/ObjectStreamField
-java/io/OutputStream
-java/io/OutputStreamWriter
-java/io/PrintStream
-java/io/PrintWriter
-java/io/RandomAccessFile
-java/io/Reader
-java/io/Serializable
-java/io/StringReader
-java/io/StringWriter
-java/io/UnixFileSystem
-java/io/UnsupportedEncodingException
-java/io/Writer
-java/lang/AbstractStringBuilder
-java/lang/Appendable
-java/lang/ApplicationShutdownHooks
-java/lang/ApplicationShutdownHooks$1
-java/lang/ArithmeticException
-java/lang/ArrayIndexOutOfBoundsException
-java/lang/ArrayStoreException
-java/lang/AutoCloseable
-java/lang/Boolean
-java/lang/BootstrapMethodError
-java/lang/Byte
-java/lang/CharSequence
-java/lang/Character
-java/lang/Character$CharacterCache
-java/lang/CharacterData
-java/lang/CharacterDataLatin1
-java/lang/Class
-java/lang/Class$1
-java/lang/Class$3
-java/lang/Class$4
-java/lang/Class$AnnotationData
-java/lang/Class$Atomic
-java/lang/Class$ReflectionData
-java/lang/ClassCastException
-java/lang/ClassLoader
-java/lang/ClassLoader$2
-java/lang/ClassLoader$3
-java/lang/ClassLoader$NativeLibrary
-java/lang/ClassLoader$ParallelLoaders
-java/lang/ClassLoaderHelper
-java/lang/ClassNotFoundException
-java/lang/ClassValue$ClassValueMap
-java/lang/CloneNotSupportedException
-java/lang/Cloneable
-java/lang/Comparable
-java/lang/Compiler
-java/lang/Compiler$1
-java/lang/Double
-java/lang/Enum
-java/lang/Error
-java/lang/Exception
-java/lang/ExceptionInInitializerError
-java/lang/Float
-java/lang/IllegalAccessError
-java/lang/IllegalAccessException
-java/lang/IllegalArgumentException
-java/lang/IllegalMonitorStateException
-java/lang/IllegalStateException
-java/lang/IncompatibleClassChangeError
-java/lang/IndexOutOfBoundsException
-java/lang/InstantiationException
-java/lang/Integer
-java/lang/Integer$IntegerCache
-java/lang/InternalError
-java/lang/InterruptedException
-java/lang/Iterable
-java/lang/LinkageError
-java/lang/Long
-java/lang/Long$LongCache
-java/lang/Math
-java/lang/NoClassDefFoundError
-java/lang/NoSuchFieldException
-java/lang/NoSuchMethodError
-java/lang/NoSuchMethodException
-java/lang/NullPointerException
-java/lang/Number
-java/lang/NumberFormatException
-java/lang/Object
-java/lang/OutOfMemoryError
-java/lang/Package
-java/lang/Process
-java/lang/ProcessBuilder
-java/lang/ProcessBuilder$NullInputStream
-java/lang/ProcessBuilder$NullOutputStream
-java/lang/ProcessEnvironment
-java/lang/ProcessEnvironment$ExternalData
-java/lang/ProcessEnvironment$StringEnvironment
-java/lang/ProcessEnvironment$Value
-java/lang/ProcessEnvironment$Variable
-java/lang/ProcessImpl
-java/lang/Readable
-java/lang/ReflectiveOperationException
-java/lang/Runnable
-java/lang/Runtime
-java/lang/RuntimeException
-java/lang/RuntimePermission
-java/lang/SecurityException
-java/lang/SecurityManager
-java/lang/Short
-java/lang/Short$ShortCache
-java/lang/Shutdown
-java/lang/Shutdown$Lock
-java/lang/StackOverflowError
-java/lang/StackTraceElement
-java/lang/StrictMath
-java/lang/String
-java/lang/String$CaseInsensitiveComparator
-java/lang/StringBuffer
-java/lang/StringBuilder
-java/lang/StringCoding
-java/lang/StringCoding$StringDecoder
-java/lang/StringCoding$StringEncoder
-java/lang/StringIndexOutOfBoundsException
-java/lang/System
-java/lang/System$2
-java/lang/SystemClassLoaderAction
-java/lang/Terminator
-java/lang/Terminator$1
-java/lang/Thread
-java/lang/Thread$UncaughtExceptionHandler
-java/lang/ThreadDeath
-java/lang/ThreadGroup
-java/lang/ThreadLocal
-java/lang/ThreadLocal$ThreadLocalMap
-java/lang/ThreadLocal$ThreadLocalMap$Entry
-java/lang/Throwable
-java/lang/Throwable$PrintStreamOrWriter
-java/lang/Throwable$WrappedPrintStream
-java/lang/Throwable$WrappedPrintWriter
-java/lang/UNIXProcess
-java/lang/UNIXProcess$1
-java/lang/UNIXProcess$2
-java/lang/UNIXProcess$3
-java/lang/UNIXProcess$4
-java/lang/UNIXProcess$LaunchMechanism
-java/lang/UNIXProcess$ProcessPipeInputStream
-java/lang/UNIXProcess$ProcessPipeOutputStream
-java/lang/UNIXProcess$ProcessReaperThreadFactory
-java/lang/UNIXProcess$ProcessReaperThreadFactory$1
-java/lang/UnsatisfiedLinkError
-java/lang/UnsupportedOperationException
-java/lang/VirtualMachineError
-java/lang/Void
-java/lang/annotation/Annotation
-java/lang/invoke/CallSite
-java/lang/invoke/ConstantCallSite
-java/lang/invoke/DirectMethodHandle
-java/lang/invoke/Invokers
-java/lang/invoke/LambdaForm
-java/lang/invoke/LambdaForm$NamedFunction
-java/lang/invoke/MagicLambdaImpl
-java/lang/invoke/MemberName
-java/lang/invoke/MemberName$Factory
-java/lang/invoke/MethodHandle
-java/lang/invoke/MethodHandleImpl
-java/lang/invoke/MethodHandleNatives
-java/lang/invoke/MethodHandleStatics
-java/lang/invoke/MethodHandleStatics$1
-java/lang/invoke/MethodType
-java/lang/invoke/MethodType$ConcurrentWeakInternSet
-java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry
-java/lang/invoke/MethodTypeForm
-java/lang/invoke/MutableCallSite
-java/lang/invoke/VolatileCallSite
-java/lang/ref/FinalReference
-java/lang/ref/Finalizer
-java/lang/ref/Finalizer$FinalizerThread
-java/lang/ref/PhantomReference
-java/lang/ref/Reference
-java/lang/ref/Reference$Lock
-java/lang/ref/Reference$ReferenceHandler
-java/lang/ref/ReferenceQueue
-java/lang/ref/ReferenceQueue$Lock
-java/lang/ref/ReferenceQueue$Null
-java/lang/ref/SoftReference
-java/lang/ref/WeakReference
-java/lang/reflect/AccessibleObject
-java/lang/reflect/AnnotatedElement
-java/lang/reflect/Array
-java/lang/reflect/Constructor
-java/lang/reflect/Executable
-java/lang/reflect/Field
-java/lang/reflect/GenericDeclaration
-java/lang/reflect/InvocationHandler
-java/lang/reflect/InvocationTargetException
-java/lang/reflect/Member
-java/lang/reflect/Method
-java/lang/reflect/Modifier
-java/lang/reflect/Parameter
-java/lang/reflect/Proxy
-java/lang/reflect/Proxy$KeyFactory
-java/lang/reflect/Proxy$ProxyClassFactory
-java/lang/reflect/ReflectAccess
-java/lang/reflect/ReflectPermission
-java/lang/reflect/Type
-java/lang/reflect/WeakCache
-java/net/AbstractPlainSocketImpl
-java/net/AbstractPlainSocketImpl$1
-java/net/Authenticator
-java/net/ConnectException
-java/net/DefaultInterface
-java/net/HttpURLConnection
-java/net/Inet4Address
-java/net/Inet6Address
-java/net/Inet6Address$Inet6AddressHolder
-java/net/Inet6AddressImpl
-java/net/InetAddress
-java/net/InetAddress$1
-java/net/InetAddress$2
-java/net/InetAddress$Cache
-java/net/InetAddress$Cache$Type
-java/net/InetAddress$InetAddressHolder
-java/net/InetAddressImpl
-java/net/InetAddressImplFactory
-java/net/InetSocketAddress
-java/net/InetSocketAddress$InetSocketAddressHolder
-java/net/InterfaceAddress
-java/net/JarURLConnection
-java/net/MalformedURLException
-java/net/NetworkInterface
-java/net/NetworkInterface$1
-java/net/NetworkInterface$2
-java/net/Parts
-java/net/PlainSocketImpl
-java/net/Proxy
-java/net/Proxy$Type
-java/net/ProxySelector
-java/net/ServerSocket
-java/net/Socket
-java/net/SocketAddress
-java/net/SocketException
-java/net/SocketImpl
-java/net/SocketOptions
-java/net/SocksConsts
-java/net/SocksSocketImpl
-java/net/SocksSocketImpl$3
-java/net/URI
-java/net/URI$Parser
-java/net/URL
-java/net/URLClassLoader
-java/net/URLClassLoader$1
-java/net/URLClassLoader$2
-java/net/URLClassLoader$3
-java/net/URLClassLoader$3$1
-java/net/URLClassLoader$7
-java/net/URLConnection
-java/net/URLStreamHandler
-java/net/URLStreamHandlerFactory
-java/nio/Bits
-java/nio/Bits$1
-java/nio/Buffer
-java/nio/ByteBuffer
-java/nio/ByteBufferAsIntBufferB
-java/nio/ByteBufferAsShortBufferB
-java/nio/ByteOrder
-java/nio/CharBuffer
-java/nio/DirectByteBuffer
-java/nio/DirectByteBuffer$Deallocator
-java/nio/DirectLongBufferU
-java/nio/HeapByteBuffer
-java/nio/HeapCharBuffer
-java/nio/IntBuffer
-java/nio/LongBuffer
-java/nio/MappedByteBuffer
-java/nio/ShortBuffer
-java/nio/channels/ByteChannel
-java/nio/channels/Channel
-java/nio/channels/FileChannel
-java/nio/channels/GatheringByteChannel
-java/nio/channels/InterruptibleChannel
-java/nio/channels/ReadableByteChannel
-java/nio/channels/ScatteringByteChannel
-java/nio/channels/SeekableByteChannel
-java/nio/channels/WritableByteChannel
-java/nio/channels/spi/AbstractInterruptibleChannel
-java/nio/channels/spi/AbstractInterruptibleChannel$1
-java/nio/charset/Charset
-java/nio/charset/CharsetDecoder
-java/nio/charset/CharsetEncoder
-java/nio/charset/CoderResult
-java/nio/charset/CoderResult$1
-java/nio/charset/CoderResult$2
-java/nio/charset/CoderResult$Cache
-java/nio/charset/CodingErrorAction
-java/nio/charset/StandardCharsets
-java/nio/charset/spi/CharsetProvider
-java/nio/file/Path
-java/nio/file/Watchable
-java/nio/file/attribute/FileAttribute
-java/rmi/MarshalledObject
-java/rmi/Remote
-java/security/AccessControlContext
-java/security/AccessController
-java/security/AllPermission
-java/security/AllPermissionCollection
-java/security/BasicPermission
-java/security/BasicPermissionCollection
-java/security/CodeSigner
-java/security/CodeSource
-java/security/Guard
-java/security/Permission
-java/security/PermissionCollection
-java/security/Permissions
-java/security/Principal
-java/security/PrivilegedAction
-java/security/PrivilegedActionException
-java/security/PrivilegedExceptionAction
-java/security/ProtectionDomain
-java/security/ProtectionDomain$1
-java/security/ProtectionDomain$3
-java/security/ProtectionDomain$Key
-java/security/SecureClassLoader
-java/security/UnresolvedPermission
-java/security/cert/Certificate
-java/text/AttributedCharacterIterator
-java/text/AttributedCharacterIterator$Attribute
-java/text/AttributedString
-java/text/AttributedString$AttributedStringIterator
-java/text/CharacterIterator
-java/text/FieldPosition
-java/text/Format
-java/text/Format$Field
-java/text/MessageFormat
-java/text/MessageFormat$Field
-java/text/spi/BreakIteratorProvider
-java/text/spi/CollatorProvider
-java/text/spi/DateFormatProvider
-java/text/spi/DateFormatSymbolsProvider
-java/text/spi/DecimalFormatSymbolsProvider
-java/text/spi/NumberFormatProvider
-java/util/AbstractCollection
-java/util/AbstractList
-java/util/AbstractList$Itr
-java/util/AbstractMap
-java/util/AbstractQueue
-java/util/AbstractSequentialList
-java/util/AbstractSet
-java/util/ArrayDeque
-java/util/ArrayList
-java/util/ArrayList$Itr
-java/util/ArrayList$ListItr
-java/util/ArrayList$SubList
-java/util/ArrayList$SubList$1
-java/util/Arrays
-java/util/Arrays$ArrayList
-java/util/Arrays$LegacyMergeSort
-java/util/BitSet
-java/util/Collection
-java/util/Collections
-java/util/Collections$EmptyEnumeration
-java/util/Collections$EmptyList
-java/util/Collections$EmptyMap
-java/util/Collections$EmptySet
-java/util/Collections$SetFromMap
-java/util/Collections$SynchronizedCollection
-java/util/Collections$SynchronizedMap
-java/util/Collections$SynchronizedSet
-java/util/Collections$UnmodifiableCollection
-java/util/Collections$UnmodifiableCollection$1
-java/util/Collections$UnmodifiableList
-java/util/Collections$UnmodifiableMap
-java/util/Collections$UnmodifiableRandomAccessList
-java/util/Collections$UnmodifiableSet
-java/util/Collections$UnmodifiableSortedSet
-java/util/ComparableTimSort
-java/util/Comparator
-java/util/Date
-java/util/Deque
-java/util/Dictionary
-java/util/Enumeration
-java/util/EventListener
-java/util/EventListenerProxy
-java/util/EventObject
-java/util/HashMap
-java/util/HashMap$EntryIterator
-java/util/HashMap$EntrySet
-java/util/HashMap$HashIterator
-java/util/HashMap$KeyIterator
-java/util/HashMap$KeySet
-java/util/HashMap$Node
-java/util/HashMap$TreeNode
-java/util/HashMap$ValueIterator
-java/util/HashMap$Values
-java/util/HashSet
-java/util/Hashtable
-java/util/Hashtable$Entry
-java/util/Hashtable$EntrySet
-java/util/Hashtable$Enumerator
-java/util/Hashtable$ValueCollection
-java/util/IdentityHashMap
-java/util/IdentityHashMap$IdentityHashMapIterator
-java/util/IdentityHashMap$KeyIterator
-java/util/IdentityHashMap$KeySet
-java/util/Iterator
-java/util/LinkedHashMap
-java/util/LinkedHashMap$Entry
-java/util/LinkedHashMap$LinkedEntryIterator
-java/util/LinkedHashMap$LinkedEntrySet
-java/util/LinkedHashMap$LinkedHashIterator
-java/util/LinkedHashMap$LinkedKeyIterator
-java/util/LinkedHashMap$LinkedKeySet
-java/util/LinkedHashSet
-java/util/LinkedList
-java/util/LinkedList$ListItr
-java/util/LinkedList$Node
-java/util/List
-java/util/ListIterator
-java/util/ListResourceBundle
-java/util/Locale
-java/util/Locale$1
-java/util/Locale$Cache
-java/util/Locale$Category
-java/util/Locale$LocaleKey
-java/util/Map
-java/util/Map$Entry
-java/util/MissingResourceException
-java/util/NavigableMap
-java/util/NavigableSet
-java/util/Objects
-java/util/PriorityQueue
-java/util/Properties
-java/util/Properties$LineReader
-java/util/PropertyResourceBundle
-java/util/Queue
-java/util/Random
-java/util/RandomAccess
-java/util/ResourceBundle
-java/util/ResourceBundle$1
-java/util/ResourceBundle$BundleReference
-java/util/ResourceBundle$CacheKey
-java/util/ResourceBundle$CacheKeyReference
-java/util/ResourceBundle$Control
-java/util/ResourceBundle$Control$1
-java/util/ResourceBundle$Control$CandidateListCache
-java/util/ResourceBundle$LoaderReference
-java/util/ResourceBundle$RBClassLoader
-java/util/ResourceBundle$RBClassLoader$1
-java/util/ResourceBundle$SingleFormatControl
-java/util/ServiceLoader
-java/util/ServiceLoader$1
-java/util/ServiceLoader$LazyIterator
-java/util/Set
-java/util/SortedMap
-java/util/SortedSet
-java/util/Stack
-java/util/StringTokenizer
-java/util/TimSort
-java/util/TimeZone
-java/util/TimeZone$1
-java/util/TreeMap
-java/util/TreeMap$Entry
-java/util/TreeMap$KeyIterator
-java/util/TreeMap$KeySet
-java/util/TreeMap$PrivateEntryIterator
-java/util/TreeSet
-java/util/Vector
-java/util/Vector$1
-java/util/Vector$Itr
-java/util/Vector$ListItr
-java/util/WeakHashMap
-java/util/WeakHashMap$Entry
-java/util/WeakHashMap$HashIterator
-java/util/WeakHashMap$KeyIterator
-java/util/WeakHashMap$KeySet
-java/util/concurrent/AbstractExecutorService
-java/util/concurrent/BlockingQueue
-java/util/concurrent/ConcurrentHashMap
-java/util/concurrent/ConcurrentHashMap$BaseIterator
-java/util/concurrent/ConcurrentHashMap$CollectionView
-java/util/concurrent/ConcurrentHashMap$CounterCell
-java/util/concurrent/ConcurrentHashMap$EntrySetView
-java/util/concurrent/ConcurrentHashMap$ForwardingNode
-java/util/concurrent/ConcurrentHashMap$KeyIterator
-java/util/concurrent/ConcurrentHashMap$KeySetView
-java/util/concurrent/ConcurrentHashMap$Node
-java/util/concurrent/ConcurrentHashMap$Segment
-java/util/concurrent/ConcurrentHashMap$Traverser
-java/util/concurrent/ConcurrentHashMap$ValuesView
-java/util/concurrent/ConcurrentMap
-java/util/concurrent/CopyOnWriteArrayList
-java/util/concurrent/DelayQueue
-java/util/concurrent/Delayed
-java/util/concurrent/Executor
-java/util/concurrent/ExecutorService
-java/util/concurrent/Executors
-java/util/concurrent/RejectedExecutionHandler
-java/util/concurrent/SynchronousQueue
-java/util/concurrent/SynchronousQueue$TransferStack
-java/util/concurrent/SynchronousQueue$TransferStack$SNode
-java/util/concurrent/SynchronousQueue$Transferer
-java/util/concurrent/ThreadFactory
-java/util/concurrent/ThreadPoolExecutor
-java/util/concurrent/ThreadPoolExecutor$AbortPolicy
-java/util/concurrent/ThreadPoolExecutor$Worker
-java/util/concurrent/TimeUnit
-java/util/concurrent/TimeUnit$1
-java/util/concurrent/TimeUnit$2
-java/util/concurrent/TimeUnit$3
-java/util/concurrent/TimeUnit$4
-java/util/concurrent/TimeUnit$5
-java/util/concurrent/TimeUnit$6
-java/util/concurrent/TimeUnit$7
-java/util/concurrent/atomic/AtomicBoolean
-java/util/concurrent/atomic/AtomicInteger
-java/util/concurrent/atomic/AtomicLong
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1
-java/util/concurrent/locks/AbstractOwnableSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject
-java/util/concurrent/locks/AbstractQueuedSynchronizer$Node
-java/util/concurrent/locks/Condition
-java/util/concurrent/locks/Lock
-java/util/concurrent/locks/LockSupport
-java/util/concurrent/locks/ReadWriteLock
-java/util/concurrent/locks/ReentrantLock
-java/util/concurrent/locks/ReentrantLock$NonfairSync
-java/util/concurrent/locks/ReentrantLock$Sync
-java/util/concurrent/locks/ReentrantReadWriteLock
-java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync
-java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock
-java/util/concurrent/locks/ReentrantReadWriteLock$Sync
-java/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
-java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock
-java/util/function/BiFunction
-java/util/jar/Attributes
-java/util/jar/Attributes$Name
-java/util/jar/JarEntry
-java/util/jar/JarFile
-java/util/jar/JarFile$JarEntryIterator
-java/util/jar/JarFile$JarFileEntry
-java/util/jar/JarVerifier
-java/util/jar/JarVerifier$3
-java/util/jar/JavaUtilJarAccessImpl
-java/util/jar/Manifest
-java/util/jar/Manifest$FastInputStream
-java/util/logging/Handler
-java/util/logging/Level
-java/util/logging/Level$KnownLevel
-java/util/logging/LogManager
-java/util/logging/LogManager$1
-java/util/logging/LogManager$2
-java/util/logging/LogManager$3
-java/util/logging/LogManager$5
-java/util/logging/LogManager$Cleaner
-java/util/logging/LogManager$LogNode
-java/util/logging/LogManager$LoggerContext
-java/util/logging/LogManager$LoggerContext$1
-java/util/logging/LogManager$LoggerWeakRef
-java/util/logging/LogManager$RootLogger
-java/util/logging/LogManager$SystemLoggerContext
-java/util/logging/Logger
-java/util/logging/Logger$1
-java/util/logging/LoggingPermission
-java/util/logging/LoggingProxyImpl
-java/util/spi/CalendarDataProvider
-java/util/spi/CurrencyNameProvider
-java/util/spi/LocaleNameProvider
-java/util/spi/LocaleServiceProvider
-java/util/spi/ResourceBundleControlProvider
-java/util/spi/TimeZoneNameProvider
-java/util/zip/CRC32
-java/util/zip/Checksum
-java/util/zip/Inflater
-java/util/zip/InflaterInputStream
-java/util/zip/ZStreamRef
-java/util/zip/ZipCoder
-java/util/zip/ZipConstants
-java/util/zip/ZipEntry
-java/util/zip/ZipException
-java/util/zip/ZipFile
-java/util/zip/ZipFile$1
-java/util/zip/ZipFile$ZipEntryIterator
-java/util/zip/ZipFile$ZipFileInflaterInputStream
-java/util/zip/ZipFile$ZipFileInputStream
-java/util/zip/ZipUtils
-javax/accessibility/Accessible
-javax/accessibility/AccessibleContext
-javax/swing/AbstractAction
-javax/swing/AbstractButton
-javax/swing/AbstractButton$Handler
-javax/swing/AbstractListModel
-javax/swing/Action
-javax/swing/ActionMap
-javax/swing/AncestorNotifier
-javax/swing/ArrayTable
-javax/swing/Autoscroller
-javax/swing/BorderFactory
-javax/swing/BoundedRangeModel
-javax/swing/Box
-javax/swing/Box$Filler
-javax/swing/BoxLayout
-javax/swing/ButtonGroup
-javax/swing/ButtonModel
-javax/swing/CellRendererPane
-javax/swing/ClientPropertyKey
-javax/swing/ClientPropertyKey$1
-javax/swing/ComboBoxEditor
-javax/swing/ComboBoxModel
-javax/swing/ComponentInputMap
-javax/swing/DefaultBoundedRangeModel
-javax/swing/DefaultButtonModel
-javax/swing/DefaultComboBoxModel
-javax/swing/DefaultListCellRenderer
-javax/swing/DefaultListCellRenderer$UIResource
-javax/swing/DefaultListSelectionModel
-javax/swing/DefaultSingleSelectionModel
-javax/swing/DropMode
-javax/swing/FocusManager
-javax/swing/GrayFilter
-javax/swing/Icon
-javax/swing/ImageIcon
-javax/swing/ImageIcon$1
-javax/swing/ImageIcon$2
-javax/swing/ImageIcon$2$1
-javax/swing/ImageIcon$3
-javax/swing/InputMap
-javax/swing/InternalFrameFocusTraversalPolicy
-javax/swing/JButton
-javax/swing/JCheckBox
-javax/swing/JCheckBoxMenuItem
-javax/swing/JComboBox
-javax/swing/JComboBox$1
-javax/swing/JComboBox$KeySelectionManager
-javax/swing/JComponent
-javax/swing/JComponent$1
-javax/swing/JComponent$2
-javax/swing/JDialog
-javax/swing/JEditorPane
-javax/swing/JFrame
-javax/swing/JInternalFrame
-javax/swing/JLabel
-javax/swing/JLayer
-javax/swing/JLayeredPane
-javax/swing/JList
-javax/swing/JMenu
-javax/swing/JMenu$MenuChangeListener
-javax/swing/JMenu$WinListener
-javax/swing/JMenuBar
-javax/swing/JMenuItem
-javax/swing/JMenuItem$MenuItemFocusListener
-javax/swing/JPanel
-javax/swing/JPasswordField
-javax/swing/JPopupMenu
-javax/swing/JPopupMenu$Separator
-javax/swing/JRadioButton
-javax/swing/JRadioButtonMenuItem
-javax/swing/JRootPane
-javax/swing/JRootPane$1
-javax/swing/JRootPane$RootLayout
-javax/swing/JScrollBar
-javax/swing/JScrollBar$ModelListener
-javax/swing/JScrollPane
-javax/swing/JScrollPane$ScrollBar
-javax/swing/JSeparator
-javax/swing/JSplitPane
-javax/swing/JTextArea
-javax/swing/JTextField
-javax/swing/JTextField$NotifyAction
-javax/swing/JTextField$ScrollRepainter
-javax/swing/JToggleButton
-javax/swing/JToggleButton$ToggleButtonModel
-javax/swing/JToolBar
-javax/swing/JToolBar$DefaultToolBarLayout
-javax/swing/JToolBar$Separator
-javax/swing/JViewport
-javax/swing/JViewport$ViewListener
-javax/swing/JWindow
-javax/swing/KeyStroke
-javax/swing/KeyboardManager
-javax/swing/KeyboardManager$ComponentKeyStrokePair
-javax/swing/LayoutComparator
-javax/swing/LayoutFocusTraversalPolicy
-javax/swing/ListCellRenderer
-javax/swing/ListModel
-javax/swing/ListSelectionModel
-javax/swing/LookAndFeel
-javax/swing/MenuElement
-javax/swing/MenuSelectionManager
-javax/swing/MultiUIDefaults
-javax/swing/MutableComboBoxModel
-javax/swing/PopupFactory
-javax/swing/RepaintManager
-javax/swing/RepaintManager$2
-javax/swing/RepaintManager$3
-javax/swing/RepaintManager$DisplayChangedHandler
-javax/swing/RepaintManager$PaintManager
-javax/swing/RepaintManager$ProcessingRunnable
-javax/swing/RootPaneContainer
-javax/swing/ScrollPaneConstants
-javax/swing/ScrollPaneLayout
-javax/swing/ScrollPaneLayout$UIResource
-javax/swing/Scrollable
-javax/swing/SingleSelectionModel
-javax/swing/SizeRequirements
-javax/swing/SortingFocusTraversalPolicy
-javax/swing/SwingConstants
-javax/swing/SwingContainerOrderFocusTraversalPolicy
-javax/swing/SwingDefaultFocusTraversalPolicy
-javax/swing/SwingHeavyWeight
-javax/swing/SwingPaintEventDispatcher
-javax/swing/SwingUtilities
-javax/swing/SwingUtilities$SharedOwnerFrame
-javax/swing/Timer
-javax/swing/Timer$DoPostEvent
-javax/swing/TimerQueue
-javax/swing/TimerQueue$1
-javax/swing/TimerQueue$DelayedTimer
-javax/swing/ToolTipManager
-javax/swing/ToolTipManager$AccessibilityKeyListener
-javax/swing/ToolTipManager$MoveBeforeEnterListener
-javax/swing/ToolTipManager$insideTimerAction
-javax/swing/ToolTipManager$outsideTimerAction
-javax/swing/ToolTipManager$stillInsideTimerAction
-javax/swing/TransferHandler
-javax/swing/TransferHandler$DropHandler
-javax/swing/TransferHandler$HasGetTransferHandler
-javax/swing/TransferHandler$SwingDropTarget
-javax/swing/TransferHandler$TransferAction
-javax/swing/TransferHandler$TransferAction$1
-javax/swing/TransferHandler$TransferAction$2
-javax/swing/TransferHandler$TransferSupport
-javax/swing/UIDefaults
-javax/swing/UIDefaults$ActiveValue
-javax/swing/UIDefaults$LazyInputMap
-javax/swing/UIDefaults$LazyValue
-javax/swing/UIDefaults$TextAndMnemonicHashMap
-javax/swing/UIManager
-javax/swing/UIManager$1
-javax/swing/UIManager$2
-javax/swing/UIManager$LAFState
-javax/swing/UIManager$LookAndFeelInfo
-javax/swing/ViewportLayout
-javax/swing/WindowConstants
-javax/swing/border/AbstractBorder
-javax/swing/border/BevelBorder
-javax/swing/border/Border
-javax/swing/border/CompoundBorder
-javax/swing/border/EmptyBorder
-javax/swing/border/EtchedBorder
-javax/swing/border/LineBorder
-javax/swing/border/MatteBorder
-javax/swing/event/AncestorEvent
-javax/swing/event/AncestorListener
-javax/swing/event/CaretEvent
-javax/swing/event/CaretListener
-javax/swing/event/ChangeEvent
-javax/swing/event/ChangeListener
-javax/swing/event/DocumentEvent
-javax/swing/event/DocumentEvent$ElementChange
-javax/swing/event/DocumentEvent$EventType
-javax/swing/event/DocumentListener
-javax/swing/event/EventListenerList
-javax/swing/event/ListDataListener
-javax/swing/event/ListSelectionListener
-javax/swing/event/MenuDragMouseListener
-javax/swing/event/MenuEvent
-javax/swing/event/MenuKeyListener
-javax/swing/event/MenuListener
-javax/swing/event/MouseInputAdapter
-javax/swing/event/MouseInputListener
-javax/swing/event/PopupMenuListener
-javax/swing/event/UndoableEditEvent
-javax/swing/event/UndoableEditListener
-javax/swing/plaf/ActionMapUIResource
-javax/swing/plaf/BorderUIResource
-javax/swing/plaf/BorderUIResource$EmptyBorderUIResource
-javax/swing/plaf/BorderUIResource$LineBorderUIResource
-javax/swing/plaf/ButtonUI
-javax/swing/plaf/ColorUIResource
-javax/swing/plaf/ComboBoxUI
-javax/swing/plaf/ComponentInputMapUIResource
-javax/swing/plaf/ComponentUI
-javax/swing/plaf/DimensionUIResource
-javax/swing/plaf/FontUIResource
-javax/swing/plaf/IconUIResource
-javax/swing/plaf/InputMapUIResource
-javax/swing/plaf/InsetsUIResource
-javax/swing/plaf/LabelUI
-javax/swing/plaf/ListUI
-javax/swing/plaf/MenuBarUI
-javax/swing/plaf/MenuItemUI
-javax/swing/plaf/PanelUI
-javax/swing/plaf/PopupMenuUI
-javax/swing/plaf/RootPaneUI
-javax/swing/plaf/ScrollBarUI
-javax/swing/plaf/ScrollPaneUI
-javax/swing/plaf/SeparatorUI
-javax/swing/plaf/TextUI
-javax/swing/plaf/ToolBarUI
-javax/swing/plaf/UIResource
-javax/swing/plaf/ViewportUI
-javax/swing/plaf/basic/BasicBorders$ButtonBorder
-javax/swing/plaf/basic/BasicBorders$MarginBorder
-javax/swing/plaf/basic/BasicBorders$RadioButtonBorder
-javax/swing/plaf/basic/BasicBorders$RolloverButtonBorder
-javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder
-javax/swing/plaf/basic/BasicButtonListener
-javax/swing/plaf/basic/BasicButtonUI
-javax/swing/plaf/basic/BasicComboBoxEditor
-javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField
-javax/swing/plaf/basic/BasicComboBoxEditor$UIResource
-javax/swing/plaf/basic/BasicComboBoxUI
-javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager
-javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager
-javax/swing/plaf/basic/BasicComboBoxUI$FocusHandler
-javax/swing/plaf/basic/BasicComboBoxUI$Handler
-javax/swing/plaf/basic/BasicComboPopup
-javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass
-javax/swing/plaf/basic/BasicComboPopup$Handler
-javax/swing/plaf/basic/BasicGraphicsUtils
-javax/swing/plaf/basic/BasicHTML
-javax/swing/plaf/basic/BasicIconFactory
-javax/swing/plaf/basic/BasicIconFactory$MenuItemArrowIcon
-javax/swing/plaf/basic/BasicIconFactory$MenuItemCheckIcon
-javax/swing/plaf/basic/BasicLabelUI
-javax/swing/plaf/basic/BasicListUI
-javax/swing/plaf/basic/BasicListUI$FocusHandler
-javax/swing/plaf/basic/BasicListUI$Handler
-javax/swing/plaf/basic/BasicListUI$ListTransferHandler
-javax/swing/plaf/basic/BasicListUI$MouseInputHandler
-javax/swing/plaf/basic/BasicListUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicLookAndFeel
-javax/swing/plaf/basic/BasicLookAndFeel$1
-javax/swing/plaf/basic/BasicLookAndFeel$2
-javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper
-javax/swing/plaf/basic/BasicMenuBarUI
-javax/swing/plaf/basic/BasicMenuBarUI$Handler
-javax/swing/plaf/basic/BasicMenuItemUI
-javax/swing/plaf/basic/BasicMenuItemUI$Handler
-javax/swing/plaf/basic/BasicMenuUI
-javax/swing/plaf/basic/BasicMenuUI$ChangeHandler
-javax/swing/plaf/basic/BasicMenuUI$Handler
-javax/swing/plaf/basic/BasicMenuUI$MouseInputHandler
-javax/swing/plaf/basic/BasicPanelUI
-javax/swing/plaf/basic/BasicPopupMenuUI
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1
-javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber
-javax/swing/plaf/basic/BasicRootPaneUI
-javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap
-javax/swing/plaf/basic/BasicScrollPaneUI
-javax/swing/plaf/basic/BasicScrollPaneUI$Handler
-javax/swing/plaf/basic/BasicScrollPaneUI$MouseWheelHandler
-javax/swing/plaf/basic/BasicSeparatorUI
-javax/swing/plaf/basic/BasicTextAreaUI
-javax/swing/plaf/basic/BasicTextFieldUI
-javax/swing/plaf/basic/BasicTextUI
-javax/swing/plaf/basic/BasicTextUI$BasicCursor
-javax/swing/plaf/basic/BasicTextUI$DragListener
-javax/swing/plaf/basic/BasicTextUI$FocusAction
-javax/swing/plaf/basic/BasicTextUI$RootView
-javax/swing/plaf/basic/BasicTextUI$TextActionWrapper
-javax/swing/plaf/basic/BasicTextUI$TextTransferHandler
-javax/swing/plaf/basic/BasicTextUI$TextTransferHandler$TextTransferable
-javax/swing/plaf/basic/BasicTextUI$UpdateHandler
-javax/swing/plaf/basic/BasicToolBarSeparatorUI
-javax/swing/plaf/basic/BasicToolBarUI
-javax/swing/plaf/basic/BasicToolBarUI$Handler
-javax/swing/plaf/basic/BasicTransferable
-javax/swing/plaf/basic/BasicViewportUI
-javax/swing/plaf/basic/ComboPopup
-javax/swing/plaf/basic/DefaultMenuLayout
-javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag
-javax/swing/plaf/basic/LazyActionMap
-javax/swing/plaf/metal/DefaultMetalTheme
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1
-javax/swing/plaf/metal/MetalLookAndFeel
-javax/swing/plaf/metal/MetalTheme
-javax/swing/plaf/synth/SynthConstants
-javax/swing/plaf/synth/SynthUI
-javax/swing/text/AbstractDocument
-javax/swing/text/AbstractDocument$1
-javax/swing/text/AbstractDocument$AbstractElement
-javax/swing/text/AbstractDocument$AttributeContext
-javax/swing/text/AbstractDocument$BidiElement
-javax/swing/text/AbstractDocument$BidiRootElement
-javax/swing/text/AbstractDocument$BranchElement
-javax/swing/text/AbstractDocument$Content
-javax/swing/text/AbstractDocument$DefaultDocumentEvent
-javax/swing/text/AbstractDocument$ElementEdit
-javax/swing/text/AbstractDocument$InsertStringResult
-javax/swing/text/AbstractDocument$LeafElement
-javax/swing/text/AttributeSet
-javax/swing/text/AttributeSet$CharacterAttribute
-javax/swing/text/AttributeSet$ColorAttribute
-javax/swing/text/AttributeSet$FontAttribute
-javax/swing/text/AttributeSet$ParagraphAttribute
-javax/swing/text/Caret
-javax/swing/text/DefaultCaret
-javax/swing/text/DefaultCaret$1
-javax/swing/text/DefaultCaret$Handler
-javax/swing/text/DefaultEditorKit
-javax/swing/text/DefaultEditorKit$BeepAction
-javax/swing/text/DefaultEditorKit$BeginAction
-javax/swing/text/DefaultEditorKit$BeginLineAction
-javax/swing/text/DefaultEditorKit$BeginParagraphAction
-javax/swing/text/DefaultEditorKit$BeginWordAction
-javax/swing/text/DefaultEditorKit$CopyAction
-javax/swing/text/DefaultEditorKit$CutAction
-javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction
-javax/swing/text/DefaultEditorKit$DeleteNextCharAction
-javax/swing/text/DefaultEditorKit$DeletePrevCharAction
-javax/swing/text/DefaultEditorKit$DeleteWordAction
-javax/swing/text/DefaultEditorKit$DumpModelAction
-javax/swing/text/DefaultEditorKit$EndAction
-javax/swing/text/DefaultEditorKit$EndLineAction
-javax/swing/text/DefaultEditorKit$EndParagraphAction
-javax/swing/text/DefaultEditorKit$EndWordAction
-javax/swing/text/DefaultEditorKit$InsertBreakAction
-javax/swing/text/DefaultEditorKit$InsertContentAction
-javax/swing/text/DefaultEditorKit$InsertTabAction
-javax/swing/text/DefaultEditorKit$NextVisualPositionAction
-javax/swing/text/DefaultEditorKit$NextWordAction
-javax/swing/text/DefaultEditorKit$PageAction
-javax/swing/text/DefaultEditorKit$PasteAction
-javax/swing/text/DefaultEditorKit$PreviousWordAction
-javax/swing/text/DefaultEditorKit$ReadOnlyAction
-javax/swing/text/DefaultEditorKit$SelectAllAction
-javax/swing/text/DefaultEditorKit$SelectLineAction
-javax/swing/text/DefaultEditorKit$SelectParagraphAction
-javax/swing/text/DefaultEditorKit$SelectWordAction
-javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction
-javax/swing/text/DefaultEditorKit$UnselectAction
-javax/swing/text/DefaultEditorKit$VerticalPageAction
-javax/swing/text/DefaultEditorKit$WritableAction
-javax/swing/text/DefaultHighlighter
-javax/swing/text/DefaultHighlighter$DefaultHighlightPainter
-javax/swing/text/DefaultHighlighter$HighlightInfo
-javax/swing/text/DefaultHighlighter$LayeredHighlightInfo
-javax/swing/text/DefaultHighlighter$SafeDamager
-javax/swing/text/Document
-javax/swing/text/EditorKit
-javax/swing/text/Element
-javax/swing/text/FieldView
-javax/swing/text/GapContent
-javax/swing/text/GapContent$InsertUndo
-javax/swing/text/GapContent$MarkData
-javax/swing/text/GapContent$MarkVector
-javax/swing/text/GapContent$StickyPosition
-javax/swing/text/GapVector
-javax/swing/text/Highlighter
-javax/swing/text/Highlighter$Highlight
-javax/swing/text/Highlighter$HighlightPainter
-javax/swing/text/JTextComponent
-javax/swing/text/JTextComponent$1
-javax/swing/text/JTextComponent$DefaultKeymap
-javax/swing/text/JTextComponent$KeymapActionMap
-javax/swing/text/JTextComponent$KeymapWrapper
-javax/swing/text/JTextComponent$MutableCaretEvent
-javax/swing/text/Keymap
-javax/swing/text/LayeredHighlighter
-javax/swing/text/LayeredHighlighter$LayerPainter
-javax/swing/text/MutableAttributeSet
-javax/swing/text/PlainDocument
-javax/swing/text/PlainView
-javax/swing/text/Position
-javax/swing/text/Position$Bias
-javax/swing/text/Segment
-javax/swing/text/SegmentCache
-javax/swing/text/SegmentCache$CachedSegment
-javax/swing/text/SimpleAttributeSet
-javax/swing/text/SimpleAttributeSet$EmptyAttributeSet
-javax/swing/text/Style
-javax/swing/text/StyleConstants
-javax/swing/text/StyleConstants$CharacterConstants
-javax/swing/text/StyleConstants$ColorConstants
-javax/swing/text/StyleConstants$FontConstants
-javax/swing/text/StyleConstants$ParagraphConstants
-javax/swing/text/StyleContext
-javax/swing/text/StyleContext$FontKey
-javax/swing/text/StyleContext$KeyEnumeration
-javax/swing/text/StyleContext$NamedStyle
-javax/swing/text/StyleContext$SmallAttributeSet
-javax/swing/text/TabExpander
-javax/swing/text/TextAction
-javax/swing/text/Utilities
-javax/swing/text/View
-javax/swing/text/ViewFactory
-javax/swing/tree/TreeNode
-javax/swing/undo/AbstractUndoableEdit
-javax/swing/undo/CompoundEdit
-javax/swing/undo/UndoableEdit
-sun/awt/AWTAccessor
-sun/awt/AWTAccessor$AWTEventAccessor
-sun/awt/AWTAccessor$ClientPropertyKeyAccessor
-sun/awt/AWTAccessor$ComponentAccessor
-sun/awt/AWTAccessor$ContainerAccessor
-sun/awt/AWTAccessor$CursorAccessor
-sun/awt/AWTAccessor$DefaultKeyboardFocusManagerAccessor
-sun/awt/AWTAccessor$EventQueueAccessor
-sun/awt/AWTAccessor$FrameAccessor
-sun/awt/AWTAccessor$InputEventAccessor
-sun/awt/AWTAccessor$KeyEventAccessor
-sun/awt/AWTAccessor$KeyboardFocusManagerAccessor
-sun/awt/AWTAccessor$ToolkitAccessor
-sun/awt/AWTAccessor$WindowAccessor
-sun/awt/AWTAutoShutdown
-sun/awt/AppContext
-sun/awt/AppContext$1
-sun/awt/AppContext$2
-sun/awt/AppContext$3
-sun/awt/AppContext$6
-sun/awt/AppContext$State
-sun/awt/CGraphicsConfig
-sun/awt/CGraphicsDevice
-sun/awt/CGraphicsEnvironment
-sun/awt/CGraphicsEnvironment$1
-sun/awt/CGraphicsEnvironment$2
-sun/awt/CausedFocusEvent
-sun/awt/CausedFocusEvent$Cause
-sun/awt/ComponentFactory
-sun/awt/ConstrainableGraphics
-sun/awt/DisplayChangedListener
-sun/awt/EmbeddedFrame
-sun/awt/EventQueueDelegate
-sun/awt/EventQueueItem
-sun/awt/FontConfiguration
-sun/awt/FontDescriptor
-sun/awt/FullScreenCapable
-sun/awt/HeadlessToolkit
-sun/awt/InputMethodSupport
-sun/awt/KeyboardFocusManagerPeerImpl
-sun/awt/KeyboardFocusManagerPeerProvider
-sun/awt/LightweightFrame
-sun/awt/ModalExclude
-sun/awt/ModalityEvent
-sun/awt/ModalityListener
-sun/awt/MostRecentKeyValue
-sun/awt/Mutex
-sun/awt/NullComponentPeer
-sun/awt/OSInfo
-sun/awt/OSInfo$1
-sun/awt/OSInfo$OSType
-sun/awt/OSInfo$WindowsVersion
-sun/awt/PaintEventDispatcher
-sun/awt/PeerEvent
-sun/awt/PostEventQueue
-sun/awt/RepaintArea
-sun/awt/RequestFocusController
-sun/awt/SunDisplayChanger
-sun/awt/SunGraphicsCallback
-sun/awt/SunHints
-sun/awt/SunHints$Key
-sun/awt/SunHints$LCDContrastKey
-sun/awt/SunHints$Value
-sun/awt/SunToolkit
-sun/awt/SunToolkit$1
-sun/awt/SunToolkit$ModalityListenerList
-sun/awt/TimedWindowEvent
-sun/awt/WindowClosingListener
-sun/awt/WindowClosingSupport
-sun/awt/datatransfer/DataTransferer
-sun/awt/datatransfer/DataTransferer$1
-sun/awt/datatransfer/DataTransferer$CharsetComparator
-sun/awt/datatransfer/DataTransferer$IndexOrderComparator
-sun/awt/datatransfer/DataTransferer$IndexedComparator
-sun/awt/datatransfer/DataTransferer$RMI
-sun/awt/datatransfer/DataTransferer$StandardEncodingsHolder
-sun/awt/datatransfer/SunClipboard
-sun/awt/datatransfer/ToolkitThreadBlockedHandler
-sun/awt/datatransfer/TransferableProxy
-sun/awt/dnd/SunDragSourceContextPeer
-sun/awt/dnd/SunDropTargetEvent
-sun/awt/event/IgnorePaintEvent
-sun/awt/im/CompositionAreaHandler
-sun/awt/im/ExecutableInputMethodManager
-sun/awt/im/ExecutableInputMethodManager$3
-sun/awt/im/InputContext
-sun/awt/im/InputMethodAdapter
-sun/awt/im/InputMethodContext
-sun/awt/im/InputMethodLocator
-sun/awt/im/InputMethodManager
-sun/awt/im/InputMethodWindow
-sun/awt/image/BufImgSurfaceData
-sun/awt/image/BufImgSurfaceData$ICMColorData
-sun/awt/image/BufImgSurfaceManager
-sun/awt/image/BufferedImageGraphicsConfig
-sun/awt/image/ByteComponentRaster
-sun/awt/image/ByteInterleavedRaster
-sun/awt/image/BytePackedRaster
-sun/awt/image/FetcherInfo
-sun/awt/image/GifFrame
-sun/awt/image/GifImageDecoder
-sun/awt/image/ImageConsumerQueue
-sun/awt/image/ImageDecoder
-sun/awt/image/ImageFetchable
-sun/awt/image/ImageFetcher
-sun/awt/image/ImageFetcher$1
-sun/awt/image/ImageRepresentation
-sun/awt/image/ImageWatched
-sun/awt/image/ImageWatched$Link
-sun/awt/image/ImageWatched$WeakLink
-sun/awt/image/InputStreamImageSource
-sun/awt/image/IntegerComponentRaster
-sun/awt/image/IntegerInterleavedRaster
-sun/awt/image/NativeLibLoader
-sun/awt/image/NativeLibLoader$1
-sun/awt/image/OffScreenImage
-sun/awt/image/OffScreenImageSource
-sun/awt/image/PNGFilterInputStream
-sun/awt/image/PNGImageDecoder
-sun/awt/image/PixelConverter
-sun/awt/image/PixelConverter$Argb
-sun/awt/image/PixelConverter$ArgbBm
-sun/awt/image/PixelConverter$ArgbPre
-sun/awt/image/PixelConverter$Bgrx
-sun/awt/image/PixelConverter$ByteGray
-sun/awt/image/PixelConverter$Rgba
-sun/awt/image/PixelConverter$RgbaPre
-sun/awt/image/PixelConverter$Rgbx
-sun/awt/image/PixelConverter$Ushort4444Argb
-sun/awt/image/PixelConverter$Ushort555Rgb
-sun/awt/image/PixelConverter$Ushort555Rgbx
-sun/awt/image/PixelConverter$Ushort565Rgb
-sun/awt/image/PixelConverter$UshortGray
-sun/awt/image/PixelConverter$Xbgr
-sun/awt/image/PixelConverter$Xrgb
-sun/awt/image/SunVolatileImage
-sun/awt/image/SunWritableRaster
-sun/awt/image/SunWritableRaster$DataStealer
-sun/awt/image/SurfaceManager
-sun/awt/image/SurfaceManager$FlushableCacheData
-sun/awt/image/SurfaceManager$ImageAccessor
-sun/awt/image/SurfaceManager$ProxiedGraphicsConfig
-sun/awt/image/ToolkitImage
-sun/awt/image/URLImageSource
-sun/awt/image/VolatileSurfaceManager
-sun/awt/resources/awt
-sun/awt/resources/awtosx
-sun/awt/util/IdentityArrayList
-sun/awt/util/IdentityLinkedList
-sun/awt/util/IdentityLinkedList$Entry
-sun/awt/util/IdentityLinkedList$ListItr
-sun/dc/DuctusRenderingEngine
-sun/font/AttributeValues
-sun/font/CCharToGlyphMapper
-sun/font/CCharToGlyphMapper$Cache
-sun/font/CFont
-sun/font/CFontConfiguration
-sun/font/CFontManager
-sun/font/CFontManager$4
-sun/font/CStrike
-sun/font/CStrike$GlyphAdvanceCache
-sun/font/CStrike$GlyphInfoCache
-sun/font/CStrikeDisposer
-sun/font/CharToGlyphMapper
-sun/font/CompositeFont
-sun/font/CompositeFontDescriptor
-sun/font/CoreMetrics
-sun/font/EAttribute
-sun/font/FileFont
-sun/font/Font2D
-sun/font/Font2DHandle
-sun/font/FontAccess
-sun/font/FontDesignMetrics
-sun/font/FontDesignMetrics$KeyReference
-sun/font/FontDesignMetrics$MetricsKey
-sun/font/FontFamily
-sun/font/FontLineMetrics
-sun/font/FontManager
-sun/font/FontManagerFactory
-sun/font/FontManagerFactory$1
-sun/font/FontManagerForSGE
-sun/font/FontManagerNativeLibrary
-sun/font/FontManagerNativeLibrary$1
-sun/font/FontStrike
-sun/font/FontStrikeDesc
-sun/font/FontStrikeDisposer
-sun/font/FontUtilities
-sun/font/FontUtilities$1
-sun/font/GlyphList
-sun/font/PhysicalFont
-sun/font/PhysicalStrike
-sun/font/StandardGlyphVector
-sun/font/StandardGlyphVector$GlyphStrike
-sun/font/StrikeCache
-sun/font/StrikeCache$1
-sun/font/StrikeCache$DisposableStrike
-sun/font/StrikeCache$SoftDisposerRef
-sun/font/StrikeMetrics
-sun/font/SunFontManager
-sun/font/SunFontManager$1
-sun/font/SunFontManager$11
-sun/font/SunFontManager$2
-sun/font/SunFontManager$3
-sun/font/SunFontManager$FontRegistrationInfo
-sun/font/SunFontManager$T1Filter
-sun/font/SunFontManager$TTFilter
-sun/font/TrueTypeFont
-sun/font/TrueTypeFont$1
-sun/font/TrueTypeFont$DirectoryEntry
-sun/font/TrueTypeFont$TTDisposerRecord
-sun/font/Type1Font
-sun/java2d/DefaultDisposerRecord
-sun/java2d/DestSurfaceProvider
-sun/java2d/Disposer
-sun/java2d/Disposer$1
-sun/java2d/Disposer$2
-sun/java2d/Disposer$PollDisposable
-sun/java2d/DisposerRecord
-sun/java2d/DisposerTarget
-sun/java2d/FontSupport
-sun/java2d/InvalidPipeException
-sun/java2d/MacosxSurfaceManagerFactory
-sun/java2d/NullSurfaceData
-sun/java2d/StateTrackable
-sun/java2d/StateTrackable$State
-sun/java2d/StateTrackableDelegate
-sun/java2d/StateTrackableDelegate$1
-sun/java2d/StateTrackableDelegate$2
-sun/java2d/StateTracker
-sun/java2d/StateTracker$1
-sun/java2d/StateTracker$2
-sun/java2d/SunGraphics2D
-sun/java2d/SunGraphicsEnvironment
-sun/java2d/SunGraphicsEnvironment$1
-sun/java2d/Surface
-sun/java2d/SurfaceData
-sun/java2d/SurfaceData$PixelToPgramLoopConverter
-sun/java2d/SurfaceData$PixelToShapeLoopConverter
-sun/java2d/SurfaceDataProxy
-sun/java2d/SurfaceDataProxy$1
-sun/java2d/SurfaceManagerFactory
-sun/java2d/cmm/CMSManager
-sun/java2d/cmm/ProfileActivator
-sun/java2d/cmm/ProfileDeferralInfo
-sun/java2d/cmm/ProfileDeferralMgr
-sun/java2d/loops/Blit
-sun/java2d/loops/BlitBg
-sun/java2d/loops/CompositeType
-sun/java2d/loops/CustomComponent
-sun/java2d/loops/DrawGlyphList
-sun/java2d/loops/DrawGlyphListAA
-sun/java2d/loops/DrawGlyphListLCD
-sun/java2d/loops/DrawLine
-sun/java2d/loops/DrawParallelogram
-sun/java2d/loops/DrawPath
-sun/java2d/loops/DrawPolygons
-sun/java2d/loops/DrawRect
-sun/java2d/loops/FillParallelogram
-sun/java2d/loops/FillPath
-sun/java2d/loops/FillRect
-sun/java2d/loops/FillSpans
-sun/java2d/loops/FontInfo
-sun/java2d/loops/GeneralRenderer
-sun/java2d/loops/GraphicsPrimitive
-sun/java2d/loops/GraphicsPrimitiveMgr
-sun/java2d/loops/GraphicsPrimitiveMgr$1
-sun/java2d/loops/GraphicsPrimitiveMgr$2
-sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec
-sun/java2d/loops/GraphicsPrimitiveProxy
-sun/java2d/loops/MaskBlit
-sun/java2d/loops/MaskFill
-sun/java2d/loops/ProcessPath$DrawHandler
-sun/java2d/loops/RenderCache
-sun/java2d/loops/RenderCache$Entry
-sun/java2d/loops/RenderLoops
-sun/java2d/loops/ScaledBlit
-sun/java2d/loops/SurfaceType
-sun/java2d/loops/TransformBlit
-sun/java2d/loops/TransformHelper
-sun/java2d/loops/XORComposite
-sun/java2d/opengl/CGLGraphicsConfig
-sun/java2d/opengl/CGLGraphicsConfig$1
-sun/java2d/opengl/CGLGraphicsConfig$CGLGCDisposerRecord
-sun/java2d/opengl/CGLGraphicsConfig$CGLImageCaps
-sun/java2d/opengl/CGLLayer
-sun/java2d/opengl/CGLSurfaceData
-sun/java2d/opengl/CGLSurfaceData$CGLLayerSurfaceData
-sun/java2d/opengl/CGLSurfaceData$CGLOffScreenSurfaceData
-sun/java2d/opengl/CGLVolatileSurfaceManager
-sun/java2d/opengl/OGLAnyCompositeBlit
-sun/java2d/opengl/OGLBlitLoops
-sun/java2d/opengl/OGLContext
-sun/java2d/opengl/OGLContext$OGLContextCaps
-sun/java2d/opengl/OGLDrawImage
-sun/java2d/opengl/OGLGeneralBlit
-sun/java2d/opengl/OGLGraphicsConfig
-sun/java2d/opengl/OGLMaskBlit
-sun/java2d/opengl/OGLMaskFill
-sun/java2d/opengl/OGLRTTSurfaceToSurfaceBlit
-sun/java2d/opengl/OGLRTTSurfaceToSurfaceScale
-sun/java2d/opengl/OGLRTTSurfaceToSurfaceTransform
-sun/java2d/opengl/OGLRenderQueue
-sun/java2d/opengl/OGLRenderQueue$1
-sun/java2d/opengl/OGLRenderQueue$QueueFlusher
-sun/java2d/opengl/OGLRenderer
-sun/java2d/opengl/OGLSurfaceData
-sun/java2d/opengl/OGLSurfaceData$1
-sun/java2d/opengl/OGLSurfaceDataProxy
-sun/java2d/opengl/OGLSurfaceToSurfaceBlit
-sun/java2d/opengl/OGLSurfaceToSurfaceScale
-sun/java2d/opengl/OGLSurfaceToSurfaceTransform
-sun/java2d/opengl/OGLSurfaceToSwBlit
-sun/java2d/opengl/OGLSwToSurfaceBlit
-sun/java2d/opengl/OGLSwToSurfaceScale
-sun/java2d/opengl/OGLSwToSurfaceTransform
-sun/java2d/opengl/OGLSwToTextureBlit
-sun/java2d/opengl/OGLTextRenderer
-sun/java2d/opengl/OGLTextureToSurfaceBlit
-sun/java2d/opengl/OGLTextureToSurfaceScale
-sun/java2d/opengl/OGLTextureToSurfaceTransform
-sun/java2d/pipe/AAShapePipe
-sun/java2d/pipe/AATextRenderer
-sun/java2d/pipe/AlphaColorPipe
-sun/java2d/pipe/AlphaPaintPipe
-sun/java2d/pipe/BufferedContext
-sun/java2d/pipe/BufferedMaskBlit
-sun/java2d/pipe/BufferedMaskFill
-sun/java2d/pipe/BufferedPaints
-sun/java2d/pipe/BufferedRenderPipe
-sun/java2d/pipe/BufferedRenderPipe$AAParallelogramPipe
-sun/java2d/pipe/BufferedRenderPipe$BufferedDrawHandler
-sun/java2d/pipe/BufferedTextPipe
-sun/java2d/pipe/CompositePipe
-sun/java2d/pipe/DrawImage
-sun/java2d/pipe/DrawImagePipe
-sun/java2d/pipe/GeneralCompositePipe
-sun/java2d/pipe/GlyphListLoopPipe
-sun/java2d/pipe/GlyphListPipe
-sun/java2d/pipe/LCDTextRenderer
-sun/java2d/pipe/LoopBasedPipe
-sun/java2d/pipe/LoopPipe
-sun/java2d/pipe/NullPipe
-sun/java2d/pipe/OutlineTextRenderer
-sun/java2d/pipe/ParallelogramPipe
-sun/java2d/pipe/PixelDrawPipe
-sun/java2d/pipe/PixelFillPipe
-sun/java2d/pipe/PixelToParallelogramConverter
-sun/java2d/pipe/PixelToShapeConverter
-sun/java2d/pipe/Region
-sun/java2d/pipe/Region$ImmutableRegion
-sun/java2d/pipe/RegionIterator
-sun/java2d/pipe/RenderBuffer
-sun/java2d/pipe/RenderQueue
-sun/java2d/pipe/RenderingEngine
-sun/java2d/pipe/RenderingEngine$1
-sun/java2d/pipe/ShapeDrawPipe
-sun/java2d/pipe/SolidTextRenderer
-sun/java2d/pipe/SpanClipRenderer
-sun/java2d/pipe/SpanShapeRenderer
-sun/java2d/pipe/SpanShapeRenderer$Composite
-sun/java2d/pipe/TextPipe
-sun/java2d/pipe/TextRenderer
-sun/java2d/pipe/ValidatePipe
-sun/java2d/pipe/hw/AccelGraphicsConfig
-sun/java2d/pipe/hw/AccelSurface
-sun/java2d/pipe/hw/BufferedContextProvider
-sun/java2d/pipe/hw/ContextCapabilities
-sun/launcher/LauncherHelper
-sun/launcher/LauncherHelper$FXHelper
-sun/lwawt/LWCanvasPeer
-sun/lwawt/LWComponentPeer
-sun/lwawt/LWComponentPeer$1
-sun/lwawt/LWComponentPeer$2
-sun/lwawt/LWComponentPeer$3
-sun/lwawt/LWComponentPeer$DelegateContainer
-sun/lwawt/LWContainerPeer
-sun/lwawt/LWCursorManager
-sun/lwawt/LWCursorManager$1
-sun/lwawt/LWGraphicsConfig
-sun/lwawt/LWKeyboardFocusManagerPeer
-sun/lwawt/LWLabelPeer
-sun/lwawt/LWRepaintArea
-sun/lwawt/LWToolkit
-sun/lwawt/LWWindowPeer
-sun/lwawt/LWWindowPeer$PeerType
-sun/lwawt/PlatformComponent
-sun/lwawt/PlatformEventNotifier
-sun/lwawt/PlatformWindow
-sun/lwawt/macosx/CClipboard
-sun/lwawt/macosx/CCursorManager
-sun/lwawt/macosx/CCustomCursor
-sun/lwawt/macosx/CDataTransferer
-sun/lwawt/macosx/CDropTarget
-sun/lwawt/macosx/CFRetainedResource
-sun/lwawt/macosx/CImage
-sun/lwawt/macosx/CImage$Creator
-sun/lwawt/macosx/CInputMethod
-sun/lwawt/macosx/CInputMethodDescriptor
-sun/lwawt/macosx/CPlatformComponent
-sun/lwawt/macosx/CPlatformResponder
-sun/lwawt/macosx/CPlatformView
-sun/lwawt/macosx/CPlatformWindow
-sun/lwawt/macosx/CPlatformWindow$1
-sun/lwawt/macosx/CPlatformWindow$10
-sun/lwawt/macosx/CPlatformWindow$11
-sun/lwawt/macosx/CPlatformWindow$12
-sun/lwawt/macosx/CPlatformWindow$14
-sun/lwawt/macosx/CPlatformWindow$2
-sun/lwawt/macosx/CPlatformWindow$3
-sun/lwawt/macosx/CPlatformWindow$4
-sun/lwawt/macosx/CPlatformWindow$5
-sun/lwawt/macosx/CPlatformWindow$6
-sun/lwawt/macosx/CPlatformWindow$7
-sun/lwawt/macosx/CPlatformWindow$8
-sun/lwawt/macosx/CPlatformWindow$9
-sun/lwawt/macosx/CPrinterDialog
-sun/lwawt/macosx/CThreading
-sun/lwawt/macosx/CToolkitThreadBlockedHandler
-sun/lwawt/macosx/CWrapper$NSWindow
-sun/lwawt/macosx/LWCToolkit
-sun/lwawt/macosx/LWCToolkit$1
-sun/lwawt/macosx/LWCToolkit$2
-sun/lwawt/macosx/LWCToolkit$5
-sun/lwawt/macosx/LWCToolkit$AppleSpecificColor
-sun/lwawt/macosx/NamedCursor
-sun/lwawt/macosx/event/NSEvent
-sun/misc/ASCIICaseInsensitiveComparator
-sun/misc/Cleaner
-sun/misc/CompoundEnumeration
-sun/misc/ExtensionDependency
-sun/misc/FileURLMapper
-sun/misc/FloatingDecimal
-sun/misc/FloatingDecimal$1
-sun/misc/FloatingDecimal$ASCIIToBinaryConverter
-sun/misc/FloatingDecimal$BinaryToASCIIBuffer
-sun/misc/FloatingDecimal$BinaryToASCIIConverter
-sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
-sun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer
-sun/misc/IOUtils
-sun/misc/JarIndex
-sun/misc/JavaAWTAccess
-sun/misc/JavaIOFileDescriptorAccess
-sun/misc/JavaLangAccess
-sun/misc/JavaNetAccess
-sun/misc/JavaNioAccess
-sun/misc/JavaSecurityAccess
-sun/misc/JavaSecurityProtectionDomainAccess
-sun/misc/JavaUtilJarAccess
-sun/misc/JavaUtilZipFileAccess
-sun/misc/Launcher
-sun/misc/Launcher$AppClassLoader
-sun/misc/Launcher$AppClassLoader$1
-sun/misc/Launcher$BootClassPathHolder
-sun/misc/Launcher$BootClassPathHolder$1
-sun/misc/Launcher$ExtClassLoader
-sun/misc/Launcher$ExtClassLoader$1
-sun/misc/Launcher$Factory
-sun/misc/MetaIndex
-sun/misc/NativeSignalHandler
-sun/misc/OSEnvironment
-sun/misc/Perf
-sun/misc/Perf$GetPerfAction
-sun/misc/PerfCounter
-sun/misc/PerfCounter$CoreCounters
-sun/misc/PerformanceLogger
-sun/misc/PerformanceLogger$TimeData
-sun/misc/PostVMInitHook
-sun/misc/Resource
-sun/misc/SharedSecrets
-sun/misc/Signal
-sun/misc/SignalHandler
-sun/misc/SoftCache
-sun/misc/SoftCache$ValueCell
-sun/misc/URLClassPath
-sun/misc/URLClassPath$1
-sun/misc/URLClassPath$2
-sun/misc/URLClassPath$3
-sun/misc/URLClassPath$FileLoader
-sun/misc/URLClassPath$JarLoader
-sun/misc/URLClassPath$JarLoader$1
-sun/misc/URLClassPath$JarLoader$2
-sun/misc/URLClassPath$Loader
-sun/misc/Unsafe
-sun/misc/VM
-sun/misc/Version
-sun/net/DefaultProgressMeteringPolicy
-sun/net/NetHooks
-sun/net/NetHooks$Provider
-sun/net/NetProperties
-sun/net/NetProperties$1
-sun/net/ProgressMeteringPolicy
-sun/net/ProgressMonitor
-sun/net/sdp/SdpProvider
-sun/net/spi/DefaultProxySelector
-sun/net/spi/DefaultProxySelector$1
-sun/net/spi/DefaultProxySelector$3
-sun/net/spi/DefaultProxySelector$NonProxyInfo
-sun/net/spi/nameservice/NameService
-sun/net/util/IPAddressUtil
-sun/net/util/URLUtil
-sun/net/www/MessageHeader
-sun/net/www/ParseUtil
-sun/net/www/URLConnection
-sun/net/www/protocol/file/FileURLConnection
-sun/net/www/protocol/file/Handler
-sun/net/www/protocol/jar/Handler
-sun/net/www/protocol/jar/JarFileFactory
-sun/net/www/protocol/jar/JarURLConnection
-sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream
-sun/net/www/protocol/jar/URLJarFile
-sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController
-sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry
-sun/nio/ByteBuffered
-sun/nio/ch/DirectBuffer
-sun/nio/ch/FileChannelImpl
-sun/nio/ch/FileDispatcher
-sun/nio/ch/FileDispatcherImpl
-sun/nio/ch/IOStatus
-sun/nio/ch/IOUtil
-sun/nio/ch/IOUtil$1
-sun/nio/ch/Interruptible
-sun/nio/ch/NativeDispatcher
-sun/nio/ch/NativeThread
-sun/nio/ch/NativeThreadSet
-sun/nio/ch/Util
-sun/nio/ch/Util$1
-sun/nio/ch/Util$BufferCache
-sun/nio/cs/ArrayDecoder
-sun/nio/cs/ArrayEncoder
-sun/nio/cs/FastCharsetProvider
-sun/nio/cs/HistoricallyNamedCharset
-sun/nio/cs/ISO_8859_1
-sun/nio/cs/ISO_8859_1$Decoder
-sun/nio/cs/StandardCharsets
-sun/nio/cs/StandardCharsets$Aliases
-sun/nio/cs/StandardCharsets$Cache
-sun/nio/cs/StandardCharsets$Classes
-sun/nio/cs/StreamDecoder
-sun/nio/cs/StreamEncoder
-sun/nio/cs/US_ASCII
-sun/nio/cs/UTF_16
-sun/nio/cs/UTF_16$Decoder
-sun/nio/cs/UTF_16BE
-sun/nio/cs/UTF_16LE
-sun/nio/cs/UTF_8
-sun/nio/cs/UTF_8$Decoder
-sun/nio/cs/UTF_8$Encoder
-sun/nio/cs/Unicode
-sun/nio/cs/UnicodeDecoder
-sun/print/PrinterGraphicsConfig
-sun/reflect/AccessorGenerator
-sun/reflect/BootstrapConstructorAccessorImpl
-sun/reflect/ByteVector
-sun/reflect/ByteVectorFactory
-sun/reflect/ByteVectorImpl
-sun/reflect/CallerSensitive
-sun/reflect/ClassDefiner
-sun/reflect/ClassDefiner$1
-sun/reflect/ClassFileAssembler
-sun/reflect/ClassFileConstants
-sun/reflect/ConstantPool
-sun/reflect/ConstructorAccessor
-sun/reflect/ConstructorAccessorImpl
-sun/reflect/DelegatingClassLoader
-sun/reflect/DelegatingConstructorAccessorImpl
-sun/reflect/DelegatingMethodAccessorImpl
-sun/reflect/FieldAccessor
-sun/reflect/FieldAccessorImpl
-sun/reflect/Label
-sun/reflect/Label$PatchInfo
-sun/reflect/LangReflectAccess
-sun/reflect/MagicAccessorImpl
-sun/reflect/MethodAccessor
-sun/reflect/MethodAccessorGenerator
-sun/reflect/MethodAccessorGenerator$1
-sun/reflect/MethodAccessorImpl
-sun/reflect/NativeConstructorAccessorImpl
-sun/reflect/NativeMethodAccessorImpl
-sun/reflect/Reflection
-sun/reflect/ReflectionFactory
-sun/reflect/ReflectionFactory$1
-sun/reflect/ReflectionFactory$GetReflectionFactoryAction
-sun/reflect/SerializationConstructorAccessorImpl
-sun/reflect/UTF8
-sun/reflect/UnsafeBooleanFieldAccessorImpl
-sun/reflect/UnsafeFieldAccessorFactory
-sun/reflect/UnsafeFieldAccessorImpl
-sun/reflect/UnsafeObjectFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl
-sun/reflect/UnsafeStaticFieldAccessorImpl
-sun/reflect/annotation/AnnotationType
-sun/reflect/generics/repository/AbstractRepository
-sun/reflect/generics/repository/ClassRepository
-sun/reflect/generics/repository/GenericDeclRepository
-sun/reflect/misc/MethodUtil
-sun/reflect/misc/MethodUtil$1
-sun/reflect/misc/ReflectUtil
-sun/security/action/GetBooleanAction
-sun/security/action/GetPropertyAction
-sun/security/util/Debug
-sun/security/util/ManifestEntryVerifier
-sun/swing/DefaultLookup
-sun/swing/JLightweightFrame
-sun/swing/MenuItemLayoutHelper
-sun/swing/StringUIClientPropertyKey
-sun/swing/SwingAccessor
-sun/swing/SwingAccessor$JTextComponentAccessor
-sun/swing/SwingLazyValue
-sun/swing/SwingLazyValue$1
-sun/swing/SwingUtilities2
-sun/swing/SwingUtilities2$2
-sun/swing/SwingUtilities2$AATextInfo
-sun/swing/SwingUtilities2$LSBCacheEntry
-sun/swing/UIAction
-sun/swing/UIClientPropertyKey
-sun/util/CoreResourceBundleControl
-sun/util/PreHashedMap
-sun/util/ResourceBundleEnumeration
-sun/util/calendar/AbstractCalendar
-sun/util/calendar/BaseCalendar
-sun/util/calendar/BaseCalendar$Date
-sun/util/calendar/CalendarDate
-sun/util/calendar/CalendarSystem
-sun/util/calendar/CalendarUtils
-sun/util/calendar/Gregorian
-sun/util/calendar/Gregorian$Date
-sun/util/calendar/ZoneInfo
-sun/util/calendar/ZoneInfoFile
-sun/util/calendar/ZoneInfoFile$1
-sun/util/calendar/ZoneInfoFile$Checksum
-sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule
-sun/util/locale/BaseLocale
-sun/util/locale/BaseLocale$Cache
-sun/util/locale/BaseLocale$Key
-sun/util/locale/LocaleObjectCache
-sun/util/locale/LocaleObjectCache$CacheEntry
-sun/util/locale/LocaleUtils
-sun/util/locale/provider/AuxLocaleProviderAdapter
-sun/util/locale/provider/AuxLocaleProviderAdapter$NullProvider
-sun/util/locale/provider/JRELocaleProviderAdapter
-sun/util/locale/provider/JRELocaleProviderAdapter$1
-sun/util/locale/provider/LocaleDataMetaInfo
-sun/util/locale/provider/LocaleProviderAdapter
-sun/util/locale/provider/LocaleProviderAdapter$1
-sun/util/locale/provider/LocaleProviderAdapter$Type
-sun/util/locale/provider/LocaleResources
-sun/util/locale/provider/LocaleResources$ResourceReference
-sun/util/locale/provider/LocaleServiceProviderPool
-sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter
-sun/util/locale/provider/ResourceBundleBasedAdapter
-sun/util/locale/provider/SPILocaleProviderAdapter
-sun/util/locale/provider/SPILocaleProviderAdapter$1
-sun/util/locale/provider/TimeZoneNameProviderImpl
-sun/util/locale/provider/TimeZoneNameUtility$TimeZoneNameGetter
-sun/util/logging/LoggingProxy
-sun/util/logging/LoggingSupport
-sun/util/logging/LoggingSupport$1
-sun/util/logging/LoggingSupport$2
-sun/util/logging/PlatformLogger
-sun/util/logging/PlatformLogger$1
-sun/util/logging/PlatformLogger$DefaultLoggerProxy
-sun/util/logging/PlatformLogger$JavaLoggerProxy
-sun/util/logging/PlatformLogger$Level
-sun/util/logging/PlatformLogger$LoggerProxy
-sun/util/logging/resources/logging
-sun/util/resources/LocaleData
-sun/util/resources/LocaleData$1
-sun/util/resources/LocaleData$LocaleDataResourceBundleControl
-sun/util/resources/OpenListResourceBundle
-sun/util/resources/TimeZoneNames
-sun/util/resources/TimeZoneNamesBundle
-sun/util/resources/en/TimeZoneNames_en
-# 32aa76348b93579f
--- a/jdk/make/data/classlist/classlist.solaris	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2644 +0,0 @@
-com/sun/java/swing/SwingUtilities3
-com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI
-com/sun/swing/internal/plaf/basic/resources/basic
-com/sun/swing/internal/plaf/metal/resources/metal
-java/applet/Applet
-java/awt/AWTEvent
-java/awt/AWTEvent$1
-java/awt/AWTEventMulticaster
-java/awt/AWTKeyStroke
-java/awt/AWTKeyStroke$1
-java/awt/ActiveEvent
-java/awt/Adjustable
-java/awt/AlphaComposite
-java/awt/BasicStroke
-java/awt/BorderLayout
-java/awt/BufferCapabilities
-java/awt/Canvas
-java/awt/CardLayout
-java/awt/CardLayout$Card
-java/awt/Color
-java/awt/Component
-java/awt/Component$1
-java/awt/Component$3
-java/awt/Component$AWTTreeLock
-java/awt/Component$AccessibleAWTComponent
-java/awt/Component$BaselineResizeBehavior
-java/awt/Component$BltBufferStrategy
-java/awt/Component$BltSubRegionBufferStrategy
-java/awt/Component$DummyRequestFocusController
-java/awt/Component$FlipBufferStrategy
-java/awt/ComponentOrientation
-java/awt/Composite
-java/awt/Conditional
-java/awt/Container
-java/awt/Container$1
-java/awt/Container$AccessibleAWTContainer
-java/awt/ContainerOrderFocusTraversalPolicy
-java/awt/Cursor
-java/awt/Cursor$1
-java/awt/DefaultFocusTraversalPolicy
-java/awt/DefaultKeyboardFocusManager
-java/awt/DefaultKeyboardFocusManager$1
-java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent
-java/awt/DefaultKeyboardFocusManager$TypeAheadMarker
-java/awt/Dialog
-java/awt/Dialog$ModalExclusionType
-java/awt/Dialog$ModalityType
-java/awt/Dimension
-java/awt/Event
-java/awt/EventDispatchThread
-java/awt/EventDispatchThread$1
-java/awt/EventDispatchThread$HierarchyEventFilter
-java/awt/EventFilter
-java/awt/EventFilter$FilterAction
-java/awt/EventQueue
-java/awt/EventQueue$1
-java/awt/EventQueue$1AWTInvocationLock
-java/awt/EventQueue$2
-java/awt/EventQueue$3
-java/awt/EventQueue$4
-java/awt/EventQueue$5
-java/awt/FlowLayout
-java/awt/FocusTraversalPolicy
-java/awt/Font
-java/awt/Font$FontAccessImpl
-java/awt/FontFormatException
-java/awt/FontMetrics
-java/awt/Frame
-java/awt/Frame$1
-java/awt/Graphics
-java/awt/Graphics2D
-java/awt/GraphicsCallback
-java/awt/GraphicsCallback$PaintCallback
-java/awt/GraphicsConfiguration
-java/awt/GraphicsDevice
-java/awt/GraphicsEnvironment
-java/awt/GraphicsEnvironment$1
-java/awt/GridLayout
-java/awt/Image
-java/awt/Image$1
-java/awt/ImageCapabilities
-java/awt/ImageMediaEntry
-java/awt/Insets
-java/awt/ItemSelectable
-java/awt/KeyEventDispatcher
-java/awt/KeyEventPostProcessor
-java/awt/KeyboardFocusManager
-java/awt/KeyboardFocusManager$1
-java/awt/KeyboardFocusManager$3
-java/awt/KeyboardFocusManager$HeavyweightFocusRequest
-java/awt/KeyboardFocusManager$LightweightFocusRequest
-java/awt/Label
-java/awt/LayoutManager
-java/awt/LayoutManager2
-java/awt/LightweightDispatcher
-java/awt/LightweightDispatcher$2
-java/awt/MediaEntry
-java/awt/MediaTracker
-java/awt/MenuBar
-java/awt/MenuComponent
-java/awt/MenuContainer
-java/awt/ModalEventFilter
-java/awt/Paint
-java/awt/Panel
-java/awt/Point
-java/awt/PrintGraphics
-java/awt/Queue
-java/awt/Rectangle
-java/awt/RenderingHints
-java/awt/RenderingHints$Key
-java/awt/SentEvent
-java/awt/SequencedEvent
-java/awt/SequencedEvent$1
-java/awt/Shape
-java/awt/SplashScreen
-java/awt/Stroke
-java/awt/SystemColor
-java/awt/Toolkit
-java/awt/Toolkit$1
-java/awt/Toolkit$2
-java/awt/Toolkit$3
-java/awt/Toolkit$4
-java/awt/Toolkit$5
-java/awt/Toolkit$DesktopPropertyChangeSupport
-java/awt/Toolkit$DesktopPropertyChangeSupport$1
-java/awt/Toolkit$SelectiveAWTEventListener
-java/awt/Toolkit$ToolkitEventMulticaster
-java/awt/Transparency
-java/awt/TrayIcon
-java/awt/VKCollection
-java/awt/Window
-java/awt/Window$1
-java/awt/Window$1DisposeAction
-java/awt/Window$Type
-java/awt/Window$WindowDisposerRecord
-java/awt/color/ColorSpace
-java/awt/color/ICC_ColorSpace
-java/awt/color/ICC_Profile
-java/awt/color/ICC_Profile$1
-java/awt/color/ICC_ProfileRGB
-java/awt/datatransfer/Clipboard
-java/awt/datatransfer/ClipboardOwner
-java/awt/datatransfer/FlavorMap
-java/awt/datatransfer/FlavorTable
-java/awt/datatransfer/SystemFlavorMap
-java/awt/datatransfer/Transferable
-java/awt/dnd/DropTarget
-java/awt/dnd/DropTargetContext
-java/awt/dnd/DropTargetListener
-java/awt/dnd/peer/DragSourceContextPeer
-java/awt/dnd/peer/DropTargetContextPeer
-java/awt/dnd/peer/DropTargetPeer
-java/awt/event/AWTEventListener
-java/awt/event/AWTEventListenerProxy
-java/awt/event/ActionEvent
-java/awt/event/ActionListener
-java/awt/event/AdjustmentEvent
-java/awt/event/AdjustmentListener
-java/awt/event/ComponentAdapter
-java/awt/event/ComponentEvent
-java/awt/event/ComponentListener
-java/awt/event/ContainerEvent
-java/awt/event/ContainerListener
-java/awt/event/FocusAdapter
-java/awt/event/FocusEvent
-java/awt/event/FocusListener
-java/awt/event/HierarchyBoundsListener
-java/awt/event/HierarchyListener
-java/awt/event/InputEvent
-java/awt/event/InputEvent$1
-java/awt/event/InputMethodEvent
-java/awt/event/InputMethodListener
-java/awt/event/InvocationEvent
-java/awt/event/InvocationEvent$1
-java/awt/event/ItemEvent
-java/awt/event/ItemListener
-java/awt/event/KeyAdapter
-java/awt/event/KeyEvent
-java/awt/event/KeyEvent$1
-java/awt/event/KeyListener
-java/awt/event/MouseAdapter
-java/awt/event/MouseEvent
-java/awt/event/MouseListener
-java/awt/event/MouseMotionAdapter
-java/awt/event/MouseMotionListener
-java/awt/event/MouseWheelListener
-java/awt/event/NativeLibLoader
-java/awt/event/NativeLibLoader$1
-java/awt/event/PaintEvent
-java/awt/event/TextListener
-java/awt/event/WindowAdapter
-java/awt/event/WindowEvent
-java/awt/event/WindowFocusListener
-java/awt/event/WindowListener
-java/awt/event/WindowStateListener
-java/awt/font/FontRenderContext
-java/awt/font/GlyphVector
-java/awt/font/LineMetrics
-java/awt/font/TextAttribute
-java/awt/geom/AffineTransform
-java/awt/geom/Dimension2D
-java/awt/geom/GeneralPath
-java/awt/geom/Path2D
-java/awt/geom/Path2D$Float
-java/awt/geom/Path2D$Float$CopyIterator
-java/awt/geom/Path2D$Iterator
-java/awt/geom/PathIterator
-java/awt/geom/Point2D
-java/awt/geom/Point2D$Float
-java/awt/geom/RectIterator
-java/awt/geom/Rectangle2D
-java/awt/geom/Rectangle2D$Float
-java/awt/geom/RectangularShape
-java/awt/im/InputContext
-java/awt/im/InputMethodRequests
-java/awt/im/spi/InputMethod
-java/awt/im/spi/InputMethodContext
-java/awt/im/spi/InputMethodDescriptor
-java/awt/image/BufferStrategy
-java/awt/image/BufferedImage
-java/awt/image/BufferedImage$1
-java/awt/image/ColorModel
-java/awt/image/ColorModel$1
-java/awt/image/ComponentSampleModel
-java/awt/image/DataBuffer
-java/awt/image/DataBuffer$1
-java/awt/image/DataBufferByte
-java/awt/image/DataBufferInt
-java/awt/image/DirectColorModel
-java/awt/image/FilteredImageSource
-java/awt/image/ImageConsumer
-java/awt/image/ImageFilter
-java/awt/image/ImageObserver
-java/awt/image/ImageProducer
-java/awt/image/IndexColorModel
-java/awt/image/PackedColorModel
-java/awt/image/PixelInterleavedSampleModel
-java/awt/image/RGBImageFilter
-java/awt/image/Raster
-java/awt/image/RenderedImage
-java/awt/image/SampleModel
-java/awt/image/SinglePixelPackedSampleModel
-java/awt/image/VolatileImage
-java/awt/image/WritableRaster
-java/awt/image/WritableRenderedImage
-java/awt/peer/CanvasPeer
-java/awt/peer/ComponentPeer
-java/awt/peer/ContainerPeer
-java/awt/peer/FramePeer
-java/awt/peer/KeyboardFocusManagerPeer
-java/awt/peer/LabelPeer
-java/awt/peer/LightweightPeer
-java/awt/peer/PanelPeer
-java/awt/peer/SystemTrayPeer
-java/awt/peer/WindowPeer
-java/awt/print/PrinterGraphics
-java/beans/ChangeListenerMap
-java/beans/PropertyChangeEvent
-java/beans/PropertyChangeListener
-java/beans/PropertyChangeListenerProxy
-java/beans/PropertyChangeSupport
-java/beans/PropertyChangeSupport$PropertyChangeListenerMap
-java/beans/VetoableChangeListener
-java/io/Bits
-java/io/BufferedInputStream
-java/io/BufferedOutputStream
-java/io/BufferedReader
-java/io/BufferedWriter
-java/io/ByteArrayInputStream
-java/io/ByteArrayOutputStream
-java/io/Closeable
-java/io/DataInput
-java/io/DataInputStream
-java/io/DataOutput
-java/io/DataOutputStream
-java/io/DefaultFileSystem
-java/io/EOFException
-java/io/ExpiringCache
-java/io/ExpiringCache$1
-java/io/ExpiringCache$Entry
-java/io/Externalizable
-java/io/File
-java/io/File$PathStatus
-java/io/FileDescriptor
-java/io/FileDescriptor$1
-java/io/FileInputStream
-java/io/FileInputStream$1
-java/io/FileNotFoundException
-java/io/FileOutputStream
-java/io/FileOutputStream$1
-java/io/FilePermission
-java/io/FilePermission$1
-java/io/FilePermissionCollection
-java/io/FileReader
-java/io/FileSystem
-java/io/FileWriter
-java/io/FilenameFilter
-java/io/FilterInputStream
-java/io/FilterOutputStream
-java/io/FilterReader
-java/io/Flushable
-java/io/IOException
-java/io/InputStream
-java/io/InputStreamReader
-java/io/InterruptedIOException
-java/io/NotSerializableException
-java/io/ObjectInput
-java/io/ObjectInputStream
-java/io/ObjectInputStream$BlockDataInputStream
-java/io/ObjectInputStream$GetField
-java/io/ObjectInputStream$GetFieldImpl
-java/io/ObjectInputStream$HandleTable
-java/io/ObjectInputStream$HandleTable$HandleList
-java/io/ObjectInputStream$PeekInputStream
-java/io/ObjectInputStream$ValidationList
-java/io/ObjectOutput
-java/io/ObjectOutputStream
-java/io/ObjectOutputStream$BlockDataOutputStream
-java/io/ObjectOutputStream$HandleTable
-java/io/ObjectOutputStream$ReplaceTable
-java/io/ObjectStreamClass
-java/io/ObjectStreamClass$1
-java/io/ObjectStreamClass$2
-java/io/ObjectStreamClass$3
-java/io/ObjectStreamClass$4
-java/io/ObjectStreamClass$5
-java/io/ObjectStreamClass$Caches
-java/io/ObjectStreamClass$ClassDataSlot
-java/io/ObjectStreamClass$EntryFuture
-java/io/ObjectStreamClass$ExceptionInfo
-java/io/ObjectStreamClass$FieldReflector
-java/io/ObjectStreamClass$FieldReflectorKey
-java/io/ObjectStreamClass$MemberSignature
-java/io/ObjectStreamClass$WeakClassKey
-java/io/ObjectStreamConstants
-java/io/ObjectStreamException
-java/io/ObjectStreamField
-java/io/OutputStream
-java/io/OutputStreamWriter
-java/io/PrintStream
-java/io/PushbackInputStream
-java/io/RandomAccessFile
-java/io/RandomAccessFile$1
-java/io/Reader
-java/io/SerialCallbackContext
-java/io/Serializable
-java/io/StreamTokenizer
-java/io/StringReader
-java/io/StringWriter
-java/io/UnixFileSystem
-java/io/UnsupportedEncodingException
-java/io/Writer
-java/lang/AbstractStringBuilder
-java/lang/Appendable
-java/lang/ApplicationShutdownHooks
-java/lang/ApplicationShutdownHooks$1
-java/lang/ArithmeticException
-java/lang/ArrayIndexOutOfBoundsException
-java/lang/ArrayStoreException
-java/lang/AssertionError
-java/lang/AutoCloseable
-java/lang/Boolean
-java/lang/BootstrapMethodError
-java/lang/Byte
-java/lang/CharSequence
-java/lang/Character
-java/lang/Character$CharacterCache
-java/lang/CharacterData
-java/lang/CharacterData00
-java/lang/CharacterDataLatin1
-java/lang/Class
-java/lang/Class$1
-java/lang/Class$3
-java/lang/Class$4
-java/lang/Class$AnnotationData
-java/lang/Class$Atomic
-java/lang/Class$ReflectionData
-java/lang/ClassCastException
-java/lang/ClassFormatError
-java/lang/ClassLoader
-java/lang/ClassLoader$2
-java/lang/ClassLoader$3
-java/lang/ClassLoader$NativeLibrary
-java/lang/ClassLoader$ParallelLoaders
-java/lang/ClassLoaderHelper
-java/lang/ClassNotFoundException
-java/lang/ClassValue$ClassValueMap
-java/lang/CloneNotSupportedException
-java/lang/Cloneable
-java/lang/Comparable
-java/lang/Compiler
-java/lang/Compiler$1
-java/lang/Double
-java/lang/Enum
-java/lang/Error
-java/lang/Exception
-java/lang/ExceptionInInitializerError
-java/lang/Float
-java/lang/IllegalAccessError
-java/lang/IllegalAccessException
-java/lang/IllegalArgumentException
-java/lang/IllegalMonitorStateException
-java/lang/IllegalStateException
-java/lang/IncompatibleClassChangeError
-java/lang/IndexOutOfBoundsException
-java/lang/InheritableThreadLocal
-java/lang/InstantiationException
-java/lang/Integer
-java/lang/Integer$IntegerCache
-java/lang/InternalError
-java/lang/InterruptedException
-java/lang/Iterable
-java/lang/LinkageError
-java/lang/Long
-java/lang/Long$LongCache
-java/lang/Math
-java/lang/NoClassDefFoundError
-java/lang/NoSuchFieldException
-java/lang/NoSuchMethodError
-java/lang/NoSuchMethodException
-java/lang/NullPointerException
-java/lang/Number
-java/lang/NumberFormatException
-java/lang/Object
-java/lang/OutOfMemoryError
-java/lang/Package
-java/lang/Process
-java/lang/ProcessBuilder
-java/lang/ProcessEnvironment
-java/lang/ProcessEnvironment$ExternalData
-java/lang/ProcessEnvironment$StringEnvironment
-java/lang/ProcessEnvironment$Value
-java/lang/ProcessEnvironment$Variable
-java/lang/ProcessImpl
-java/lang/Readable
-java/lang/ReflectiveOperationException
-java/lang/Runnable
-java/lang/Runtime
-java/lang/RuntimeException
-java/lang/RuntimePermission
-java/lang/SecurityException
-java/lang/SecurityManager
-java/lang/Short
-java/lang/Short$ShortCache
-java/lang/Shutdown
-java/lang/Shutdown$Lock
-java/lang/StackOverflowError
-java/lang/StackTraceElement
-java/lang/StrictMath
-java/lang/String
-java/lang/String$CaseInsensitiveComparator
-java/lang/StringBuffer
-java/lang/StringBuilder
-java/lang/StringCoding
-java/lang/StringCoding$StringDecoder
-java/lang/StringCoding$StringEncoder
-java/lang/StringIndexOutOfBoundsException
-java/lang/System
-java/lang/System$2
-java/lang/SystemClassLoaderAction
-java/lang/Terminator
-java/lang/Terminator$1
-java/lang/Thread
-java/lang/Thread$State
-java/lang/Thread$UncaughtExceptionHandler
-java/lang/ThreadDeath
-java/lang/ThreadGroup
-java/lang/ThreadLocal
-java/lang/ThreadLocal$ThreadLocalMap
-java/lang/ThreadLocal$ThreadLocalMap$Entry
-java/lang/Throwable
-java/lang/Throwable$PrintStreamOrWriter
-java/lang/Throwable$WrappedPrintStream
-java/lang/UNIXProcess
-java/lang/UNIXProcess$1
-java/lang/UNIXProcess$2
-java/lang/UNIXProcess$3
-java/lang/UNIXProcess$3$1
-java/lang/UNIXProcess$DeferredCloseInputStream
-java/lang/UNIXProcess$LaunchMechanism
-java/lang/UnsatisfiedLinkError
-java/lang/UnsupportedOperationException
-java/lang/VirtualMachineError
-java/lang/Void
-java/lang/annotation/Annotation
-java/lang/invoke/CallSite
-java/lang/invoke/ConstantCallSite
-java/lang/invoke/DirectMethodHandle
-java/lang/invoke/Invokers
-java/lang/invoke/LambdaForm
-java/lang/invoke/LambdaForm$NamedFunction
-java/lang/invoke/MemberName
-java/lang/invoke/MemberName$Factory
-java/lang/invoke/MethodHandle
-java/lang/invoke/MethodHandleImpl
-java/lang/invoke/MethodHandleNatives
-java/lang/invoke/MethodHandleStatics
-java/lang/invoke/MethodHandleStatics$1
-java/lang/invoke/MethodType
-java/lang/invoke/MethodType$ConcurrentWeakInternSet
-java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry
-java/lang/invoke/MethodTypeForm
-java/lang/invoke/MutableCallSite
-java/lang/invoke/VolatileCallSite
-java/lang/ref/FinalReference
-java/lang/ref/Finalizer
-java/lang/ref/Finalizer$FinalizerThread
-java/lang/ref/PhantomReference
-java/lang/ref/Reference
-java/lang/ref/Reference$Lock
-java/lang/ref/Reference$ReferenceHandler
-java/lang/ref/ReferenceQueue
-java/lang/ref/ReferenceQueue$Lock
-java/lang/ref/ReferenceQueue$Null
-java/lang/ref/SoftReference
-java/lang/ref/WeakReference
-java/lang/reflect/AccessibleObject
-java/lang/reflect/AnnotatedElement
-java/lang/reflect/Array
-java/lang/reflect/Constructor
-java/lang/reflect/Executable
-java/lang/reflect/Field
-java/lang/reflect/GenericDeclaration
-java/lang/reflect/InvocationHandler
-java/lang/reflect/InvocationTargetException
-java/lang/reflect/Member
-java/lang/reflect/Method
-java/lang/reflect/Modifier
-java/lang/reflect/Parameter
-java/lang/reflect/Proxy
-java/lang/reflect/Proxy$KeyFactory
-java/lang/reflect/Proxy$ProxyClassFactory
-java/lang/reflect/ReflectAccess
-java/lang/reflect/ReflectPermission
-java/lang/reflect/Type
-java/lang/reflect/WeakCache
-java/math/BigInteger
-java/math/BigInteger$UnsafeHolder
-java/math/MutableBigInteger
-java/math/RoundingMode
-java/net/AbstractPlainDatagramSocketImpl
-java/net/AbstractPlainDatagramSocketImpl$1
-java/net/AbstractPlainSocketImpl
-java/net/AbstractPlainSocketImpl$1
-java/net/Authenticator
-java/net/BindException
-java/net/ConnectException
-java/net/DatagramPacket
-java/net/DatagramPacket$1
-java/net/DatagramSocket
-java/net/DatagramSocket$1
-java/net/DatagramSocketImpl
-java/net/DefaultDatagramSocketImplFactory
-java/net/DefaultInterface
-java/net/FileNameMap
-java/net/HttpURLConnection
-java/net/Inet4Address
-java/net/Inet4AddressImpl
-java/net/Inet6Address
-java/net/Inet6Address$Inet6AddressHolder
-java/net/Inet6AddressImpl
-java/net/InetAddress
-java/net/InetAddress$1
-java/net/InetAddress$2
-java/net/InetAddress$Cache
-java/net/InetAddress$Cache$Type
-java/net/InetAddress$CacheEntry
-java/net/InetAddress$InetAddressHolder
-java/net/InetAddressImpl
-java/net/InetAddressImplFactory
-java/net/InetSocketAddress
-java/net/InetSocketAddress$InetSocketAddressHolder
-java/net/InterfaceAddress
-java/net/JarURLConnection
-java/net/MalformedURLException
-java/net/MulticastSocket
-java/net/NetworkInterface
-java/net/NetworkInterface$1
-java/net/NetworkInterface$2
-java/net/NoRouteToHostException
-java/net/Parts
-java/net/PlainDatagramSocketImpl
-java/net/PlainSocketImpl
-java/net/Proxy
-java/net/Proxy$Type
-java/net/ProxySelector
-java/net/ServerSocket
-java/net/Socket
-java/net/SocketAddress
-java/net/SocketException
-java/net/SocketImpl
-java/net/SocketImplFactory
-java/net/SocketOptions
-java/net/SocksConsts
-java/net/SocksSocketImpl
-java/net/SocksSocketImpl$3
-java/net/URI
-java/net/URI$Parser
-java/net/URL
-java/net/URLClassLoader
-java/net/URLClassLoader$1
-java/net/URLClassLoader$2
-java/net/URLClassLoader$3
-java/net/URLClassLoader$3$1
-java/net/URLClassLoader$7
-java/net/URLConnection
-java/net/URLConnection$1
-java/net/URLStreamHandler
-java/net/URLStreamHandlerFactory
-java/net/UnknownHostException
-java/nio/Bits
-java/nio/Bits$1
-java/nio/Buffer
-java/nio/BufferUnderflowException
-java/nio/ByteBuffer
-java/nio/ByteBufferAsIntBufferB
-java/nio/ByteBufferAsShortBufferB
-java/nio/ByteOrder
-java/nio/CharBuffer
-java/nio/DirectByteBuffer
-java/nio/DirectByteBuffer$Deallocator
-java/nio/DirectByteBufferR
-java/nio/DirectLongBufferU
-java/nio/HeapByteBuffer
-java/nio/HeapCharBuffer
-java/nio/IntBuffer
-java/nio/LongBuffer
-java/nio/MappedByteBuffer
-java/nio/ShortBuffer
-java/nio/channels/ByteChannel
-java/nio/channels/Channel
-java/nio/channels/FileChannel
-java/nio/channels/FileChannel$MapMode
-java/nio/channels/GatheringByteChannel
-java/nio/channels/InterruptibleChannel
-java/nio/channels/NetworkChannel
-java/nio/channels/ReadableByteChannel
-java/nio/channels/ScatteringByteChannel
-java/nio/channels/SeekableByteChannel
-java/nio/channels/SelectableChannel
-java/nio/channels/SocketChannel
-java/nio/channels/WritableByteChannel
-java/nio/channels/spi/AbstractInterruptibleChannel
-java/nio/channels/spi/AbstractInterruptibleChannel$1
-java/nio/channels/spi/AbstractSelectableChannel
-java/nio/charset/Charset
-java/nio/charset/Charset$ExtendedProviderHolder
-java/nio/charset/Charset$ExtendedProviderHolder$1
-java/nio/charset/CharsetDecoder
-java/nio/charset/CharsetEncoder
-java/nio/charset/CoderResult
-java/nio/charset/CoderResult$1
-java/nio/charset/CoderResult$2
-java/nio/charset/CoderResult$Cache
-java/nio/charset/CodingErrorAction
-java/nio/charset/StandardCharsets
-java/nio/charset/spi/CharsetProvider
-java/nio/file/Path
-java/nio/file/Watchable
-java/nio/file/attribute/FileAttribute
-java/security/AccessControlContext
-java/security/AccessControlException
-java/security/AccessController
-java/security/AlgorithmParameters
-java/security/AlgorithmParametersSpi
-java/security/AllPermission
-java/security/AllPermissionCollection
-java/security/AuthProvider
-java/security/BasicPermission
-java/security/BasicPermissionCollection
-java/security/CodeSigner
-java/security/CodeSource
-java/security/DigestException
-java/security/GeneralSecurityException
-java/security/Guard
-java/security/InvalidAlgorithmParameterException
-java/security/InvalidKeyException
-java/security/InvalidParameterException
-java/security/Key
-java/security/KeyException
-java/security/KeyFactory
-java/security/KeyFactorySpi
-java/security/MessageDigest
-java/security/MessageDigest$Delegate
-java/security/MessageDigestSpi
-java/security/NoSuchAlgorithmException
-java/security/Permission
-java/security/PermissionCollection
-java/security/Permissions
-java/security/Principal
-java/security/PrivateKey
-java/security/PrivilegedAction
-java/security/PrivilegedActionException
-java/security/PrivilegedExceptionAction
-java/security/ProtectionDomain
-java/security/ProtectionDomain$1
-java/security/ProtectionDomain$3
-java/security/ProtectionDomain$Key
-java/security/Provider
-java/security/Provider$EngineDescription
-java/security/Provider$Service
-java/security/Provider$ServiceKey
-java/security/Provider$UString
-java/security/ProviderException
-java/security/PublicKey
-java/security/SecureClassLoader
-java/security/SecureRandomSpi
-java/security/Security
-java/security/Security$1
-java/security/SecurityPermission
-java/security/Signature
-java/security/Signature$Delegate
-java/security/SignatureException
-java/security/SignatureSpi
-java/security/UnresolvedPermission
-java/security/cert/CertPath
-java/security/cert/Certificate
-java/security/cert/CertificateFactory
-java/security/cert/CertificateFactorySpi
-java/security/cert/Extension
-java/security/cert/X509Certificate
-java/security/cert/X509Extension
-java/security/interfaces/DSAKey
-java/security/interfaces/DSAParams
-java/security/interfaces/DSAPrivateKey
-java/security/interfaces/DSAPublicKey
-java/security/interfaces/RSAKey
-java/security/interfaces/RSAPrivateCrtKey
-java/security/interfaces/RSAPrivateKey
-java/security/interfaces/RSAPublicKey
-java/security/spec/AlgorithmParameterSpec
-java/security/spec/DSAParameterSpec
-java/security/spec/DSAPublicKeySpec
-java/security/spec/EncodedKeySpec
-java/security/spec/InvalidKeySpecException
-java/security/spec/KeySpec
-java/security/spec/PKCS8EncodedKeySpec
-java/security/spec/RSAPrivateCrtKeySpec
-java/security/spec/RSAPrivateKeySpec
-java/security/spec/RSAPublicKeySpec
-java/security/spec/X509EncodedKeySpec
-java/text/AttributedCharacterIterator$Attribute
-java/text/CharacterIterator
-java/text/Collator
-java/text/DateFormat
-java/text/DateFormat$Field
-java/text/DateFormatSymbols
-java/text/DecimalFormat
-java/text/DecimalFormatSymbols
-java/text/DigitList
-java/text/DontCareFieldPosition
-java/text/DontCareFieldPosition$1
-java/text/EntryPair
-java/text/FieldPosition
-java/text/Format
-java/text/Format$Field
-java/text/Format$FieldDelegate
-java/text/MergeCollation
-java/text/MessageFormat
-java/text/MessageFormat$Field
-java/text/Normalizer
-java/text/Normalizer$Form
-java/text/NumberFormat
-java/text/NumberFormat$Field
-java/text/ParseException
-java/text/PatternEntry
-java/text/PatternEntry$Parser
-java/text/RBCollationTables
-java/text/RBCollationTables$BuildAPI
-java/text/RBTableBuilder
-java/text/RuleBasedCollator
-java/text/SimpleDateFormat
-java/text/spi/BreakIteratorProvider
-java/text/spi/CollatorProvider
-java/text/spi/DateFormatProvider
-java/text/spi/DateFormatSymbolsProvider
-java/text/spi/DecimalFormatSymbolsProvider
-java/text/spi/NumberFormatProvider
-java/util/AbstractCollection
-java/util/AbstractList
-java/util/AbstractList$Itr
-java/util/AbstractList$ListItr
-java/util/AbstractMap
-java/util/AbstractQueue
-java/util/AbstractSequentialList
-java/util/AbstractSet
-java/util/ArrayDeque
-java/util/ArrayList
-java/util/ArrayList$1
-java/util/ArrayList$Itr
-java/util/ArrayList$ListItr
-java/util/ArrayList$SubList
-java/util/ArrayList$SubList$1
-java/util/Arrays
-java/util/Arrays$ArrayList
-java/util/Arrays$LegacyMergeSort
-java/util/Base64
-java/util/Base64$Decoder
-java/util/Base64$Encoder
-java/util/BitSet
-java/util/Calendar
-java/util/Calendar$Builder
-java/util/Collection
-java/util/Collections
-java/util/Collections$3
-java/util/Collections$EmptyEnumeration
-java/util/Collections$EmptyIterator
-java/util/Collections$EmptyList
-java/util/Collections$EmptyMap
-java/util/Collections$EmptySet
-java/util/Collections$SetFromMap
-java/util/Collections$SynchronizedCollection
-java/util/Collections$SynchronizedMap
-java/util/Collections$SynchronizedSet
-java/util/Collections$SynchronizedSortedSet
-java/util/Collections$UnmodifiableCollection
-java/util/Collections$UnmodifiableCollection$1
-java/util/Collections$UnmodifiableList
-java/util/Collections$UnmodifiableList$1
-java/util/Collections$UnmodifiableMap
-java/util/Collections$UnmodifiableRandomAccessList
-java/util/Collections$UnmodifiableSet
-java/util/ComparableTimSort
-java/util/Comparator
-java/util/Currency
-java/util/Currency$1
-java/util/Currency$CurrencyNameGetter
-java/util/Date
-java/util/Deque
-java/util/Dictionary
-java/util/Enumeration
-java/util/EventListener
-java/util/EventListenerProxy
-java/util/EventObject
-java/util/GregorianCalendar
-java/util/HashMap
-java/util/HashMap$EntryIterator
-java/util/HashMap$EntrySet
-java/util/HashMap$HashIterator
-java/util/HashMap$KeyIterator
-java/util/HashMap$KeySet
-java/util/HashMap$Node
-java/util/HashMap$TreeNode
-java/util/HashMap$ValueIterator
-java/util/HashMap$Values
-java/util/HashSet
-java/util/Hashtable
-java/util/Hashtable$Entry
-java/util/Hashtable$EntrySet
-java/util/Hashtable$Enumerator
-java/util/Hashtable$ValueCollection
-java/util/IdentityHashMap
-java/util/IdentityHashMap$IdentityHashMapIterator
-java/util/IdentityHashMap$KeyIterator
-java/util/IdentityHashMap$KeySet
-java/util/IdentityHashMap$ValueIterator
-java/util/IdentityHashMap$Values
-java/util/Iterator
-java/util/LinkedHashMap
-java/util/LinkedHashMap$Entry
-java/util/LinkedHashMap$LinkedEntryIterator
-java/util/LinkedHashMap$LinkedEntrySet
-java/util/LinkedHashMap$LinkedHashIterator
-java/util/LinkedHashMap$LinkedKeyIterator
-java/util/LinkedHashMap$LinkedKeySet
-java/util/LinkedList
-java/util/LinkedList$ListItr
-java/util/LinkedList$Node
-java/util/List
-java/util/ListIterator
-java/util/ListResourceBundle
-java/util/Locale
-java/util/Locale$1
-java/util/Locale$Cache
-java/util/Locale$Category
-java/util/Locale$LocaleKey
-java/util/Map
-java/util/Map$Entry
-java/util/MissingResourceException
-java/util/NavigableMap
-java/util/NavigableSet
-java/util/Objects
-java/util/PriorityQueue
-java/util/Properties
-java/util/Properties$LineReader
-java/util/PropertyResourceBundle
-java/util/Queue
-java/util/Random
-java/util/RandomAccess
-java/util/ResourceBundle
-java/util/ResourceBundle$1
-java/util/ResourceBundle$BundleReference
-java/util/ResourceBundle$CacheKey
-java/util/ResourceBundle$CacheKeyReference
-java/util/ResourceBundle$Control
-java/util/ResourceBundle$Control$1
-java/util/ResourceBundle$Control$CandidateListCache
-java/util/ResourceBundle$LoaderReference
-java/util/ResourceBundle$RBClassLoader
-java/util/ResourceBundle$RBClassLoader$1
-java/util/ResourceBundle$SingleFormatControl
-java/util/ServiceLoader
-java/util/ServiceLoader$1
-java/util/ServiceLoader$LazyIterator
-java/util/Set
-java/util/SortedMap
-java/util/SortedSet
-java/util/Stack
-java/util/StringTokenizer
-java/util/TimSort
-java/util/TimeZone
-java/util/TimeZone$1
-java/util/TreeMap
-java/util/TreeMap$Entry
-java/util/TreeSet
-java/util/Vector
-java/util/Vector$1
-java/util/Vector$Itr
-java/util/Vector$ListItr
-java/util/WeakHashMap
-java/util/WeakHashMap$Entry
-java/util/WeakHashMap$KeySet
-java/util/concurrent/BlockingQueue
-java/util/concurrent/ConcurrentHashMap
-java/util/concurrent/ConcurrentHashMap$BaseIterator
-java/util/concurrent/ConcurrentHashMap$CollectionView
-java/util/concurrent/ConcurrentHashMap$CounterCell
-java/util/concurrent/ConcurrentHashMap$EntrySetView
-java/util/concurrent/ConcurrentHashMap$ForwardingNode
-java/util/concurrent/ConcurrentHashMap$KeyIterator
-java/util/concurrent/ConcurrentHashMap$KeySetView
-java/util/concurrent/ConcurrentHashMap$Node
-java/util/concurrent/ConcurrentHashMap$Segment
-java/util/concurrent/ConcurrentHashMap$Traverser
-java/util/concurrent/ConcurrentHashMap$ValueIterator
-java/util/concurrent/ConcurrentHashMap$ValuesView
-java/util/concurrent/ConcurrentMap
-java/util/concurrent/ConcurrentNavigableMap
-java/util/concurrent/ConcurrentSkipListMap
-java/util/concurrent/ConcurrentSkipListMap$EntrySet
-java/util/concurrent/ConcurrentSkipListMap$HeadIndex
-java/util/concurrent/ConcurrentSkipListMap$Index
-java/util/concurrent/ConcurrentSkipListMap$KeySet
-java/util/concurrent/ConcurrentSkipListMap$Node
-java/util/concurrent/ConcurrentSkipListMap$Values
-java/util/concurrent/ConcurrentSkipListSet
-java/util/concurrent/CopyOnWriteArrayList
-java/util/concurrent/DelayQueue
-java/util/concurrent/Delayed
-java/util/concurrent/ThreadLocalRandom
-java/util/concurrent/TimeUnit
-java/util/concurrent/TimeUnit$1
-java/util/concurrent/TimeUnit$2
-java/util/concurrent/TimeUnit$3
-java/util/concurrent/TimeUnit$4
-java/util/concurrent/TimeUnit$5
-java/util/concurrent/TimeUnit$6
-java/util/concurrent/TimeUnit$7
-java/util/concurrent/atomic/AtomicBoolean
-java/util/concurrent/atomic/AtomicInteger
-java/util/concurrent/atomic/AtomicLong
-java/util/concurrent/atomic/AtomicMarkableReference
-java/util/concurrent/atomic/AtomicMarkableReference$Pair
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1
-java/util/concurrent/locks/AbstractOwnableSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject
-java/util/concurrent/locks/AbstractQueuedSynchronizer$Node
-java/util/concurrent/locks/Condition
-java/util/concurrent/locks/Lock
-java/util/concurrent/locks/LockSupport
-java/util/concurrent/locks/ReentrantLock
-java/util/concurrent/locks/ReentrantLock$NonfairSync
-java/util/concurrent/locks/ReentrantLock$Sync
-java/util/function/BiFunction
-java/util/jar/Attributes
-java/util/jar/Attributes$Name
-java/util/jar/JarEntry
-java/util/jar/JarFile
-java/util/jar/JarFile$JarEntryIterator
-java/util/jar/JarFile$JarFileEntry
-java/util/jar/JarVerifier
-java/util/jar/JarVerifier$3
-java/util/jar/JarVerifier$VerifierStream
-java/util/jar/JavaUtilJarAccessImpl
-java/util/jar/Manifest
-java/util/jar/Manifest$FastInputStream
-java/util/logging/Handler
-java/util/logging/Level
-java/util/logging/Level$KnownLevel
-java/util/logging/LogManager
-java/util/logging/LogManager$1
-java/util/logging/LogManager$2
-java/util/logging/LogManager$3
-java/util/logging/LogManager$5
-java/util/logging/LogManager$Cleaner
-java/util/logging/LogManager$LogNode
-java/util/logging/LogManager$LoggerContext
-java/util/logging/LogManager$LoggerContext$1
-java/util/logging/LogManager$LoggerWeakRef
-java/util/logging/LogManager$RootLogger
-java/util/logging/LogManager$SystemLoggerContext
-java/util/logging/Logger
-java/util/logging/Logger$1
-java/util/logging/LoggingPermission
-java/util/logging/LoggingProxyImpl
-java/util/regex/MatchResult
-java/util/regex/Matcher
-java/util/regex/Pattern
-java/util/regex/Pattern$4
-java/util/regex/Pattern$BnM
-java/util/regex/Pattern$GroupHead
-java/util/regex/Pattern$LastNode
-java/util/regex/Pattern$Node
-java/util/regex/Pattern$Slice
-java/util/regex/Pattern$SliceNode
-java/util/regex/Pattern$Start
-java/util/regex/Pattern$TreeInfo
-java/util/spi/CalendarDataProvider
-java/util/spi/CurrencyNameProvider
-java/util/spi/LocaleNameProvider
-java/util/spi/LocaleServiceProvider
-java/util/spi/ResourceBundleControlProvider
-java/util/spi/TimeZoneNameProvider
-java/util/zip/CRC32
-java/util/zip/Checksum
-java/util/zip/DeflaterOutputStream
-java/util/zip/GZIPInputStream
-java/util/zip/Inflater
-java/util/zip/InflaterInputStream
-java/util/zip/ZStreamRef
-java/util/zip/ZipCoder
-java/util/zip/ZipConstants
-java/util/zip/ZipEntry
-java/util/zip/ZipFile
-java/util/zip/ZipFile$1
-java/util/zip/ZipFile$ZipEntryIterator
-java/util/zip/ZipFile$ZipFileInflaterInputStream
-java/util/zip/ZipFile$ZipFileInputStream
-java/util/zip/ZipInputStream
-java/util/zip/ZipUtils
-javax/accessibility/Accessible
-javax/accessibility/AccessibleAction
-javax/accessibility/AccessibleBundle
-javax/accessibility/AccessibleComponent
-javax/accessibility/AccessibleContext
-javax/accessibility/AccessibleExtendedComponent
-javax/accessibility/AccessibleRelationSet
-javax/accessibility/AccessibleState
-javax/accessibility/AccessibleText
-javax/accessibility/AccessibleValue
-javax/crypto/SecretKey
-javax/security/auth/Destroyable
-javax/security/auth/login/FailedLoginException
-javax/security/auth/login/LoginException
-javax/security/auth/x500/X500Principal
-javax/sound/sampled/Control$Type
-javax/sound/sampled/DataLine
-javax/sound/sampled/DataLine$Info
-javax/sound/sampled/FloatControl$Type
-javax/sound/sampled/Line
-javax/sound/sampled/Line$Info
-javax/sound/sampled/LineUnavailableException
-javax/sound/sampled/UnsupportedAudioFileException
-javax/swing/AbstractAction
-javax/swing/AbstractButton
-javax/swing/AbstractButton$AccessibleAbstractButton
-javax/swing/AbstractButton$Handler
-javax/swing/AbstractCellEditor
-javax/swing/AbstractListModel
-javax/swing/Action
-javax/swing/ActionMap
-javax/swing/AncestorNotifier
-javax/swing/ArrayTable
-javax/swing/BorderFactory
-javax/swing/BoundedRangeModel
-javax/swing/Box
-javax/swing/Box$Filler
-javax/swing/BoxLayout
-javax/swing/BufferStrategyPaintManager
-javax/swing/BufferStrategyPaintManager$BufferInfo
-javax/swing/ButtonGroup
-javax/swing/ButtonModel
-javax/swing/CellEditor
-javax/swing/CellRendererPane
-javax/swing/ClientPropertyKey
-javax/swing/ClientPropertyKey$1
-javax/swing/ComboBoxEditor
-javax/swing/ComboBoxModel
-javax/swing/ComponentInputMap
-javax/swing/DefaultBoundedRangeModel
-javax/swing/DefaultButtonModel
-javax/swing/DefaultCellEditor
-javax/swing/DefaultCellEditor$1
-javax/swing/DefaultCellEditor$EditorDelegate
-javax/swing/DefaultComboBoxModel
-javax/swing/DefaultListCellRenderer
-javax/swing/DefaultListCellRenderer$UIResource
-javax/swing/DefaultListModel
-javax/swing/DefaultListSelectionModel
-javax/swing/DefaultSingleSelectionModel
-javax/swing/DropMode
-javax/swing/FocusManager
-javax/swing/GrayFilter
-javax/swing/Icon
-javax/swing/ImageIcon
-javax/swing/ImageIcon$1
-javax/swing/ImageIcon$2
-javax/swing/ImageIcon$2$1
-javax/swing/ImageIcon$3
-javax/swing/InputMap
-javax/swing/InternalFrameFocusTraversalPolicy
-javax/swing/JButton
-javax/swing/JCheckBox
-javax/swing/JCheckBoxMenuItem
-javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem
-javax/swing/JComboBox
-javax/swing/JComboBox$1
-javax/swing/JComboBox$KeySelectionManager
-javax/swing/JComponent
-javax/swing/JComponent$1
-javax/swing/JComponent$2
-javax/swing/JComponent$AccessibleJComponent
-javax/swing/JDialog
-javax/swing/JEditorPane
-javax/swing/JFrame
-javax/swing/JInternalFrame
-javax/swing/JLabel
-javax/swing/JLayer
-javax/swing/JLayeredPane
-javax/swing/JList
-javax/swing/JList$3
-javax/swing/JList$ListSelectionHandler
-javax/swing/JMenu
-javax/swing/JMenu$MenuChangeListener
-javax/swing/JMenu$WinListener
-javax/swing/JMenuBar
-javax/swing/JMenuItem
-javax/swing/JMenuItem$AccessibleJMenuItem
-javax/swing/JMenuItem$MenuItemFocusListener
-javax/swing/JPanel
-javax/swing/JPopupMenu
-javax/swing/JPopupMenu$Separator
-javax/swing/JProgressBar
-javax/swing/JProgressBar$ModelListener
-javax/swing/JRadioButton
-javax/swing/JRadioButtonMenuItem
-javax/swing/JRootPane
-javax/swing/JRootPane$1
-javax/swing/JRootPane$RootLayout
-javax/swing/JScrollBar
-javax/swing/JScrollBar$ModelListener
-javax/swing/JScrollPane
-javax/swing/JScrollPane$ScrollBar
-javax/swing/JSeparator
-javax/swing/JSlider
-javax/swing/JSlider$ModelListener
-javax/swing/JSplitPane
-javax/swing/JTabbedPane
-javax/swing/JTabbedPane$ModelListener
-javax/swing/JTabbedPane$Page
-javax/swing/JTable
-javax/swing/JTable$2
-javax/swing/JTable$5
-javax/swing/JTable$Resizable2
-javax/swing/JTable$Resizable3
-javax/swing/JTextArea
-javax/swing/JTextField
-javax/swing/JTextField$NotifyAction
-javax/swing/JTextField$ScrollRepainter
-javax/swing/JToggleButton
-javax/swing/JToggleButton$ToggleButtonModel
-javax/swing/JToolBar
-javax/swing/JToolBar$DefaultToolBarLayout
-javax/swing/JToolBar$Separator
-javax/swing/JToolTip
-javax/swing/JTree
-javax/swing/JTree$TreeModelHandler
-javax/swing/JTree$TreeSelectionRedirector
-javax/swing/JViewport
-javax/swing/JViewport$ViewListener
-javax/swing/JWindow
-javax/swing/KeyStroke
-javax/swing/KeyboardManager
-javax/swing/KeyboardManager$ComponentKeyStrokePair
-javax/swing/LayoutComparator
-javax/swing/LayoutFocusTraversalPolicy
-javax/swing/ListCellRenderer
-javax/swing/ListModel
-javax/swing/ListSelectionModel
-javax/swing/LookAndFeel
-javax/swing/MenuElement
-javax/swing/MenuSelectionManager
-javax/swing/MultiUIDefaults
-javax/swing/MutableComboBoxModel
-javax/swing/RepaintManager
-javax/swing/RepaintManager$2
-javax/swing/RepaintManager$3
-javax/swing/RepaintManager$DisplayChangedHandler
-javax/swing/RepaintManager$PaintManager
-javax/swing/RepaintManager$ProcessingRunnable
-javax/swing/RootPaneContainer
-javax/swing/ScrollPaneConstants
-javax/swing/ScrollPaneLayout
-javax/swing/ScrollPaneLayout$UIResource
-javax/swing/Scrollable
-javax/swing/SingleSelectionModel
-javax/swing/SizeRequirements
-javax/swing/SortingFocusTraversalPolicy
-javax/swing/SwingConstants
-javax/swing/SwingContainerOrderFocusTraversalPolicy
-javax/swing/SwingDefaultFocusTraversalPolicy
-javax/swing/SwingPaintEventDispatcher
-javax/swing/SwingUtilities
-javax/swing/SwingUtilities$SharedOwnerFrame
-javax/swing/Timer
-javax/swing/Timer$DoPostEvent
-javax/swing/TimerQueue
-javax/swing/TimerQueue$1
-javax/swing/TimerQueue$DelayedTimer
-javax/swing/ToolTipManager
-javax/swing/ToolTipManager$AccessibilityKeyListener
-javax/swing/ToolTipManager$MoveBeforeEnterListener
-javax/swing/ToolTipManager$insideTimerAction
-javax/swing/ToolTipManager$outsideTimerAction
-javax/swing/ToolTipManager$stillInsideTimerAction
-javax/swing/TransferHandler
-javax/swing/TransferHandler$DropHandler
-javax/swing/TransferHandler$HasGetTransferHandler
-javax/swing/TransferHandler$SwingDropTarget
-javax/swing/TransferHandler$TransferAction
-javax/swing/TransferHandler$TransferSupport
-javax/swing/UIDefaults
-javax/swing/UIDefaults$ActiveValue
-javax/swing/UIDefaults$LazyInputMap
-javax/swing/UIDefaults$LazyValue
-javax/swing/UIDefaults$TextAndMnemonicHashMap
-javax/swing/UIManager
-javax/swing/UIManager$1
-javax/swing/UIManager$2
-javax/swing/UIManager$LAFState
-javax/swing/UIManager$LookAndFeelInfo
-javax/swing/UnsupportedLookAndFeelException
-javax/swing/ViewportLayout
-javax/swing/WindowConstants
-javax/swing/border/AbstractBorder
-javax/swing/border/BevelBorder
-javax/swing/border/Border
-javax/swing/border/CompoundBorder
-javax/swing/border/EmptyBorder
-javax/swing/border/EtchedBorder
-javax/swing/border/LineBorder
-javax/swing/border/MatteBorder
-javax/swing/border/TitledBorder
-javax/swing/event/AncestorEvent
-javax/swing/event/AncestorListener
-javax/swing/event/CaretEvent
-javax/swing/event/CaretListener
-javax/swing/event/CellEditorListener
-javax/swing/event/ChangeEvent
-javax/swing/event/ChangeListener
-javax/swing/event/DocumentEvent
-javax/swing/event/DocumentEvent$ElementChange
-javax/swing/event/DocumentEvent$EventType
-javax/swing/event/DocumentListener
-javax/swing/event/EventListenerList
-javax/swing/event/ListDataEvent
-javax/swing/event/ListDataListener
-javax/swing/event/ListSelectionEvent
-javax/swing/event/ListSelectionListener
-javax/swing/event/MenuDragMouseListener
-javax/swing/event/MenuEvent
-javax/swing/event/MenuKeyListener
-javax/swing/event/MenuListener
-javax/swing/event/MouseInputAdapter
-javax/swing/event/MouseInputListener
-javax/swing/event/PopupMenuListener
-javax/swing/event/RowSorterListener
-javax/swing/event/SwingPropertyChangeSupport
-javax/swing/event/TableColumnModelEvent
-javax/swing/event/TableColumnModelListener
-javax/swing/event/TableModelEvent
-javax/swing/event/TableModelListener
-javax/swing/event/TreeExpansionListener
-javax/swing/event/TreeModelEvent
-javax/swing/event/TreeModelListener
-javax/swing/event/TreeSelectionEvent
-javax/swing/event/TreeSelectionListener
-javax/swing/event/UndoableEditEvent
-javax/swing/event/UndoableEditListener
-javax/swing/filechooser/FileFilter
-javax/swing/plaf/ActionMapUIResource
-javax/swing/plaf/BorderUIResource
-javax/swing/plaf/BorderUIResource$CompoundBorderUIResource
-javax/swing/plaf/BorderUIResource$EmptyBorderUIResource
-javax/swing/plaf/BorderUIResource$LineBorderUIResource
-javax/swing/plaf/ButtonUI
-javax/swing/plaf/ColorUIResource
-javax/swing/plaf/ComboBoxUI
-javax/swing/plaf/ComponentInputMapUIResource
-javax/swing/plaf/ComponentUI
-javax/swing/plaf/DimensionUIResource
-javax/swing/plaf/FontUIResource
-javax/swing/plaf/InputMapUIResource
-javax/swing/plaf/InsetsUIResource
-javax/swing/plaf/LabelUI
-javax/swing/plaf/ListUI
-javax/swing/plaf/MenuBarUI
-javax/swing/plaf/MenuItemUI
-javax/swing/plaf/PanelUI
-javax/swing/plaf/PopupMenuUI
-javax/swing/plaf/ProgressBarUI
-javax/swing/plaf/RootPaneUI
-javax/swing/plaf/ScrollBarUI
-javax/swing/plaf/ScrollPaneUI
-javax/swing/plaf/SeparatorUI
-javax/swing/plaf/SliderUI
-javax/swing/plaf/SplitPaneUI
-javax/swing/plaf/TabbedPaneUI
-javax/swing/plaf/TableHeaderUI
-javax/swing/plaf/TableUI
-javax/swing/plaf/TextUI
-javax/swing/plaf/ToolBarUI
-javax/swing/plaf/TreeUI
-javax/swing/plaf/UIResource
-javax/swing/plaf/ViewportUI
-javax/swing/plaf/basic/BasicArrowButton
-javax/swing/plaf/basic/BasicBorders
-javax/swing/plaf/basic/BasicBorders$ButtonBorder
-javax/swing/plaf/basic/BasicBorders$MarginBorder
-javax/swing/plaf/basic/BasicBorders$RadioButtonBorder
-javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder
-javax/swing/plaf/basic/BasicBorders$SplitPaneBorder
-javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder
-javax/swing/plaf/basic/BasicButtonListener
-javax/swing/plaf/basic/BasicButtonUI
-javax/swing/plaf/basic/BasicCheckBoxMenuItemUI
-javax/swing/plaf/basic/BasicComboBoxEditor
-javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField
-javax/swing/plaf/basic/BasicComboBoxEditor$UIResource
-javax/swing/plaf/basic/BasicComboBoxRenderer
-javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource
-javax/swing/plaf/basic/BasicComboBoxUI
-javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager
-javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager
-javax/swing/plaf/basic/BasicComboBoxUI$Handler
-javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicComboPopup
-javax/swing/plaf/basic/BasicComboPopup$1
-javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass
-javax/swing/plaf/basic/BasicComboPopup$Handler
-javax/swing/plaf/basic/BasicGraphicsUtils
-javax/swing/plaf/basic/BasicHTML
-javax/swing/plaf/basic/BasicLabelUI
-javax/swing/plaf/basic/BasicListUI
-javax/swing/plaf/basic/BasicListUI$Handler
-javax/swing/plaf/basic/BasicListUI$ListTransferHandler
-javax/swing/plaf/basic/BasicLookAndFeel
-javax/swing/plaf/basic/BasicLookAndFeel$1
-javax/swing/plaf/basic/BasicLookAndFeel$2
-javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper
-javax/swing/plaf/basic/BasicMenuBarUI
-javax/swing/plaf/basic/BasicMenuBarUI$Handler
-javax/swing/plaf/basic/BasicMenuItemUI
-javax/swing/plaf/basic/BasicMenuItemUI$Handler
-javax/swing/plaf/basic/BasicMenuUI
-javax/swing/plaf/basic/BasicMenuUI$Handler
-javax/swing/plaf/basic/BasicPanelUI
-javax/swing/plaf/basic/BasicPopupMenuUI
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1
-javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber
-javax/swing/plaf/basic/BasicProgressBarUI
-javax/swing/plaf/basic/BasicProgressBarUI$Handler
-javax/swing/plaf/basic/BasicRadioButtonMenuItemUI
-javax/swing/plaf/basic/BasicRadioButtonUI
-javax/swing/plaf/basic/BasicRootPaneUI
-javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap
-javax/swing/plaf/basic/BasicScrollBarUI
-javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener
-javax/swing/plaf/basic/BasicScrollBarUI$Handler
-javax/swing/plaf/basic/BasicScrollBarUI$ModelListener
-javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener
-javax/swing/plaf/basic/BasicScrollBarUI$TrackListener
-javax/swing/plaf/basic/BasicScrollPaneUI
-javax/swing/plaf/basic/BasicScrollPaneUI$Handler
-javax/swing/plaf/basic/BasicSeparatorUI
-javax/swing/plaf/basic/BasicSliderUI
-javax/swing/plaf/basic/BasicSliderUI$Actions
-javax/swing/plaf/basic/BasicSliderUI$Handler
-javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicSliderUI$ScrollListener
-javax/swing/plaf/basic/BasicSliderUI$TrackListener
-javax/swing/plaf/basic/BasicSplitPaneDivider
-javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout
-javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler
-javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler
-javax/swing/plaf/basic/BasicSplitPaneUI
-javax/swing/plaf/basic/BasicSplitPaneUI$1
-javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager
-javax/swing/plaf/basic/BasicSplitPaneUI$Handler
-javax/swing/plaf/basic/BasicTabbedPaneUI
-javax/swing/plaf/basic/BasicTabbedPaneUI$Handler
-javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout
-javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout
-javax/swing/plaf/basic/BasicTableHeaderUI
-javax/swing/plaf/basic/BasicTableHeaderUI$1
-javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler
-javax/swing/plaf/basic/BasicTableUI
-javax/swing/plaf/basic/BasicTableUI$Handler
-javax/swing/plaf/basic/BasicTableUI$TableTransferHandler
-javax/swing/plaf/basic/BasicTextAreaUI
-javax/swing/plaf/basic/BasicTextFieldUI
-javax/swing/plaf/basic/BasicTextUI
-javax/swing/plaf/basic/BasicTextUI$BasicCaret
-javax/swing/plaf/basic/BasicTextUI$BasicCursor
-javax/swing/plaf/basic/BasicTextUI$BasicHighlighter
-javax/swing/plaf/basic/BasicTextUI$DragListener
-javax/swing/plaf/basic/BasicTextUI$FocusAction
-javax/swing/plaf/basic/BasicTextUI$RootView
-javax/swing/plaf/basic/BasicTextUI$TextActionWrapper
-javax/swing/plaf/basic/BasicTextUI$TextTransferHandler
-javax/swing/plaf/basic/BasicTextUI$UpdateHandler
-javax/swing/plaf/basic/BasicToggleButtonUI
-javax/swing/plaf/basic/BasicToolBarSeparatorUI
-javax/swing/plaf/basic/BasicToolBarUI
-javax/swing/plaf/basic/BasicToolBarUI$DockingListener
-javax/swing/plaf/basic/BasicToolBarUI$Handler
-javax/swing/plaf/basic/BasicTreeUI
-javax/swing/plaf/basic/BasicTreeUI$Actions
-javax/swing/plaf/basic/BasicTreeUI$Handler
-javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler
-javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler
-javax/swing/plaf/basic/BasicViewportUI
-javax/swing/plaf/basic/ComboPopup
-javax/swing/plaf/basic/DefaultMenuLayout
-javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag
-javax/swing/plaf/basic/LazyActionMap
-javax/swing/plaf/metal/DefaultMetalTheme
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1
-javax/swing/plaf/metal/MetalBorders
-javax/swing/plaf/metal/MetalBorders$ButtonBorder
-javax/swing/plaf/metal/MetalBorders$Flush3DBorder
-javax/swing/plaf/metal/MetalBorders$MenuBarBorder
-javax/swing/plaf/metal/MetalBorders$MenuItemBorder
-javax/swing/plaf/metal/MetalBorders$PopupMenuBorder
-javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder
-javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder
-javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder
-javax/swing/plaf/metal/MetalBorders$TextFieldBorder
-javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder
-javax/swing/plaf/metal/MetalBorders$ToolBarBorder
-javax/swing/plaf/metal/MetalBumps
-javax/swing/plaf/metal/MetalButtonUI
-javax/swing/plaf/metal/MetalCheckBoxUI
-javax/swing/plaf/metal/MetalComboBoxButton
-javax/swing/plaf/metal/MetalComboBoxButton$1
-javax/swing/plaf/metal/MetalComboBoxEditor
-javax/swing/plaf/metal/MetalComboBoxEditor$1
-javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder
-javax/swing/plaf/metal/MetalComboBoxEditor$UIResource
-javax/swing/plaf/metal/MetalComboBoxIcon
-javax/swing/plaf/metal/MetalComboBoxUI
-javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager
-javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener
-javax/swing/plaf/metal/MetalIconFactory
-javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon
-javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon
-javax/swing/plaf/metal/MetalIconFactory$FolderIcon16
-javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon
-javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon
-javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon
-javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon
-javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon
-javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon
-javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon
-javax/swing/plaf/metal/MetalLabelUI
-javax/swing/plaf/metal/MetalLookAndFeel
-javax/swing/plaf/metal/MetalLookAndFeel$AATextListener
-javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue
-javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue
-javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue$1
-javax/swing/plaf/metal/MetalPopupMenuSeparatorUI
-javax/swing/plaf/metal/MetalProgressBarUI
-javax/swing/plaf/metal/MetalRadioButtonUI
-javax/swing/plaf/metal/MetalRootPaneUI
-javax/swing/plaf/metal/MetalScrollBarUI
-javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener
-javax/swing/plaf/metal/MetalScrollButton
-javax/swing/plaf/metal/MetalScrollPaneUI
-javax/swing/plaf/metal/MetalScrollPaneUI$1
-javax/swing/plaf/metal/MetalSeparatorUI
-javax/swing/plaf/metal/MetalSliderUI
-javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener
-javax/swing/plaf/metal/MetalSplitPaneDivider
-javax/swing/plaf/metal/MetalSplitPaneDivider$1
-javax/swing/plaf/metal/MetalSplitPaneDivider$2
-javax/swing/plaf/metal/MetalSplitPaneUI
-javax/swing/plaf/metal/MetalTabbedPaneUI
-javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout
-javax/swing/plaf/metal/MetalTextFieldUI
-javax/swing/plaf/metal/MetalTheme
-javax/swing/plaf/metal/MetalToggleButtonUI
-javax/swing/plaf/metal/MetalToolBarUI
-javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener
-javax/swing/plaf/metal/MetalTreeUI
-javax/swing/plaf/metal/MetalTreeUI$LineListener
-javax/swing/plaf/metal/OceanTheme
-javax/swing/plaf/metal/OceanTheme$1
-javax/swing/plaf/metal/OceanTheme$2
-javax/swing/plaf/metal/OceanTheme$3
-javax/swing/plaf/metal/OceanTheme$4
-javax/swing/plaf/metal/OceanTheme$5
-javax/swing/plaf/metal/OceanTheme$6
-javax/swing/plaf/synth/SynthConstants
-javax/swing/plaf/synth/SynthUI
-javax/swing/table/AbstractTableModel
-javax/swing/table/DefaultTableCellRenderer
-javax/swing/table/DefaultTableColumnModel
-javax/swing/table/DefaultTableModel
-javax/swing/table/JTableHeader
-javax/swing/table/TableCellEditor
-javax/swing/table/TableCellRenderer
-javax/swing/table/TableColumn
-javax/swing/table/TableColumnModel
-javax/swing/table/TableModel
-javax/swing/text/AbstractDocument
-javax/swing/text/AbstractDocument$1
-javax/swing/text/AbstractDocument$AbstractElement
-javax/swing/text/AbstractDocument$AttributeContext
-javax/swing/text/AbstractDocument$BidiElement
-javax/swing/text/AbstractDocument$BidiRootElement
-javax/swing/text/AbstractDocument$BranchElement
-javax/swing/text/AbstractDocument$Content
-javax/swing/text/AbstractDocument$DefaultDocumentEvent
-javax/swing/text/AbstractDocument$ElementEdit
-javax/swing/text/AbstractDocument$InsertStringResult
-javax/swing/text/AbstractDocument$LeafElement
-javax/swing/text/AttributeSet
-javax/swing/text/AttributeSet$CharacterAttribute
-javax/swing/text/AttributeSet$ColorAttribute
-javax/swing/text/AttributeSet$FontAttribute
-javax/swing/text/AttributeSet$ParagraphAttribute
-javax/swing/text/Caret
-javax/swing/text/DefaultCaret
-javax/swing/text/DefaultCaret$Handler
-javax/swing/text/DefaultEditorKit
-javax/swing/text/DefaultEditorKit$BeepAction
-javax/swing/text/DefaultEditorKit$BeginAction
-javax/swing/text/DefaultEditorKit$BeginLineAction
-javax/swing/text/DefaultEditorKit$BeginParagraphAction
-javax/swing/text/DefaultEditorKit$BeginWordAction
-javax/swing/text/DefaultEditorKit$CopyAction
-javax/swing/text/DefaultEditorKit$CutAction
-javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction
-javax/swing/text/DefaultEditorKit$DeleteNextCharAction
-javax/swing/text/DefaultEditorKit$DeletePrevCharAction
-javax/swing/text/DefaultEditorKit$DeleteWordAction
-javax/swing/text/DefaultEditorKit$DumpModelAction
-javax/swing/text/DefaultEditorKit$EndAction
-javax/swing/text/DefaultEditorKit$EndLineAction
-javax/swing/text/DefaultEditorKit$EndParagraphAction
-javax/swing/text/DefaultEditorKit$EndWordAction
-javax/swing/text/DefaultEditorKit$InsertBreakAction
-javax/swing/text/DefaultEditorKit$InsertContentAction
-javax/swing/text/DefaultEditorKit$InsertTabAction
-javax/swing/text/DefaultEditorKit$NextVisualPositionAction
-javax/swing/text/DefaultEditorKit$NextWordAction
-javax/swing/text/DefaultEditorKit$PageAction
-javax/swing/text/DefaultEditorKit$PasteAction
-javax/swing/text/DefaultEditorKit$PreviousWordAction
-javax/swing/text/DefaultEditorKit$ReadOnlyAction
-javax/swing/text/DefaultEditorKit$SelectAllAction
-javax/swing/text/DefaultEditorKit$SelectLineAction
-javax/swing/text/DefaultEditorKit$SelectParagraphAction
-javax/swing/text/DefaultEditorKit$SelectWordAction
-javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction
-javax/swing/text/DefaultEditorKit$UnselectAction
-javax/swing/text/DefaultEditorKit$VerticalPageAction
-javax/swing/text/DefaultEditorKit$WritableAction
-javax/swing/text/DefaultHighlighter
-javax/swing/text/DefaultHighlighter$DefaultHighlightPainter
-javax/swing/text/DefaultHighlighter$SafeDamager
-javax/swing/text/Document
-javax/swing/text/EditorKit
-javax/swing/text/Element
-javax/swing/text/FieldView
-javax/swing/text/GapContent
-javax/swing/text/GapContent$InsertUndo
-javax/swing/text/GapContent$MarkData
-javax/swing/text/GapContent$MarkVector
-javax/swing/text/GapContent$StickyPosition
-javax/swing/text/GapVector
-javax/swing/text/Highlighter
-javax/swing/text/Highlighter$Highlight
-javax/swing/text/Highlighter$HighlightPainter
-javax/swing/text/JTextComponent
-javax/swing/text/JTextComponent$1
-javax/swing/text/JTextComponent$DefaultKeymap
-javax/swing/text/JTextComponent$KeymapActionMap
-javax/swing/text/JTextComponent$KeymapWrapper
-javax/swing/text/JTextComponent$MutableCaretEvent
-javax/swing/text/Keymap
-javax/swing/text/LayeredHighlighter
-javax/swing/text/LayeredHighlighter$LayerPainter
-javax/swing/text/MutableAttributeSet
-javax/swing/text/PlainDocument
-javax/swing/text/PlainView
-javax/swing/text/Position
-javax/swing/text/Position$Bias
-javax/swing/text/Segment
-javax/swing/text/SegmentCache
-javax/swing/text/SegmentCache$CachedSegment
-javax/swing/text/SimpleAttributeSet
-javax/swing/text/SimpleAttributeSet$EmptyAttributeSet
-javax/swing/text/Style
-javax/swing/text/StyleConstants
-javax/swing/text/StyleConstants$CharacterConstants
-javax/swing/text/StyleConstants$ColorConstants
-javax/swing/text/StyleConstants$FontConstants
-javax/swing/text/StyleConstants$ParagraphConstants
-javax/swing/text/StyleContext
-javax/swing/text/StyleContext$FontKey
-javax/swing/text/StyleContext$KeyEnumeration
-javax/swing/text/StyleContext$NamedStyle
-javax/swing/text/StyleContext$SmallAttributeSet
-javax/swing/text/TabExpander
-javax/swing/text/TextAction
-javax/swing/text/Utilities
-javax/swing/text/View
-javax/swing/text/ViewFactory
-javax/swing/tree/AbstractLayoutCache
-javax/swing/tree/AbstractLayoutCache$NodeDimensions
-javax/swing/tree/DefaultMutableTreeNode
-javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration
-javax/swing/tree/DefaultTreeCellEditor
-javax/swing/tree/DefaultTreeCellEditor$1
-javax/swing/tree/DefaultTreeCellEditor$DefaultTextField
-javax/swing/tree/DefaultTreeCellEditor$EditorContainer
-javax/swing/tree/DefaultTreeCellRenderer
-javax/swing/tree/DefaultTreeModel
-javax/swing/tree/DefaultTreeSelectionModel
-javax/swing/tree/MutableTreeNode
-javax/swing/tree/PathPlaceHolder
-javax/swing/tree/RowMapper
-javax/swing/tree/TreeCellEditor
-javax/swing/tree/TreeCellRenderer
-javax/swing/tree/TreeModel
-javax/swing/tree/TreeNode
-javax/swing/tree/TreePath
-javax/swing/tree/TreeSelectionModel
-javax/swing/tree/VariableHeightLayoutCache
-javax/swing/tree/VariableHeightLayoutCache$TreeStateNode
-javax/swing/undo/AbstractUndoableEdit
-javax/swing/undo/CompoundEdit
-javax/swing/undo/UndoableEdit
-javax/xml/parsers/DocumentBuilder
-javax/xml/parsers/DocumentBuilderFactory
-javax/xml/parsers/FactoryFinder
-javax/xml/parsers/FactoryFinder$1
-javax/xml/parsers/ParserConfigurationException
-javax/xml/parsers/SecuritySupport
-javax/xml/parsers/SecuritySupport$2
-javax/xml/parsers/SecuritySupport$5
-org/w3c/dom/Attr
-org/w3c/dom/CDATASection
-org/w3c/dom/CharacterData
-org/w3c/dom/Comment
-org/w3c/dom/DOMException
-org/w3c/dom/Document
-org/w3c/dom/DocumentFragment
-org/w3c/dom/DocumentType
-org/w3c/dom/Element
-org/w3c/dom/Entity
-org/w3c/dom/EntityReference
-org/w3c/dom/NamedNodeMap
-org/w3c/dom/Node
-org/w3c/dom/NodeList
-org/w3c/dom/Notation
-org/w3c/dom/ProcessingInstruction
-org/w3c/dom/Text
-org/w3c/dom/events/DocumentEvent
-org/w3c/dom/events/Event
-org/w3c/dom/events/EventException
-org/w3c/dom/events/EventTarget
-org/w3c/dom/events/MutationEvent
-org/w3c/dom/ranges/DocumentRange
-org/w3c/dom/ranges/Range
-org/w3c/dom/traversal/DocumentTraversal
-org/w3c/dom/traversal/NodeIterator
-org/w3c/dom/traversal/TreeWalker
-org/xml/sax/AttributeList
-org/xml/sax/ContentHandler
-org/xml/sax/DTDHandler
-org/xml/sax/EntityResolver
-org/xml/sax/ErrorHandler
-org/xml/sax/InputSource
-org/xml/sax/Locator
-org/xml/sax/SAXException
-org/xml/sax/SAXNotRecognizedException
-org/xml/sax/SAXNotSupportedException
-org/xml/sax/SAXParseException
-org/xml/sax/helpers/DefaultHandler
-sun/awt/AWTAccessor
-sun/awt/AWTAccessor$AWTEventAccessor
-sun/awt/AWTAccessor$ClientPropertyKeyAccessor
-sun/awt/AWTAccessor$ComponentAccessor
-sun/awt/AWTAccessor$ContainerAccessor
-sun/awt/AWTAccessor$CursorAccessor
-sun/awt/AWTAccessor$DefaultKeyboardFocusManagerAccessor
-sun/awt/AWTAccessor$EventQueueAccessor
-sun/awt/AWTAccessor$FrameAccessor
-sun/awt/AWTAccessor$InputEventAccessor
-sun/awt/AWTAccessor$InvocationEventAccessor
-sun/awt/AWTAccessor$KeyEventAccessor
-sun/awt/AWTAccessor$KeyboardFocusManagerAccessor
-sun/awt/AWTAccessor$SequencedEventAccessor
-sun/awt/AWTAccessor$ToolkitAccessor
-sun/awt/AWTAccessor$WindowAccessor
-sun/awt/AWTAutoShutdown
-sun/awt/AWTIcon64_java_icon16_png
-sun/awt/AWTIcon64_java_icon24_png
-sun/awt/AWTIcon64_java_icon32_png
-sun/awt/AWTIcon64_java_icon48_png
-sun/awt/AppContext
-sun/awt/AppContext$1
-sun/awt/AppContext$2
-sun/awt/AppContext$3
-sun/awt/AppContext$6
-sun/awt/AppContext$GetAppContextLock
-sun/awt/AppContext$State
-sun/awt/CausedFocusEvent
-sun/awt/CausedFocusEvent$Cause
-sun/awt/ComponentFactory
-sun/awt/ConstrainableGraphics
-sun/awt/DisplayChangedListener
-sun/awt/EmbeddedFrame
-sun/awt/EventQueueDelegate
-sun/awt/EventQueueItem
-sun/awt/FontConfiguration
-sun/awt/FontConfiguration$1
-sun/awt/FontDescriptor
-sun/awt/GlobalCursorManager
-sun/awt/GlobalCursorManager$NativeUpdater
-sun/awt/HeadlessToolkit
-sun/awt/IconInfo
-sun/awt/InputMethodSupport
-sun/awt/KeyboardFocusManagerPeerImpl
-sun/awt/KeyboardFocusManagerPeerProvider
-sun/awt/LightweightFrame
-sun/awt/ModalityListener
-sun/awt/MostRecentKeyValue
-sun/awt/NullComponentPeer
-sun/awt/OSInfo
-sun/awt/OSInfo$1
-sun/awt/OSInfo$OSType
-sun/awt/OSInfo$WindowsVersion
-sun/awt/PaintEventDispatcher
-sun/awt/PeerEvent
-sun/awt/PostEventQueue
-sun/awt/RepaintArea
-sun/awt/RequestFocusController
-sun/awt/SubRegionShowable
-sun/awt/SunDisplayChanger
-sun/awt/SunGraphicsCallback
-sun/awt/SunHints
-sun/awt/SunHints$Key
-sun/awt/SunHints$LCDContrastKey
-sun/awt/SunHints$Value
-sun/awt/SunToolkit
-sun/awt/SunToolkit$ModalityListenerList
-sun/awt/TimedWindowEvent
-sun/awt/UNIXToolkit
-sun/awt/WindowClosingListener
-sun/awt/WindowClosingSupport
-sun/awt/X11/AwtGraphicsConfigData
-sun/awt/X11/AwtScreenData
-sun/awt/X11/MotifColorUtilities
-sun/awt/X11/MotifDnDConstants
-sun/awt/X11/MotifDnDDragSourceProtocol
-sun/awt/X11/MotifDnDDropTargetProtocol
-sun/awt/X11/Native
-sun/awt/X11/Native$1
-sun/awt/X11/OwnershipListener
-sun/awt/X11/PropMwmHints
-sun/awt/X11/UnsafeXDisposerRecord
-sun/awt/X11/WindowDimensions
-sun/awt/X11/WindowPropertyGetter
-sun/awt/X11/XAWTXSettings
-sun/awt/X11/XAnyEvent
-sun/awt/X11/XAtom
-sun/awt/X11/XAtomList
-sun/awt/X11/XAwtState
-sun/awt/X11/XBaseWindow
-sun/awt/X11/XBaseWindow$1
-sun/awt/X11/XBaseWindow$InitialiseState
-sun/awt/X11/XBaseWindow$StateLock
-sun/awt/X11/XCanvasPeer
-sun/awt/X11/XClientMessageEvent
-sun/awt/X11/XClipboard
-sun/awt/X11/XComponentPeer
-sun/awt/X11/XComponentPeer$1
-sun/awt/X11/XConfigureEvent
-sun/awt/X11/XContentWindow
-sun/awt/X11/XCreateWindowParams
-sun/awt/X11/XDecoratedPeer
-sun/awt/X11/XDnDConstants
-sun/awt/X11/XDnDDragSourceProtocol
-sun/awt/X11/XDnDDropTargetProtocol
-sun/awt/X11/XDragAndDropProtocols
-sun/awt/X11/XDragSourceContextPeer
-sun/awt/X11/XDragSourceProtocol
-sun/awt/X11/XDragSourceProtocolListener
-sun/awt/X11/XDropTargetContextPeer
-sun/awt/X11/XDropTargetContextPeer$XDropTargetProtocolListenerImpl
-sun/awt/X11/XDropTargetEventProcessor
-sun/awt/X11/XDropTargetProtocol
-sun/awt/X11/XDropTargetProtocolListener
-sun/awt/X11/XDropTargetRegistry
-sun/awt/X11/XEmbeddedFramePeer
-sun/awt/X11/XErrorEvent
-sun/awt/X11/XErrorHandler
-sun/awt/X11/XErrorHandler$IgnoreBadWindowHandler
-sun/awt/X11/XErrorHandler$VerifyChangePropertyHandler
-sun/awt/X11/XErrorHandler$XBaseErrorHandler
-sun/awt/X11/XErrorHandler$XErrorHandlerWithFlag
-sun/awt/X11/XErrorHandler$XShmAttachHandler
-sun/awt/X11/XErrorHandlerUtil
-sun/awt/X11/XEvent
-sun/awt/X11/XEventDispatcher
-sun/awt/X11/XExposeEvent
-sun/awt/X11/XFocusChangeEvent
-sun/awt/X11/XFocusProxyWindow
-sun/awt/X11/XFramePeer
-sun/awt/X11/XGlobalCursorManager
-sun/awt/X11/XInputMethod
-sun/awt/X11/XInputMethodDescriptor
-sun/awt/X11/XKeyboardFocusManagerPeer
-sun/awt/X11/XLabelPeer
-sun/awt/X11/XLayerProtocol
-sun/awt/X11/XMSelection
-sun/awt/X11/XMSelection$1
-sun/awt/X11/XMSelection$3
-sun/awt/X11/XMSelectionListener
-sun/awt/X11/XModifierKeymap
-sun/awt/X11/XNETProtocol
-sun/awt/X11/XPanelPeer
-sun/awt/X11/XPropertyCache
-sun/awt/X11/XPropertyEvent
-sun/awt/X11/XProtocol
-sun/awt/X11/XRepaintArea
-sun/awt/X11/XReparentEvent
-sun/awt/X11/XRootWindow
-sun/awt/X11/XSelection
-sun/awt/X11/XSelection$IncrementalTransferHandler
-sun/awt/X11/XSelection$SelectionEventHandler
-sun/awt/X11/XSetWindowAttributes
-sun/awt/X11/XSizeHints
-sun/awt/X11/XStateProtocol
-sun/awt/X11/XSystemTrayPeer
-sun/awt/X11/XToolkit
-sun/awt/X11/XToolkit$1
-sun/awt/X11/XToolkit$2
-sun/awt/X11/XToolkit$2$1
-sun/awt/X11/XToolkit$3
-sun/awt/X11/XToolkit$4
-sun/awt/X11/XToolkit$5
-sun/awt/X11/XTranslateCoordinates
-sun/awt/X11/XUnmapEvent
-sun/awt/X11/XVisibilityEvent
-sun/awt/X11/XVisualInfo
-sun/awt/X11/XWINProtocol
-sun/awt/X11/XWM
-sun/awt/X11/XWM$1
-sun/awt/X11/XWMHints
-sun/awt/X11/XWindow
-sun/awt/X11/XWindowAttributes
-sun/awt/X11/XWindowAttributesData
-sun/awt/X11/XWindowPeer
-sun/awt/X11/XWindowPeer$2
-sun/awt/X11/XWindowPeer$4
-sun/awt/X11/XWrapperBase
-sun/awt/X11/XlibUtil
-sun/awt/X11/XlibWrapper
-sun/awt/X11ComponentPeer
-sun/awt/X11FontManager
-sun/awt/X11GraphicsConfig
-sun/awt/X11GraphicsConfig$X11GCDisposerRecord
-sun/awt/X11GraphicsDevice
-sun/awt/X11GraphicsEnvironment
-sun/awt/X11GraphicsEnvironment$1
-sun/awt/X11InputMethod
-sun/awt/X11InputMethodDescriptor
-sun/awt/XSettings
-sun/awt/XSettings$Update
-sun/awt/datatransfer/SunClipboard
-sun/awt/dnd/SunDragSourceContextPeer
-sun/awt/dnd/SunDropTargetContextPeer
-sun/awt/dnd/SunDropTargetEvent
-sun/awt/event/IgnorePaintEvent
-sun/awt/im/ExecutableInputMethodManager
-sun/awt/im/ExecutableInputMethodManager$3
-sun/awt/im/InputContext
-sun/awt/im/InputMethodAdapter
-sun/awt/im/InputMethodContext
-sun/awt/im/InputMethodLocator
-sun/awt/im/InputMethodManager
-sun/awt/image/BufImgSurfaceData
-sun/awt/image/BufImgSurfaceData$ICMColorData
-sun/awt/image/BufImgSurfaceManager
-sun/awt/image/BufferedImageGraphicsConfig
-sun/awt/image/ByteComponentRaster
-sun/awt/image/ByteInterleavedRaster
-sun/awt/image/BytePackedRaster
-sun/awt/image/FetcherInfo
-sun/awt/image/GifFrame
-sun/awt/image/GifImageDecoder
-sun/awt/image/ImageConsumerQueue
-sun/awt/image/ImageDecoder
-sun/awt/image/ImageDecoder$1
-sun/awt/image/ImageFetchable
-sun/awt/image/ImageFetcher
-sun/awt/image/ImageFetcher$1
-sun/awt/image/ImageRepresentation
-sun/awt/image/ImageWatched
-sun/awt/image/ImageWatched$Link
-sun/awt/image/ImageWatched$WeakLink
-sun/awt/image/InputStreamImageSource
-sun/awt/image/IntegerComponentRaster
-sun/awt/image/IntegerInterleavedRaster
-sun/awt/image/NativeLibLoader
-sun/awt/image/NativeLibLoader$1
-sun/awt/image/OffScreenImage
-sun/awt/image/PNGFilterInputStream
-sun/awt/image/PNGImageDecoder
-sun/awt/image/PixelConverter
-sun/awt/image/PixelConverter$Argb
-sun/awt/image/PixelConverter$ArgbBm
-sun/awt/image/PixelConverter$ArgbPre
-sun/awt/image/PixelConverter$Bgrx
-sun/awt/image/PixelConverter$ByteGray
-sun/awt/image/PixelConverter$Rgba
-sun/awt/image/PixelConverter$RgbaPre
-sun/awt/image/PixelConverter$Rgbx
-sun/awt/image/PixelConverter$Ushort4444Argb
-sun/awt/image/PixelConverter$Ushort555Rgb
-sun/awt/image/PixelConverter$Ushort555Rgbx
-sun/awt/image/PixelConverter$Ushort565Rgb
-sun/awt/image/PixelConverter$UshortGray
-sun/awt/image/PixelConverter$Xbgr
-sun/awt/image/PixelConverter$Xrgb
-sun/awt/image/SunVolatileImage
-sun/awt/image/SunWritableRaster
-sun/awt/image/SunWritableRaster$DataStealer
-sun/awt/image/SurfaceManager
-sun/awt/image/SurfaceManager$FlushableCacheData
-sun/awt/image/SurfaceManager$ImageAccessor
-sun/awt/image/SurfaceManager$ProxiedGraphicsConfig
-sun/awt/image/ToolkitImage
-sun/awt/image/URLImageSource
-sun/awt/image/VolatileSurfaceManager
-sun/awt/motif/MFontConfiguration
-sun/awt/resources/awt
-sun/awt/util/IdentityArrayList
-sun/dc/DuctusRenderingEngine
-sun/font/AttributeValues
-sun/font/CMap
-sun/font/CMap$CMapFormat12
-sun/font/CMap$NullCMapClass
-sun/font/CharToGlyphMapper
-sun/font/CompositeFont
-sun/font/CompositeFontDescriptor
-sun/font/CompositeGlyphMapper
-sun/font/CompositeStrike
-sun/font/CoreMetrics
-sun/font/EAttribute
-sun/font/FcFontConfiguration
-sun/font/FileFont
-sun/font/FileFontStrike
-sun/font/Font2D
-sun/font/Font2DHandle
-sun/font/FontAccess
-sun/font/FontConfigManager
-sun/font/FontConfigManager$FcCompFont
-sun/font/FontConfigManager$FontConfigFont
-sun/font/FontConfigManager$FontConfigInfo
-sun/font/FontDesignMetrics
-sun/font/FontDesignMetrics$KeyReference
-sun/font/FontDesignMetrics$MetricsKey
-sun/font/FontFamily
-sun/font/FontLineMetrics
-sun/font/FontManager
-sun/font/FontManagerFactory
-sun/font/FontManagerFactory$1
-sun/font/FontManagerForSGE
-sun/font/FontManagerNativeLibrary
-sun/font/FontManagerNativeLibrary$1
-sun/font/FontScaler
-sun/font/FontStrike
-sun/font/FontStrikeDesc
-sun/font/FontStrikeDisposer
-sun/font/FontUtilities
-sun/font/FontUtilities$1
-sun/font/GlyphDisposedListener
-sun/font/GlyphList
-sun/font/PhysicalFont
-sun/font/PhysicalStrike
-sun/font/StandardGlyphVector
-sun/font/StandardGlyphVector$GlyphStrike
-sun/font/StrikeCache
-sun/font/StrikeCache$1
-sun/font/StrikeCache$DisposableStrike
-sun/font/StrikeCache$SoftDisposerRef
-sun/font/StrikeMetrics
-sun/font/SunFontManager
-sun/font/SunFontManager$1
-sun/font/SunFontManager$11
-sun/font/SunFontManager$13
-sun/font/SunFontManager$2
-sun/font/SunFontManager$3
-sun/font/SunFontManager$FontRegistrationInfo
-sun/font/SunFontManager$T1Filter
-sun/font/SunFontManager$TTFilter
-sun/font/T2KFontScaler
-sun/font/T2KFontScaler$1
-sun/font/TrueTypeFont
-sun/font/TrueTypeFont$1
-sun/font/TrueTypeFont$DirectoryEntry
-sun/font/TrueTypeFont$TTDisposerRecord
-sun/font/TrueTypeGlyphMapper
-sun/font/Type1Font
-sun/font/Type1Font$1
-sun/font/XRGlyphCache
-sun/font/XRGlyphCacheEntry
-sun/font/XRTextRenderer
-sun/java2d/BackBufferCapsProvider
-sun/java2d/DefaultDisposerRecord
-sun/java2d/DestSurfaceProvider
-sun/java2d/Disposer
-sun/java2d/Disposer$1
-sun/java2d/Disposer$2
-sun/java2d/Disposer$PollDisposable
-sun/java2d/DisposerRecord
-sun/java2d/DisposerTarget
-sun/java2d/FontSupport
-sun/java2d/InvalidPipeException
-sun/java2d/NullSurfaceData
-sun/java2d/StateTrackable
-sun/java2d/StateTrackable$State
-sun/java2d/StateTrackableDelegate
-sun/java2d/StateTrackableDelegate$1
-sun/java2d/StateTrackableDelegate$2
-sun/java2d/StateTracker
-sun/java2d/StateTracker$1
-sun/java2d/StateTracker$2
-sun/java2d/SunGraphics2D
-sun/java2d/SunGraphicsEnvironment
-sun/java2d/SunGraphicsEnvironment$1
-sun/java2d/Surface
-sun/java2d/SurfaceData
-sun/java2d/SurfaceData$PixelToPgramLoopConverter
-sun/java2d/SurfaceData$PixelToShapeLoopConverter
-sun/java2d/SurfaceDataProxy
-sun/java2d/SurfaceDataProxy$1
-sun/java2d/SurfaceManagerFactory
-sun/java2d/UnixSurfaceManagerFactory
-sun/java2d/cmm/CMSManager
-sun/java2d/cmm/ProfileActivator
-sun/java2d/cmm/ProfileDeferralInfo
-sun/java2d/cmm/ProfileDeferralMgr
-sun/java2d/jules/JulesPathBuf
-sun/java2d/jules/JulesPathBuf$1
-sun/java2d/loops/Blit
-sun/java2d/loops/BlitBg
-sun/java2d/loops/CompositeType
-sun/java2d/loops/CustomComponent
-sun/java2d/loops/DrawGlyphList
-sun/java2d/loops/DrawGlyphListAA
-sun/java2d/loops/DrawGlyphListLCD
-sun/java2d/loops/DrawLine
-sun/java2d/loops/DrawParallelogram
-sun/java2d/loops/DrawPath
-sun/java2d/loops/DrawPolygons
-sun/java2d/loops/DrawRect
-sun/java2d/loops/FillParallelogram
-sun/java2d/loops/FillPath
-sun/java2d/loops/FillRect
-sun/java2d/loops/FillSpans
-sun/java2d/loops/FontInfo
-sun/java2d/loops/GeneralRenderer
-sun/java2d/loops/GraphicsPrimitive
-sun/java2d/loops/GraphicsPrimitiveMgr
-sun/java2d/loops/GraphicsPrimitiveMgr$1
-sun/java2d/loops/GraphicsPrimitiveMgr$2
-sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec
-sun/java2d/loops/GraphicsPrimitiveProxy
-sun/java2d/loops/MaskBlit
-sun/java2d/loops/MaskFill
-sun/java2d/loops/ProcessPath
-sun/java2d/loops/ProcessPath$1
-sun/java2d/loops/ProcessPath$ActiveEdgeList
-sun/java2d/loops/ProcessPath$DrawHandler
-sun/java2d/loops/ProcessPath$Edge
-sun/java2d/loops/ProcessPath$EndSubPathHandler
-sun/java2d/loops/ProcessPath$FillData
-sun/java2d/loops/ProcessPath$FillProcessHandler
-sun/java2d/loops/ProcessPath$Point
-sun/java2d/loops/ProcessPath$ProcessHandler
-sun/java2d/loops/RenderCache
-sun/java2d/loops/RenderCache$Entry
-sun/java2d/loops/RenderLoops
-sun/java2d/loops/ScaledBlit
-sun/java2d/loops/SurfaceType
-sun/java2d/loops/TransformBlit
-sun/java2d/loops/TransformHelper
-sun/java2d/loops/XORComposite
-sun/java2d/opengl/GLXGraphicsConfig
-sun/java2d/opengl/OGLGraphicsConfig
-sun/java2d/pipe/AAShapePipe
-sun/java2d/pipe/AATextRenderer
-sun/java2d/pipe/AlphaColorPipe
-sun/java2d/pipe/AlphaPaintPipe
-sun/java2d/pipe/CompositePipe
-sun/java2d/pipe/DrawImage
-sun/java2d/pipe/DrawImagePipe
-sun/java2d/pipe/GeneralCompositePipe
-sun/java2d/pipe/GlyphListLoopPipe
-sun/java2d/pipe/GlyphListPipe
-sun/java2d/pipe/LCDTextRenderer
-sun/java2d/pipe/LoopBasedPipe
-sun/java2d/pipe/LoopPipe
-sun/java2d/pipe/NullPipe
-sun/java2d/pipe/OutlineTextRenderer
-sun/java2d/pipe/ParallelogramPipe
-sun/java2d/pipe/PixelDrawPipe
-sun/java2d/pipe/PixelFillPipe
-sun/java2d/pipe/PixelToParallelogramConverter
-sun/java2d/pipe/PixelToShapeConverter
-sun/java2d/pipe/Region
-sun/java2d/pipe/Region$ImmutableRegion
-sun/java2d/pipe/RegionIterator
-sun/java2d/pipe/RenderingEngine
-sun/java2d/pipe/RenderingEngine$1
-sun/java2d/pipe/ShapeDrawPipe
-sun/java2d/pipe/SolidTextRenderer
-sun/java2d/pipe/SpanClipRenderer
-sun/java2d/pipe/SpanShapeRenderer
-sun/java2d/pipe/SpanShapeRenderer$Composite
-sun/java2d/pipe/TextPipe
-sun/java2d/pipe/TextRenderer
-sun/java2d/pipe/ValidatePipe
-sun/java2d/pipe/hw/AccelGraphicsConfig
-sun/java2d/pipe/hw/BufferedContextProvider
-sun/java2d/x11/X11SurfaceData
-sun/java2d/x11/X11SurfaceData$LazyPipe
-sun/java2d/x11/XSurfaceData
-sun/java2d/xr/DirtyRegion
-sun/java2d/xr/GrowableEltArray
-sun/java2d/xr/GrowableIntArray
-sun/java2d/xr/GrowableRectArray
-sun/java2d/xr/MaskTile
-sun/java2d/xr/MaskTileManager
-sun/java2d/xr/MutableInteger
-sun/java2d/xr/XRBackend
-sun/java2d/xr/XRBackendNative
-sun/java2d/xr/XRColor
-sun/java2d/xr/XRCompositeManager
-sun/java2d/xr/XRCompositeManager$1
-sun/java2d/xr/XRDrawImage
-sun/java2d/xr/XRDrawLine
-sun/java2d/xr/XRGraphicsConfig
-sun/java2d/xr/XRMaskBlit
-sun/java2d/xr/XRMaskFill
-sun/java2d/xr/XRMaskImage
-sun/java2d/xr/XRPMBlit
-sun/java2d/xr/XRPMBlitLoops
-sun/java2d/xr/XRPMScaledBlit
-sun/java2d/xr/XRPMTransformedBlit
-sun/java2d/xr/XRPaints
-sun/java2d/xr/XRPaints$XRGradient
-sun/java2d/xr/XRPaints$XRLinearGradient
-sun/java2d/xr/XRPaints$XRRadialGradient
-sun/java2d/xr/XRPaints$XRTexture
-sun/java2d/xr/XRRenderer
-sun/java2d/xr/XRRenderer$XRDrawHandler
-sun/java2d/xr/XRSolidSrcPict
-sun/java2d/xr/XRSurfaceData
-sun/java2d/xr/XRSurfaceData$XRInternalSurfaceData
-sun/java2d/xr/XRSurfaceData$XRPixmapSurfaceData
-sun/java2d/xr/XRSurfaceData$XRWindowSurfaceData
-sun/java2d/xr/XRSurfaceDataProxy
-sun/java2d/xr/XRUtils
-sun/java2d/xr/XRVolatileSurfaceManager
-sun/java2d/xr/XrSwToPMBlit
-sun/java2d/xr/XrSwToPMScaledBlit
-sun/java2d/xr/XrSwToPMTransformedBlit
-sun/launcher/LauncherHelper
-sun/launcher/LauncherHelper$FXHelper
-sun/misc/ASCIICaseInsensitiveComparator
-sun/misc/Cleaner
-sun/misc/CompoundEnumeration
-sun/misc/ExtensionDependency
-sun/misc/FDBigInteger
-sun/misc/FileURLMapper
-sun/misc/FloatingDecimal
-sun/misc/FloatingDecimal$1
-sun/misc/FloatingDecimal$ASCIIToBinaryBuffer
-sun/misc/FloatingDecimal$ASCIIToBinaryConverter
-sun/misc/FloatingDecimal$BinaryToASCIIBuffer
-sun/misc/FloatingDecimal$BinaryToASCIIConverter
-sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
-sun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer
-sun/misc/IOUtils
-sun/misc/JarIndex
-sun/misc/JavaAWTAccess
-sun/misc/JavaIOFileDescriptorAccess
-sun/misc/JavaLangAccess
-sun/misc/JavaNetAccess
-sun/misc/JavaNioAccess
-sun/misc/JavaSecurityAccess
-sun/misc/JavaSecurityProtectionDomainAccess
-sun/misc/JavaUtilJarAccess
-sun/misc/JavaUtilZipFileAccess
-sun/misc/Launcher
-sun/misc/Launcher$AppClassLoader
-sun/misc/Launcher$AppClassLoader$1
-sun/misc/Launcher$BootClassPathHolder
-sun/misc/Launcher$BootClassPathHolder$1
-sun/misc/Launcher$ExtClassLoader
-sun/misc/Launcher$ExtClassLoader$1
-sun/misc/Launcher$Factory
-sun/misc/MetaIndex
-sun/misc/NativeSignalHandler
-sun/misc/OSEnvironment
-sun/misc/Perf
-sun/misc/Perf$GetPerfAction
-sun/misc/PerfCounter
-sun/misc/PerfCounter$CoreCounters
-sun/misc/PerformanceLogger
-sun/misc/PerformanceLogger$TimeData
-sun/misc/PostVMInitHook
-sun/misc/Resource
-sun/misc/SharedSecrets
-sun/misc/Signal
-sun/misc/SignalHandler
-sun/misc/SoftCache
-sun/misc/SoftCache$ValueCell
-sun/misc/URLClassPath
-sun/misc/URLClassPath$1
-sun/misc/URLClassPath$2
-sun/misc/URLClassPath$3
-sun/misc/URLClassPath$FileLoader
-sun/misc/URLClassPath$JarLoader
-sun/misc/URLClassPath$JarLoader$1
-sun/misc/URLClassPath$JarLoader$2
-sun/misc/URLClassPath$Loader
-sun/misc/Unsafe
-sun/misc/VM
-sun/misc/Version
-sun/net/DefaultProgressMeteringPolicy
-sun/net/InetAddressCachePolicy
-sun/net/InetAddressCachePolicy$1
-sun/net/InetAddressCachePolicy$2
-sun/net/NetHooks
-sun/net/NetHooks$Provider
-sun/net/NetProperties
-sun/net/NetProperties$1
-sun/net/ProgressMeteringPolicy
-sun/net/ProgressMonitor
-sun/net/ResourceManager
-sun/net/sdp/SdpProvider
-sun/net/spi/DefaultProxySelector
-sun/net/spi/DefaultProxySelector$1
-sun/net/spi/DefaultProxySelector$3
-sun/net/spi/DefaultProxySelector$NonProxyInfo
-sun/net/spi/nameservice/NameService
-sun/net/util/IPAddressUtil
-sun/net/util/URLUtil
-sun/net/www/MessageHeader
-sun/net/www/MimeEntry
-sun/net/www/MimeTable
-sun/net/www/MimeTable$1
-sun/net/www/MimeTable$DefaultInstanceHolder
-sun/net/www/MimeTable$DefaultInstanceHolder$1
-sun/net/www/ParseUtil
-sun/net/www/URLConnection
-sun/net/www/protocol/file/FileURLConnection
-sun/net/www/protocol/file/Handler
-sun/net/www/protocol/http/Handler
-sun/net/www/protocol/jar/Handler
-sun/net/www/protocol/jar/JarFileFactory
-sun/net/www/protocol/jar/JarURLConnection
-sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream
-sun/net/www/protocol/jar/URLJarFile
-sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController
-sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry
-sun/nio/ByteBuffered
-sun/nio/ch/DirectBuffer
-sun/nio/ch/FileChannelImpl
-sun/nio/ch/FileChannelImpl$Unmapper
-sun/nio/ch/FileDispatcher
-sun/nio/ch/FileDispatcherImpl
-sun/nio/ch/IOStatus
-sun/nio/ch/IOUtil
-sun/nio/ch/IOUtil$1
-sun/nio/ch/Interruptible
-sun/nio/ch/NativeDispatcher
-sun/nio/ch/NativeThread
-sun/nio/ch/NativeThreadSet
-sun/nio/ch/Util
-sun/nio/ch/Util$1
-sun/nio/ch/Util$4
-sun/nio/ch/Util$BufferCache
-sun/nio/cs/AbstractCharsetProvider
-sun/nio/cs/ArrayDecoder
-sun/nio/cs/ArrayEncoder
-sun/nio/cs/FastCharsetProvider
-sun/nio/cs/HistoricallyNamedCharset
-sun/nio/cs/ISO_8859_1
-sun/nio/cs/ISO_8859_1$Decoder
-sun/nio/cs/ISO_8859_1$Encoder
-sun/nio/cs/StandardCharsets
-sun/nio/cs/StandardCharsets$Aliases
-sun/nio/cs/StandardCharsets$Cache
-sun/nio/cs/StandardCharsets$Classes
-sun/nio/cs/StreamDecoder
-sun/nio/cs/StreamEncoder
-sun/nio/cs/Surrogate
-sun/nio/cs/Surrogate$Parser
-sun/nio/cs/US_ASCII
-sun/nio/cs/US_ASCII$Decoder
-sun/nio/cs/UTF_16
-sun/nio/cs/UTF_16$Decoder
-sun/nio/cs/UTF_16BE
-sun/nio/cs/UTF_16LE
-sun/nio/cs/UTF_8
-sun/nio/cs/UTF_8$Decoder
-sun/nio/cs/UTF_8$Encoder
-sun/nio/cs/Unicode
-sun/nio/cs/UnicodeDecoder
-sun/nio/cs/ext/DelegatableDecoder
-sun/nio/cs/ext/DoubleByte
-sun/nio/cs/ext/DoubleByte$Decoder
-sun/nio/cs/ext/EUC_KR
-sun/nio/cs/ext/ExtendedCharsets
-sun/print/PrinterGraphicsConfig
-sun/reflect/AccessorGenerator
-sun/reflect/BootstrapConstructorAccessorImpl
-sun/reflect/ByteVector
-sun/reflect/ByteVectorFactory
-sun/reflect/ByteVectorImpl
-sun/reflect/CallerSensitive
-sun/reflect/ClassDefiner
-sun/reflect/ClassDefiner$1
-sun/reflect/ClassFileAssembler
-sun/reflect/ClassFileConstants
-sun/reflect/ConstantPool
-sun/reflect/ConstructorAccessor
-sun/reflect/ConstructorAccessorImpl
-sun/reflect/DelegatingClassLoader
-sun/reflect/DelegatingConstructorAccessorImpl
-sun/reflect/DelegatingMethodAccessorImpl
-sun/reflect/FieldAccessor
-sun/reflect/FieldAccessorImpl
-sun/reflect/Label
-sun/reflect/Label$PatchInfo
-sun/reflect/LangReflectAccess
-sun/reflect/MagicAccessorImpl
-sun/reflect/MethodAccessor
-sun/reflect/MethodAccessorGenerator
-sun/reflect/MethodAccessorGenerator$1
-sun/reflect/MethodAccessorImpl
-sun/reflect/NativeConstructorAccessorImpl
-sun/reflect/NativeMethodAccessorImpl
-sun/reflect/Reflection
-sun/reflect/ReflectionFactory
-sun/reflect/ReflectionFactory$1
-sun/reflect/ReflectionFactory$GetReflectionFactoryAction
-sun/reflect/SerializationConstructorAccessorImpl
-sun/reflect/UTF8
-sun/reflect/UnsafeFieldAccessorFactory
-sun/reflect/UnsafeFieldAccessorImpl
-sun/reflect/UnsafeObjectFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl
-sun/reflect/UnsafeStaticFieldAccessorImpl
-sun/reflect/annotation/AnnotationType
-sun/reflect/generics/repository/AbstractRepository
-sun/reflect/generics/repository/ClassRepository
-sun/reflect/generics/repository/GenericDeclRepository
-sun/reflect/misc/MethodUtil
-sun/reflect/misc/MethodUtil$1
-sun/reflect/misc/ReflectUtil
-sun/security/action/GetBooleanAction
-sun/security/action/GetIntegerAction
-sun/security/action/GetPropertyAction
-sun/security/action/PutAllAction
-sun/security/jca/GetInstance
-sun/security/jca/GetInstance$Instance
-sun/security/jca/ProviderConfig
-sun/security/jca/ProviderConfig$1
-sun/security/jca/ProviderConfig$2
-sun/security/jca/ProviderConfig$3
-sun/security/jca/ProviderList
-sun/security/jca/ProviderList$1
-sun/security/jca/ProviderList$2
-sun/security/jca/ProviderList$3
-sun/security/jca/ProviderList$ServiceList
-sun/security/jca/ProviderList$ServiceList$1
-sun/security/jca/Providers
-sun/security/jca/ServiceId
-sun/security/pkcs/ContentInfo
-sun/security/pkcs/PKCS7
-sun/security/pkcs/PKCS8Key
-sun/security/pkcs/PKCS9Attribute
-sun/security/pkcs/SignerInfo
-sun/security/provider/ByteArrayAccess
-sun/security/provider/DSAKeyFactory
-sun/security/provider/DSAParameters
-sun/security/provider/DSAPublicKey
-sun/security/provider/DSAPublicKeyImpl
-sun/security/provider/DigestBase
-sun/security/provider/NativePRNG
-sun/security/provider/NativePRNG$1
-sun/security/provider/NativePRNG$2
-sun/security/provider/NativePRNG$Blocking
-sun/security/provider/NativePRNG$NonBlocking
-sun/security/provider/NativePRNG$RandomIO
-sun/security/provider/NativePRNG$Variant
-sun/security/provider/SHA2
-sun/security/provider/SHA2$SHA256
-sun/security/provider/Sun
-sun/security/provider/SunEntries
-sun/security/provider/SunEntries$1
-sun/security/provider/X509Factory
-sun/security/provider/certpath/X509CertPath
-sun/security/rsa/RSACore
-sun/security/rsa/RSAKeyFactory
-sun/security/rsa/RSAPadding
-sun/security/rsa/RSAPrivateCrtKeyImpl
-sun/security/rsa/RSAPrivateKeyImpl
-sun/security/rsa/RSAPublicKeyImpl
-sun/security/rsa/RSASignature
-sun/security/rsa/RSASignature$SHA256withRSA
-sun/security/rsa/SunRsaSign
-sun/security/rsa/SunRsaSignEntries
-sun/security/util/BitArray
-sun/security/util/ByteArrayLexOrder
-sun/security/util/ByteArrayTagOrder
-sun/security/util/Cache
-sun/security/util/Cache$EqualByteArray
-sun/security/util/Debug
-sun/security/util/DerEncoder
-sun/security/util/DerIndefLenConverter
-sun/security/util/DerInputBuffer
-sun/security/util/DerInputStream
-sun/security/util/DerOutputStream
-sun/security/util/DerValue
-sun/security/util/Length
-sun/security/util/ManifestDigester
-sun/security/util/ManifestDigester$Entry
-sun/security/util/ManifestDigester$Position
-sun/security/util/ManifestEntryVerifier
-sun/security/util/ManifestEntryVerifier$SunProviderHolder
-sun/security/util/MemoryCache
-sun/security/util/MemoryCache$CacheEntry
-sun/security/util/MemoryCache$HardCacheEntry
-sun/security/util/MemoryCache$SoftCacheEntry
-sun/security/util/ObjectIdentifier
-sun/security/util/PropertyExpander
-sun/security/util/SignatureFileVerifier
-sun/security/x509/AVA
-sun/security/x509/AVAKeyword
-sun/security/x509/AlgorithmId
-sun/security/x509/AuthorityKeyIdentifierExtension
-sun/security/x509/BasicConstraintsExtension
-sun/security/x509/CertAttrSet
-sun/security/x509/CertificateAlgorithmId
-sun/security/x509/CertificateExtensions
-sun/security/x509/CertificateSerialNumber
-sun/security/x509/CertificateValidity
-sun/security/x509/CertificateVersion
-sun/security/x509/CertificateX509Key
-sun/security/x509/Extension
-sun/security/x509/GeneralName
-sun/security/x509/GeneralNameInterface
-sun/security/x509/GeneralNames
-sun/security/x509/KeyIdentifier
-sun/security/x509/KeyUsageExtension
-sun/security/x509/NetscapeCertTypeExtension
-sun/security/x509/NetscapeCertTypeExtension$MapEntry
-sun/security/x509/OIDMap
-sun/security/x509/OIDMap$OIDInfo
-sun/security/x509/PKIXExtensions
-sun/security/x509/RDN
-sun/security/x509/RFC822Name
-sun/security/x509/SerialNumber
-sun/security/x509/SubjectAlternativeNameExtension
-sun/security/x509/SubjectKeyIdentifierExtension
-sun/security/x509/X500Name
-sun/security/x509/X500Name$1
-sun/security/x509/X509AttributeName
-sun/security/x509/X509CertImpl
-sun/security/x509/X509CertInfo
-sun/security/x509/X509Key
-sun/swing/DefaultLookup
-sun/swing/ImageIconUIResource
-sun/swing/JLightweightFrame
-sun/swing/MenuItemLayoutHelper
-sun/swing/MenuItemLayoutHelper$ColumnAlignment
-sun/swing/MenuItemLayoutHelper$LayoutResult
-sun/swing/MenuItemLayoutHelper$RectSize
-sun/swing/PrintColorUIResource
-sun/swing/StringUIClientPropertyKey
-sun/swing/SwingAccessor
-sun/swing/SwingAccessor$JTextComponentAccessor
-sun/swing/SwingLazyValue
-sun/swing/SwingLazyValue$1
-sun/swing/SwingUtilities2
-sun/swing/SwingUtilities2$2
-sun/swing/SwingUtilities2$AATextInfo
-sun/swing/SwingUtilities2$LSBCacheEntry
-sun/swing/UIAction
-sun/swing/UIClientPropertyKey
-sun/swing/table/DefaultTableCellHeaderRenderer
-sun/swing/table/DefaultTableCellHeaderRenderer$EmptyIcon
-sun/text/ComposedCharIter
-sun/text/IntHashtable
-sun/text/UCompactIntArray
-sun/text/normalizer/CharTrie
-sun/text/normalizer/CharTrie$FriendAgent
-sun/text/normalizer/ICUBinary
-sun/text/normalizer/ICUBinary$Authenticate
-sun/text/normalizer/ICUData
-sun/text/normalizer/IntTrie
-sun/text/normalizer/NormalizerBase
-sun/text/normalizer/NormalizerBase$1
-sun/text/normalizer/NormalizerBase$Mode
-sun/text/normalizer/NormalizerBase$NFCMode
-sun/text/normalizer/NormalizerBase$NFDMode
-sun/text/normalizer/NormalizerBase$NFKCMode
-sun/text/normalizer/NormalizerBase$NFKDMode
-sun/text/normalizer/NormalizerBase$QuickCheckResult
-sun/text/normalizer/NormalizerDataReader
-sun/text/normalizer/NormalizerImpl
-sun/text/normalizer/NormalizerImpl$AuxTrieImpl
-sun/text/normalizer/NormalizerImpl$DecomposeArgs
-sun/text/normalizer/NormalizerImpl$FCDTrieImpl
-sun/text/normalizer/NormalizerImpl$NormTrieImpl
-sun/text/normalizer/Trie
-sun/text/normalizer/Trie$DataManipulate
-sun/text/normalizer/UTF16
-sun/text/normalizer/UnicodeMatcher
-sun/text/normalizer/UnicodeSet
-sun/text/resources/CollationData
-sun/text/resources/FormatData
-sun/text/resources/en/FormatData_en
-sun/text/resources/en/FormatData_en_US
-sun/util/CoreResourceBundleControl
-sun/util/PreHashedMap
-sun/util/ResourceBundleEnumeration
-sun/util/calendar/AbstractCalendar
-sun/util/calendar/BaseCalendar
-sun/util/calendar/BaseCalendar$Date
-sun/util/calendar/CalendarDate
-sun/util/calendar/CalendarSystem
-sun/util/calendar/CalendarUtils
-sun/util/calendar/Gregorian
-sun/util/calendar/Gregorian$Date
-sun/util/calendar/ZoneInfo
-sun/util/calendar/ZoneInfoFile
-sun/util/calendar/ZoneInfoFile$1
-sun/util/calendar/ZoneInfoFile$Checksum
-sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule
-sun/util/locale/BaseLocale
-sun/util/locale/BaseLocale$Cache
-sun/util/locale/BaseLocale$Key
-sun/util/locale/LanguageTag
-sun/util/locale/LocaleObjectCache
-sun/util/locale/LocaleObjectCache$CacheEntry
-sun/util/locale/LocaleUtils
-sun/util/locale/provider/AuxLocaleProviderAdapter
-sun/util/locale/provider/AuxLocaleProviderAdapter$NullProvider
-sun/util/locale/provider/AvailableLanguageTags
-sun/util/locale/provider/CalendarDataProviderImpl
-sun/util/locale/provider/CalendarDataUtility
-sun/util/locale/provider/CalendarDataUtility$CalendarWeekParameterGetter
-sun/util/locale/provider/CalendarProviderImpl
-sun/util/locale/provider/CollatorProviderImpl
-sun/util/locale/provider/CurrencyNameProviderImpl
-sun/util/locale/provider/DateFormatSymbolsProviderImpl
-sun/util/locale/provider/DecimalFormatSymbolsProviderImpl
-sun/util/locale/provider/JRELocaleProviderAdapter
-sun/util/locale/provider/JRELocaleProviderAdapter$1
-sun/util/locale/provider/LocaleDataMetaInfo
-sun/util/locale/provider/LocaleProviderAdapter
-sun/util/locale/provider/LocaleProviderAdapter$1
-sun/util/locale/provider/LocaleProviderAdapter$Type
-sun/util/locale/provider/LocaleResources
-sun/util/locale/provider/LocaleResources$ResourceReference
-sun/util/locale/provider/LocaleServiceProviderPool
-sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter
-sun/util/locale/provider/NumberFormatProviderImpl
-sun/util/locale/provider/ResourceBundleBasedAdapter
-sun/util/locale/provider/SPILocaleProviderAdapter
-sun/util/locale/provider/SPILocaleProviderAdapter$1
-sun/util/locale/provider/TimeZoneNameProviderImpl
-sun/util/locale/provider/TimeZoneNameUtility
-sun/util/locale/provider/TimeZoneNameUtility$TimeZoneNameGetter
-sun/util/logging/LoggingProxy
-sun/util/logging/LoggingSupport
-sun/util/logging/LoggingSupport$1
-sun/util/logging/LoggingSupport$2
-sun/util/logging/PlatformLogger
-sun/util/logging/PlatformLogger$1
-sun/util/logging/PlatformLogger$DefaultLoggerProxy
-sun/util/logging/PlatformLogger$JavaLoggerProxy
-sun/util/logging/PlatformLogger$Level
-sun/util/logging/PlatformLogger$LoggerProxy
-sun/util/logging/resources/logging
-sun/util/resources/CalendarData
-sun/util/resources/CurrencyNames
-sun/util/resources/LocaleData
-sun/util/resources/LocaleData$1
-sun/util/resources/LocaleData$LocaleDataResourceBundleControl
-sun/util/resources/LocaleNamesBundle
-sun/util/resources/OpenListResourceBundle
-sun/util/resources/ParallelListResourceBundle
-sun/util/resources/ParallelListResourceBundle$KeySet
-sun/util/resources/TimeZoneNames
-sun/util/resources/TimeZoneNamesBundle
-sun/util/resources/en/CalendarData_en
-sun/util/resources/en/CurrencyNames_en_US
-sun/util/resources/en/TimeZoneNames_en
-sun/util/spi/CalendarProvider
-# fcfd7386dfd2b3ad
--- a/jdk/make/data/classlist/classlist.windows	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2378 +0,0 @@
-com/sun/java/swing/SwingUtilities3
-com/sun/java/swing/plaf/windows/WindowsPopupWindow
-com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI
-com/sun/swing/internal/plaf/basic/resources/basic
-com/sun/swing/internal/plaf/metal/resources/metal
-java/applet/Applet
-java/awt/AWTEvent
-java/awt/AWTEvent$1
-java/awt/AWTEventMulticaster
-java/awt/AWTKeyStroke
-java/awt/AWTKeyStroke$1
-java/awt/ActiveEvent
-java/awt/Adjustable
-java/awt/AlphaComposite
-java/awt/BasicStroke
-java/awt/BorderLayout
-java/awt/BufferCapabilities
-java/awt/Canvas
-java/awt/CardLayout
-java/awt/CardLayout$Card
-java/awt/Color
-java/awt/Component
-java/awt/Component$1
-java/awt/Component$3
-java/awt/Component$AWTTreeLock
-java/awt/Component$AccessibleAWTComponent
-java/awt/Component$BaselineResizeBehavior
-java/awt/Component$BltBufferStrategy
-java/awt/Component$BltSubRegionBufferStrategy
-java/awt/Component$DummyRequestFocusController
-java/awt/Component$FlipBufferStrategy
-java/awt/ComponentOrientation
-java/awt/Composite
-java/awt/Conditional
-java/awt/Container
-java/awt/Container$1
-java/awt/Container$AccessibleAWTContainer
-java/awt/ContainerOrderFocusTraversalPolicy
-java/awt/Cursor
-java/awt/Cursor$1
-java/awt/Cursor$CursorDisposer
-java/awt/DefaultFocusTraversalPolicy
-java/awt/DefaultKeyboardFocusManager
-java/awt/DefaultKeyboardFocusManager$1
-java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent
-java/awt/DefaultKeyboardFocusManager$TypeAheadMarker
-java/awt/Dialog
-java/awt/Dialog$ModalExclusionType
-java/awt/Dialog$ModalityType
-java/awt/Dimension
-java/awt/Event
-java/awt/EventDispatchThread
-java/awt/EventDispatchThread$1
-java/awt/EventDispatchThread$HierarchyEventFilter
-java/awt/EventFilter
-java/awt/EventFilter$FilterAction
-java/awt/EventQueue
-java/awt/EventQueue$1
-java/awt/EventQueue$1AWTInvocationLock
-java/awt/EventQueue$2
-java/awt/EventQueue$3
-java/awt/EventQueue$4
-java/awt/EventQueue$5
-java/awt/FlowLayout
-java/awt/FocusTraversalPolicy
-java/awt/Font
-java/awt/Font$FontAccessImpl
-java/awt/FontMetrics
-java/awt/Frame
-java/awt/Frame$1
-java/awt/Graphics
-java/awt/Graphics2D
-java/awt/GraphicsCallback
-java/awt/GraphicsCallback$PaintCallback
-java/awt/GraphicsConfiguration
-java/awt/GraphicsDevice
-java/awt/GraphicsEnvironment
-java/awt/GraphicsEnvironment$1
-java/awt/GridLayout
-java/awt/Image
-java/awt/Image$1
-java/awt/ImageCapabilities
-java/awt/ImageMediaEntry
-java/awt/Insets
-java/awt/ItemSelectable
-java/awt/KeyEventDispatcher
-java/awt/KeyEventPostProcessor
-java/awt/KeyboardFocusManager
-java/awt/KeyboardFocusManager$1
-java/awt/KeyboardFocusManager$3
-java/awt/KeyboardFocusManager$HeavyweightFocusRequest
-java/awt/KeyboardFocusManager$LightweightFocusRequest
-java/awt/Label
-java/awt/LayoutManager
-java/awt/LayoutManager2
-java/awt/LightweightDispatcher
-java/awt/LightweightDispatcher$2
-java/awt/MediaEntry
-java/awt/MediaTracker
-java/awt/MenuBar
-java/awt/MenuComponent
-java/awt/MenuContainer
-java/awt/ModalEventFilter
-java/awt/Paint
-java/awt/Panel
-java/awt/Point
-java/awt/PrintGraphics
-java/awt/Queue
-java/awt/Rectangle
-java/awt/RenderingHints
-java/awt/RenderingHints$Key
-java/awt/SentEvent
-java/awt/SequencedEvent
-java/awt/SequencedEvent$1
-java/awt/Shape
-java/awt/SplashScreen
-java/awt/Stroke
-java/awt/Toolkit
-java/awt/Toolkit$1
-java/awt/Toolkit$2
-java/awt/Toolkit$3
-java/awt/Toolkit$4
-java/awt/Toolkit$5
-java/awt/Toolkit$DesktopPropertyChangeSupport
-java/awt/Toolkit$DesktopPropertyChangeSupport$1
-java/awt/Toolkit$SelectiveAWTEventListener
-java/awt/Toolkit$ToolkitEventMulticaster
-java/awt/Transparency
-java/awt/TrayIcon
-java/awt/VKCollection
-java/awt/Window
-java/awt/Window$1
-java/awt/Window$1DisposeAction
-java/awt/Window$Type
-java/awt/Window$WindowDisposerRecord
-java/awt/color/ColorSpace
-java/awt/color/ICC_ColorSpace
-java/awt/color/ICC_Profile
-java/awt/color/ICC_Profile$1
-java/awt/color/ICC_ProfileRGB
-java/awt/datatransfer/ClipboardOwner
-java/awt/datatransfer/FlavorMap
-java/awt/datatransfer/FlavorTable
-java/awt/datatransfer/SystemFlavorMap
-java/awt/dnd/DropTarget
-java/awt/dnd/DropTargetContext
-java/awt/dnd/DropTargetListener
-java/awt/dnd/peer/DragSourceContextPeer
-java/awt/dnd/peer/DropTargetPeer
-java/awt/event/AWTEventListener
-java/awt/event/AWTEventListenerProxy
-java/awt/event/ActionEvent
-java/awt/event/ActionListener
-java/awt/event/AdjustmentEvent
-java/awt/event/AdjustmentListener
-java/awt/event/ComponentAdapter
-java/awt/event/ComponentEvent
-java/awt/event/ComponentListener
-java/awt/event/ContainerEvent
-java/awt/event/ContainerListener
-java/awt/event/FocusAdapter
-java/awt/event/FocusEvent
-java/awt/event/FocusListener
-java/awt/event/HierarchyBoundsListener
-java/awt/event/HierarchyListener
-java/awt/event/InputEvent
-java/awt/event/InputEvent$1
-java/awt/event/InputMethodEvent
-java/awt/event/InputMethodListener
-java/awt/event/InvocationEvent
-java/awt/event/InvocationEvent$1
-java/awt/event/ItemEvent
-java/awt/event/ItemListener
-java/awt/event/KeyAdapter
-java/awt/event/KeyEvent
-java/awt/event/KeyEvent$1
-java/awt/event/KeyListener
-java/awt/event/MouseAdapter
-java/awt/event/MouseEvent
-java/awt/event/MouseListener
-java/awt/event/MouseMotionAdapter
-java/awt/event/MouseMotionListener
-java/awt/event/MouseWheelListener
-java/awt/event/NativeLibLoader
-java/awt/event/NativeLibLoader$1
-java/awt/event/PaintEvent
-java/awt/event/TextListener
-java/awt/event/WindowAdapter
-java/awt/event/WindowEvent
-java/awt/event/WindowFocusListener
-java/awt/event/WindowListener
-java/awt/event/WindowStateListener
-java/awt/font/FontRenderContext
-java/awt/font/GlyphVector
-java/awt/font/LineMetrics
-java/awt/font/TextAttribute
-java/awt/geom/AffineTransform
-java/awt/geom/Dimension2D
-java/awt/geom/GeneralPath
-java/awt/geom/Line2D
-java/awt/geom/Line2D$Float
-java/awt/geom/LineIterator
-java/awt/geom/Path2D
-java/awt/geom/Path2D$Float
-java/awt/geom/PathIterator
-java/awt/geom/Point2D
-java/awt/geom/Point2D$Float
-java/awt/geom/RectIterator
-java/awt/geom/Rectangle2D
-java/awt/geom/Rectangle2D$Float
-java/awt/geom/RectangularShape
-java/awt/im/InputContext
-java/awt/im/InputMethodRequests
-java/awt/im/spi/InputMethod
-java/awt/im/spi/InputMethodContext
-java/awt/im/spi/InputMethodDescriptor
-java/awt/image/BufferStrategy
-java/awt/image/BufferedImage
-java/awt/image/BufferedImage$1
-java/awt/image/ColorModel
-java/awt/image/ColorModel$1
-java/awt/image/ComponentSampleModel
-java/awt/image/DataBuffer
-java/awt/image/DataBuffer$1
-java/awt/image/DataBufferByte
-java/awt/image/DataBufferInt
-java/awt/image/DirectColorModel
-java/awt/image/FilteredImageSource
-java/awt/image/ImageConsumer
-java/awt/image/ImageFilter
-java/awt/image/ImageObserver
-java/awt/image/ImageProducer
-java/awt/image/IndexColorModel
-java/awt/image/PackedColorModel
-java/awt/image/PixelInterleavedSampleModel
-java/awt/image/RGBImageFilter
-java/awt/image/Raster
-java/awt/image/RenderedImage
-java/awt/image/SampleModel
-java/awt/image/SinglePixelPackedSampleModel
-java/awt/image/VolatileImage
-java/awt/image/WritableRaster
-java/awt/image/WritableRenderedImage
-java/awt/peer/CanvasPeer
-java/awt/peer/ComponentPeer
-java/awt/peer/ContainerPeer
-java/awt/peer/FontPeer
-java/awt/peer/FramePeer
-java/awt/peer/KeyboardFocusManagerPeer
-java/awt/peer/LabelPeer
-java/awt/peer/LightweightPeer
-java/awt/peer/PanelPeer
-java/awt/peer/WindowPeer
-java/awt/print/PrinterGraphics
-java/beans/ChangeListenerMap
-java/beans/PropertyChangeEvent
-java/beans/PropertyChangeListener
-java/beans/PropertyChangeListenerProxy
-java/beans/PropertyChangeSupport
-java/beans/PropertyChangeSupport$PropertyChangeListenerMap
-java/beans/VetoableChangeListener
-java/io/Bits
-java/io/BufferedInputStream
-java/io/BufferedOutputStream
-java/io/BufferedReader
-java/io/BufferedWriter
-java/io/ByteArrayInputStream
-java/io/ByteArrayOutputStream
-java/io/Closeable
-java/io/DataInput
-java/io/DataInputStream
-java/io/DataOutput
-java/io/DataOutputStream
-java/io/DefaultFileSystem
-java/io/EOFException
-java/io/ExpiringCache
-java/io/ExpiringCache$1
-java/io/ExpiringCache$Entry
-java/io/Externalizable
-java/io/File
-java/io/File$PathStatus
-java/io/FileDescriptor
-java/io/FileDescriptor$1
-java/io/FileInputStream
-java/io/FileInputStream$1
-java/io/FileNotFoundException
-java/io/FileOutputStream
-java/io/FileOutputStream$1
-java/io/FilePermission
-java/io/FilePermission$1
-java/io/FilePermissionCollection
-java/io/FileReader
-java/io/FileSystem
-java/io/FileWriter
-java/io/FilenameFilter
-java/io/FilterInputStream
-java/io/FilterOutputStream
-java/io/FilterReader
-java/io/Flushable
-java/io/IOException
-java/io/InputStream
-java/io/InputStreamReader
-java/io/InterruptedIOException
-java/io/ObjectInput
-java/io/ObjectInputStream
-java/io/ObjectInputStream$BlockDataInputStream
-java/io/ObjectInputStream$GetField
-java/io/ObjectInputStream$GetFieldImpl
-java/io/ObjectInputStream$HandleTable
-java/io/ObjectInputStream$HandleTable$HandleList
-java/io/ObjectInputStream$PeekInputStream
-java/io/ObjectInputStream$ValidationList
-java/io/ObjectOutput
-java/io/ObjectOutputStream
-java/io/ObjectOutputStream$BlockDataOutputStream
-java/io/ObjectOutputStream$HandleTable
-java/io/ObjectOutputStream$ReplaceTable
-java/io/ObjectStreamClass
-java/io/ObjectStreamClass$1
-java/io/ObjectStreamClass$2
-java/io/ObjectStreamClass$3
-java/io/ObjectStreamClass$4
-java/io/ObjectStreamClass$5
-java/io/ObjectStreamClass$Caches
-java/io/ObjectStreamClass$ClassDataSlot
-java/io/ObjectStreamClass$EntryFuture
-java/io/ObjectStreamClass$ExceptionInfo
-java/io/ObjectStreamClass$FieldReflector
-java/io/ObjectStreamClass$FieldReflectorKey
-java/io/ObjectStreamClass$MemberSignature
-java/io/ObjectStreamClass$WeakClassKey
-java/io/ObjectStreamConstants
-java/io/ObjectStreamField
-java/io/OutputStream
-java/io/OutputStreamWriter
-java/io/PrintStream
-java/io/PushbackInputStream
-java/io/RandomAccessFile
-java/io/RandomAccessFile$1
-java/io/Reader
-java/io/SerialCallbackContext
-java/io/Serializable
-java/io/StringReader
-java/io/StringWriter
-java/io/UnsupportedEncodingException
-java/io/WinNTFileSystem
-java/io/Writer
-java/lang/AbstractStringBuilder
-java/lang/Appendable
-java/lang/ApplicationShutdownHooks
-java/lang/ApplicationShutdownHooks$1
-java/lang/ArithmeticException
-java/lang/ArrayIndexOutOfBoundsException
-java/lang/ArrayStoreException
-java/lang/AutoCloseable
-java/lang/Boolean
-java/lang/BootstrapMethodError
-java/lang/Byte
-java/lang/CharSequence
-java/lang/Character
-java/lang/Character$CharacterCache
-java/lang/CharacterData
-java/lang/CharacterData00
-java/lang/CharacterDataLatin1
-java/lang/Class
-java/lang/Class$1
-java/lang/Class$3
-java/lang/Class$4
-java/lang/Class$AnnotationData
-java/lang/Class$Atomic
-java/lang/Class$ReflectionData
-java/lang/ClassCastException
-java/lang/ClassFormatError
-java/lang/ClassLoader
-java/lang/ClassLoader$2
-java/lang/ClassLoader$3
-java/lang/ClassLoader$NativeLibrary
-java/lang/ClassLoader$ParallelLoaders
-java/lang/ClassLoaderHelper
-java/lang/ClassNotFoundException
-java/lang/ClassValue$ClassValueMap
-java/lang/CloneNotSupportedException
-java/lang/Cloneable
-java/lang/Comparable
-java/lang/Compiler
-java/lang/Compiler$1
-java/lang/Double
-java/lang/Enum
-java/lang/Error
-java/lang/Exception
-java/lang/ExceptionInInitializerError
-java/lang/Float
-java/lang/IllegalAccessError
-java/lang/IllegalAccessException
-java/lang/IllegalArgumentException
-java/lang/IllegalMonitorStateException
-java/lang/IllegalStateException
-java/lang/IncompatibleClassChangeError
-java/lang/IndexOutOfBoundsException
-java/lang/InheritableThreadLocal
-java/lang/InstantiationException
-java/lang/Integer
-java/lang/Integer$IntegerCache
-java/lang/InternalError
-java/lang/InterruptedException
-java/lang/Iterable
-java/lang/LinkageError
-java/lang/Long
-java/lang/Long$LongCache
-java/lang/Math
-java/lang/NoClassDefFoundError
-java/lang/NoSuchFieldException
-java/lang/NoSuchMethodError
-java/lang/NoSuchMethodException
-java/lang/NullPointerException
-java/lang/Number
-java/lang/NumberFormatException
-java/lang/Object
-java/lang/OutOfMemoryError
-java/lang/Package
-java/lang/ProcessEnvironment
-java/lang/ProcessEnvironment$CheckedEntry
-java/lang/ProcessEnvironment$CheckedEntrySet
-java/lang/ProcessEnvironment$CheckedEntrySet$1
-java/lang/ProcessEnvironment$EntryComparator
-java/lang/ProcessEnvironment$NameComparator
-java/lang/Readable
-java/lang/ReflectiveOperationException
-java/lang/Runnable
-java/lang/Runtime
-java/lang/RuntimeException
-java/lang/RuntimePermission
-java/lang/SecurityException
-java/lang/SecurityManager
-java/lang/Short
-java/lang/Short$ShortCache
-java/lang/Shutdown
-java/lang/Shutdown$Lock
-java/lang/StackOverflowError
-java/lang/StackTraceElement
-java/lang/StrictMath
-java/lang/String
-java/lang/String$CaseInsensitiveComparator
-java/lang/StringBuffer
-java/lang/StringBuilder
-java/lang/StringCoding
-java/lang/StringCoding$StringDecoder
-java/lang/StringCoding$StringEncoder
-java/lang/StringIndexOutOfBoundsException
-java/lang/System
-java/lang/System$2
-java/lang/SystemClassLoaderAction
-java/lang/Terminator
-java/lang/Terminator$1
-java/lang/Thread
-java/lang/Thread$State
-java/lang/Thread$UncaughtExceptionHandler
-java/lang/ThreadDeath
-java/lang/ThreadGroup
-java/lang/ThreadLocal
-java/lang/ThreadLocal$ThreadLocalMap
-java/lang/ThreadLocal$ThreadLocalMap$Entry
-java/lang/Throwable
-java/lang/Throwable$PrintStreamOrWriter
-java/lang/Throwable$WrappedPrintStream
-java/lang/UnsatisfiedLinkError
-java/lang/UnsupportedOperationException
-java/lang/VirtualMachineError
-java/lang/Void
-java/lang/annotation/Annotation
-java/lang/invoke/CallSite
-java/lang/invoke/ConstantCallSite
-java/lang/invoke/DirectMethodHandle
-java/lang/invoke/Invokers
-java/lang/invoke/LambdaForm
-java/lang/invoke/LambdaForm$NamedFunction
-java/lang/invoke/MemberName
-java/lang/invoke/MemberName$Factory
-java/lang/invoke/MethodHandle
-java/lang/invoke/MethodHandleImpl
-java/lang/invoke/MethodHandleNatives
-java/lang/invoke/MethodHandleStatics
-java/lang/invoke/MethodHandleStatics$1
-java/lang/invoke/MethodType
-java/lang/invoke/MethodType$ConcurrentWeakInternSet
-java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry
-java/lang/invoke/MethodTypeForm
-java/lang/invoke/MutableCallSite
-java/lang/invoke/VolatileCallSite
-java/lang/ref/FinalReference
-java/lang/ref/Finalizer
-java/lang/ref/Finalizer$FinalizerThread
-java/lang/ref/PhantomReference
-java/lang/ref/Reference
-java/lang/ref/Reference$Lock
-java/lang/ref/Reference$ReferenceHandler
-java/lang/ref/ReferenceQueue
-java/lang/ref/ReferenceQueue$Lock
-java/lang/ref/ReferenceQueue$Null
-java/lang/ref/SoftReference
-java/lang/ref/WeakReference
-java/lang/reflect/AccessibleObject
-java/lang/reflect/AnnotatedElement
-java/lang/reflect/Array
-java/lang/reflect/Constructor
-java/lang/reflect/Executable
-java/lang/reflect/Field
-java/lang/reflect/GenericDeclaration
-java/lang/reflect/InvocationHandler
-java/lang/reflect/InvocationTargetException
-java/lang/reflect/Member
-java/lang/reflect/Method
-java/lang/reflect/Modifier
-java/lang/reflect/Parameter
-java/lang/reflect/Proxy
-java/lang/reflect/Proxy$KeyFactory
-java/lang/reflect/Proxy$ProxyClassFactory
-java/lang/reflect/ReflectAccess
-java/lang/reflect/ReflectPermission
-java/lang/reflect/Type
-java/lang/reflect/WeakCache
-java/math/BigInteger
-java/math/BigInteger$UnsafeHolder
-java/math/MutableBigInteger
-java/math/RoundingMode
-java/math/SignedMutableBigInteger
-java/net/AbstractPlainDatagramSocketImpl
-java/net/AbstractPlainDatagramSocketImpl$1
-java/net/AbstractPlainSocketImpl
-java/net/AbstractPlainSocketImpl$1
-java/net/Authenticator
-java/net/BindException
-java/net/ConnectException
-java/net/DatagramPacket
-java/net/DatagramPacket$1
-java/net/DatagramSocket
-java/net/DatagramSocket$1
-java/net/DatagramSocketImpl
-java/net/DefaultDatagramSocketImplFactory$1
-java/net/DefaultInterface
-java/net/DualStackPlainDatagramSocketImpl
-java/net/DualStackPlainSocketImpl
-java/net/FileNameMap
-java/net/HttpURLConnection
-java/net/Inet4Address
-java/net/Inet4AddressImpl
-java/net/Inet6Address
-java/net/Inet6Address$Inet6AddressHolder
-java/net/Inet6AddressImpl
-java/net/InetAddress
-java/net/InetAddress$1
-java/net/InetAddress$2
-java/net/InetAddress$Cache
-java/net/InetAddress$Cache$Type
-java/net/InetAddress$CacheEntry
-java/net/InetAddress$InetAddressHolder
-java/net/InetAddressImpl
-java/net/InetAddressImplFactory
-java/net/InetSocketAddress
-java/net/InetSocketAddress$InetSocketAddressHolder
-java/net/InterfaceAddress
-java/net/JarURLConnection
-java/net/MalformedURLException
-java/net/MulticastSocket
-java/net/NetworkInterface
-java/net/NetworkInterface$1
-java/net/NoRouteToHostException
-java/net/Parts
-java/net/PlainSocketImpl
-java/net/PlainSocketImpl$1
-java/net/Proxy
-java/net/Proxy$Type
-java/net/ProxySelector
-java/net/ServerSocket
-java/net/Socket
-java/net/SocketAddress
-java/net/SocketException
-java/net/SocketImpl
-java/net/SocketImplFactory
-java/net/SocketOptions
-java/net/SocketTimeoutException
-java/net/SocksConsts
-java/net/SocksSocketImpl
-java/net/SocksSocketImpl$3
-java/net/TwoStacksPlainDatagramSocketImpl
-java/net/URI
-java/net/URI$Parser
-java/net/URL
-java/net/URLClassLoader
-java/net/URLClassLoader$1
-java/net/URLClassLoader$2
-java/net/URLClassLoader$3
-java/net/URLClassLoader$3$1
-java/net/URLClassLoader$7
-java/net/URLConnection
-java/net/URLConnection$1
-java/net/URLStreamHandler
-java/net/URLStreamHandlerFactory
-java/net/UnknownHostException
-java/nio/Bits
-java/nio/Bits$1
-java/nio/Buffer
-java/nio/ByteBuffer
-java/nio/ByteBufferAsCharBufferB
-java/nio/ByteBufferAsIntBufferB
-java/nio/ByteBufferAsShortBufferB
-java/nio/ByteOrder
-java/nio/CharBuffer
-java/nio/DirectByteBuffer
-java/nio/DirectByteBuffer$Deallocator
-java/nio/DirectLongBufferU
-java/nio/HeapByteBuffer
-java/nio/HeapCharBuffer
-java/nio/IntBuffer
-java/nio/LongBuffer
-java/nio/MappedByteBuffer
-java/nio/ShortBuffer
-java/nio/channels/ByteChannel
-java/nio/channels/Channel
-java/nio/channels/FileChannel
-java/nio/channels/GatheringByteChannel
-java/nio/channels/InterruptibleChannel
-java/nio/channels/NetworkChannel
-java/nio/channels/ReadableByteChannel
-java/nio/channels/ScatteringByteChannel
-java/nio/channels/SeekableByteChannel
-java/nio/channels/SelectableChannel
-java/nio/channels/SocketChannel
-java/nio/channels/WritableByteChannel
-java/nio/channels/spi/AbstractInterruptibleChannel
-java/nio/channels/spi/AbstractInterruptibleChannel$1
-java/nio/channels/spi/AbstractSelectableChannel
-java/nio/charset/Charset
-java/nio/charset/CharsetDecoder
-java/nio/charset/CharsetEncoder
-java/nio/charset/CoderResult
-java/nio/charset/CoderResult$1
-java/nio/charset/CoderResult$2
-java/nio/charset/CoderResult$Cache
-java/nio/charset/CodingErrorAction
-java/nio/charset/StandardCharsets
-java/nio/charset/spi/CharsetProvider
-java/nio/file/Path
-java/nio/file/Watchable
-java/nio/file/attribute/FileAttribute
-java/security/AccessControlContext
-java/security/AccessController
-java/security/AlgorithmParameters
-java/security/AlgorithmParametersSpi
-java/security/AllPermission
-java/security/AllPermissionCollection
-java/security/BasicPermission
-java/security/BasicPermissionCollection
-java/security/CodeSigner
-java/security/CodeSource
-java/security/GeneralSecurityException
-java/security/Guard
-java/security/InvalidKeyException
-java/security/Key
-java/security/KeyException
-java/security/MessageDigest
-java/security/MessageDigest$Delegate
-java/security/MessageDigestSpi
-java/security/NoSuchAlgorithmException
-java/security/Permission
-java/security/PermissionCollection
-java/security/Permissions
-java/security/Principal
-java/security/PrivateKey
-java/security/PrivilegedAction
-java/security/PrivilegedActionException
-java/security/PrivilegedExceptionAction
-java/security/ProtectionDomain
-java/security/ProtectionDomain$1
-java/security/ProtectionDomain$3
-java/security/ProtectionDomain$Key
-java/security/Provider
-java/security/Provider$EngineDescription
-java/security/Provider$Service
-java/security/Provider$ServiceKey
-java/security/Provider$UString
-java/security/PublicKey
-java/security/SecureClassLoader
-java/security/Security
-java/security/Security$1
-java/security/Signature
-java/security/Signature$Delegate
-java/security/SignatureException
-java/security/SignatureSpi
-java/security/UnresolvedPermission
-java/security/cert/Certificate
-java/security/interfaces/DSAKey
-java/security/interfaces/DSAParams
-java/security/interfaces/DSAPrivateKey
-java/security/interfaces/DSAPublicKey
-java/security/spec/AlgorithmParameterSpec
-java/security/spec/DSAParameterSpec
-java/text/AttributedCharacterIterator$Attribute
-java/text/CharacterIterator
-java/text/Collator
-java/text/DateFormat
-java/text/DateFormat$Field
-java/text/DateFormatSymbols
-java/text/DecimalFormat
-java/text/DecimalFormatSymbols
-java/text/DigitList
-java/text/DontCareFieldPosition
-java/text/DontCareFieldPosition$1
-java/text/EntryPair
-java/text/FieldPosition
-java/text/Format
-java/text/Format$Field
-java/text/Format$FieldDelegate
-java/text/MergeCollation
-java/text/MessageFormat
-java/text/MessageFormat$Field
-java/text/NumberFormat
-java/text/NumberFormat$Field
-java/text/ParseException
-java/text/PatternEntry
-java/text/PatternEntry$Parser
-java/text/RBCollationTables
-java/text/RBCollationTables$BuildAPI
-java/text/RuleBasedCollator
-java/text/SimpleDateFormat
-java/text/spi/BreakIteratorProvider
-java/text/spi/CollatorProvider
-java/text/spi/DateFormatProvider
-java/text/spi/DateFormatSymbolsProvider
-java/text/spi/DecimalFormatSymbolsProvider
-java/text/spi/NumberFormatProvider
-java/util/AbstractCollection
-java/util/AbstractList
-java/util/AbstractList$Itr
-java/util/AbstractList$ListItr
-java/util/AbstractMap
-java/util/AbstractQueue
-java/util/AbstractSequentialList
-java/util/AbstractSet
-java/util/ArrayDeque
-java/util/ArrayList
-java/util/ArrayList$Itr
-java/util/ArrayList$ListItr
-java/util/ArrayList$SubList
-java/util/ArrayList$SubList$1
-java/util/Arrays
-java/util/Arrays$ArrayList
-java/util/Arrays$LegacyMergeSort
-java/util/BitSet
-java/util/Calendar
-java/util/Calendar$Builder
-java/util/Collection
-java/util/Collections
-java/util/Collections$3
-java/util/Collections$EmptyEnumeration
-java/util/Collections$EmptyIterator
-java/util/Collections$EmptyList
-java/util/Collections$EmptyMap
-java/util/Collections$EmptySet
-java/util/Collections$SetFromMap
-java/util/Collections$SynchronizedCollection
-java/util/Collections$SynchronizedMap
-java/util/Collections$SynchronizedSet
-java/util/Collections$UnmodifiableCollection
-java/util/Collections$UnmodifiableCollection$1
-java/util/Collections$UnmodifiableList
-java/util/Collections$UnmodifiableList$1
-java/util/Collections$UnmodifiableMap
-java/util/Collections$UnmodifiableRandomAccessList
-java/util/Collections$UnmodifiableSet
-java/util/ComparableTimSort
-java/util/Comparator
-java/util/Currency
-java/util/Currency$1
-java/util/Currency$CurrencyNameGetter
-java/util/Date
-java/util/Deque
-java/util/Dictionary
-java/util/Enumeration
-java/util/EventListener
-java/util/EventListenerProxy
-java/util/EventObject
-java/util/GregorianCalendar
-java/util/HashMap
-java/util/HashMap$EntryIterator
-java/util/HashMap$EntrySet
-java/util/HashMap$HashIterator
-java/util/HashMap$KeyIterator
-java/util/HashMap$KeySet
-java/util/HashMap$Node
-java/util/HashMap$TreeNode
-java/util/HashMap$ValueIterator
-java/util/HashMap$Values
-java/util/HashSet
-java/util/Hashtable
-java/util/Hashtable$Entry
-java/util/Hashtable$EntrySet
-java/util/Hashtable$Enumerator
-java/util/Hashtable$ValueCollection
-java/util/IdentityHashMap
-java/util/IdentityHashMap$IdentityHashMapIterator
-java/util/IdentityHashMap$KeyIterator
-java/util/IdentityHashMap$KeySet
-java/util/IdentityHashMap$ValueIterator
-java/util/IdentityHashMap$Values
-java/util/Iterator
-java/util/LinkedHashMap
-java/util/LinkedHashMap$Entry
-java/util/LinkedHashMap$LinkedEntryIterator
-java/util/LinkedHashMap$LinkedEntrySet
-java/util/LinkedHashMap$LinkedHashIterator
-java/util/LinkedHashMap$LinkedKeyIterator
-java/util/LinkedHashMap$LinkedKeySet
-java/util/LinkedList
-java/util/LinkedList$ListItr
-java/util/LinkedList$Node
-java/util/List
-java/util/ListIterator
-java/util/ListResourceBundle
-java/util/Locale
-java/util/Locale$1
-java/util/Locale$Cache
-java/util/Locale$Category
-java/util/Locale$LocaleKey
-java/util/Map
-java/util/Map$Entry
-java/util/MissingResourceException
-java/util/NavigableMap
-java/util/Objects
-java/util/PriorityQueue
-java/util/Properties
-java/util/Properties$LineReader
-java/util/PropertyResourceBundle
-java/util/Queue
-java/util/Random
-java/util/RandomAccess
-java/util/ResourceBundle
-java/util/ResourceBundle$1
-java/util/ResourceBundle$BundleReference
-java/util/ResourceBundle$CacheKey
-java/util/ResourceBundle$CacheKeyReference
-java/util/ResourceBundle$Control
-java/util/ResourceBundle$Control$1
-java/util/ResourceBundle$Control$CandidateListCache
-java/util/ResourceBundle$LoaderReference
-java/util/ResourceBundle$RBClassLoader
-java/util/ResourceBundle$RBClassLoader$1
-java/util/ResourceBundle$SingleFormatControl
-java/util/ServiceLoader
-java/util/ServiceLoader$1
-java/util/ServiceLoader$LazyIterator
-java/util/Set
-java/util/SortedMap
-java/util/Stack
-java/util/StringTokenizer
-java/util/TimSort
-java/util/TimeZone
-java/util/TimeZone$1
-java/util/TreeMap
-java/util/TreeMap$Entry
-java/util/Vector
-java/util/Vector$1
-java/util/Vector$Itr
-java/util/Vector$ListItr
-java/util/WeakHashMap
-java/util/WeakHashMap$Entry
-java/util/WeakHashMap$KeySet
-java/util/concurrent/BlockingQueue
-java/util/concurrent/ConcurrentHashMap
-java/util/concurrent/ConcurrentHashMap$BaseIterator
-java/util/concurrent/ConcurrentHashMap$CollectionView
-java/util/concurrent/ConcurrentHashMap$CounterCell
-java/util/concurrent/ConcurrentHashMap$EntrySetView
-java/util/concurrent/ConcurrentHashMap$ForwardingNode
-java/util/concurrent/ConcurrentHashMap$KeyIterator
-java/util/concurrent/ConcurrentHashMap$KeySetView
-java/util/concurrent/ConcurrentHashMap$Node
-java/util/concurrent/ConcurrentHashMap$Segment
-java/util/concurrent/ConcurrentHashMap$Traverser
-java/util/concurrent/ConcurrentHashMap$ValueIterator
-java/util/concurrent/ConcurrentHashMap$ValuesView
-java/util/concurrent/ConcurrentMap
-java/util/concurrent/CopyOnWriteArrayList
-java/util/concurrent/DelayQueue
-java/util/concurrent/Delayed
-java/util/concurrent/TimeUnit
-java/util/concurrent/TimeUnit$1
-java/util/concurrent/TimeUnit$2
-java/util/concurrent/TimeUnit$3
-java/util/concurrent/TimeUnit$4
-java/util/concurrent/TimeUnit$5
-java/util/concurrent/TimeUnit$6
-java/util/concurrent/TimeUnit$7
-java/util/concurrent/atomic/AtomicBoolean
-java/util/concurrent/atomic/AtomicInteger
-java/util/concurrent/atomic/AtomicLong
-java/util/concurrent/atomic/AtomicMarkableReference
-java/util/concurrent/atomic/AtomicMarkableReference$Pair
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
-java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1
-java/util/concurrent/locks/AbstractOwnableSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer
-java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject
-java/util/concurrent/locks/AbstractQueuedSynchronizer$Node
-java/util/concurrent/locks/Condition
-java/util/concurrent/locks/Lock
-java/util/concurrent/locks/LockSupport
-java/util/concurrent/locks/ReadWriteLock
-java/util/concurrent/locks/ReentrantLock
-java/util/concurrent/locks/ReentrantLock$NonfairSync
-java/util/concurrent/locks/ReentrantLock$Sync
-java/util/concurrent/locks/ReentrantReadWriteLock
-java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync
-java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock
-java/util/concurrent/locks/ReentrantReadWriteLock$Sync
-java/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
-java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock
-java/util/function/BiFunction
-java/util/jar/Attributes
-java/util/jar/Attributes$Name
-java/util/jar/JarEntry
-java/util/jar/JarFile
-java/util/jar/JarFile$JarEntryIterator
-java/util/jar/JarFile$JarFileEntry
-java/util/jar/JarVerifier
-java/util/jar/JarVerifier$3
-java/util/jar/JavaUtilJarAccessImpl
-java/util/jar/Manifest
-java/util/jar/Manifest$FastInputStream
-java/util/logging/Handler
-java/util/logging/Level
-java/util/logging/Level$KnownLevel
-java/util/logging/LogManager
-java/util/logging/LogManager$1
-java/util/logging/LogManager$2
-java/util/logging/LogManager$3
-java/util/logging/LogManager$5
-java/util/logging/LogManager$Cleaner
-java/util/logging/LogManager$LogNode
-java/util/logging/LogManager$LoggerContext
-java/util/logging/LogManager$LoggerContext$1
-java/util/logging/LogManager$LoggerWeakRef
-java/util/logging/LogManager$RootLogger
-java/util/logging/LogManager$SystemLoggerContext
-java/util/logging/Logger
-java/util/logging/Logger$1
-java/util/logging/LoggingPermission
-java/util/logging/LoggingProxyImpl
-java/util/spi/CalendarDataProvider
-java/util/spi/CurrencyNameProvider
-java/util/spi/LocaleNameProvider
-java/util/spi/LocaleServiceProvider
-java/util/spi/ResourceBundleControlProvider
-java/util/spi/TimeZoneNameProvider
-java/util/zip/CRC32
-java/util/zip/Checksum
-java/util/zip/DeflaterOutputStream
-java/util/zip/GZIPInputStream
-java/util/zip/Inflater
-java/util/zip/InflaterInputStream
-java/util/zip/ZStreamRef
-java/util/zip/ZipCoder
-java/util/zip/ZipConstants
-java/util/zip/ZipEntry
-java/util/zip/ZipFile
-java/util/zip/ZipFile$1
-java/util/zip/ZipFile$ZipEntryIterator
-java/util/zip/ZipFile$ZipFileInflaterInputStream
-java/util/zip/ZipFile$ZipFileInputStream
-java/util/zip/ZipInputStream
-java/util/zip/ZipUtils
-javax/accessibility/Accessible
-javax/accessibility/AccessibleAction
-javax/accessibility/AccessibleBundle
-javax/accessibility/AccessibleComponent
-javax/accessibility/AccessibleContext
-javax/accessibility/AccessibleExtendedComponent
-javax/accessibility/AccessibleRelationSet
-javax/accessibility/AccessibleState
-javax/accessibility/AccessibleText
-javax/accessibility/AccessibleValue
-javax/security/auth/Destroyable
-javax/sound/sampled/Control$Type
-javax/sound/sampled/DataLine
-javax/sound/sampled/DataLine$Info
-javax/sound/sampled/FloatControl$Type
-javax/sound/sampled/Line
-javax/sound/sampled/Line$Info
-javax/sound/sampled/LineUnavailableException
-javax/sound/sampled/UnsupportedAudioFileException
-javax/swing/AbstractAction
-javax/swing/AbstractButton
-javax/swing/AbstractButton$AccessibleAbstractButton
-javax/swing/AbstractButton$Handler
-javax/swing/AbstractCellEditor
-javax/swing/AbstractListModel
-javax/swing/Action
-javax/swing/ActionMap
-javax/swing/AncestorNotifier
-javax/swing/ArrayTable
-javax/swing/BorderFactory
-javax/swing/BoundedRangeModel
-javax/swing/Box
-javax/swing/Box$Filler
-javax/swing/BoxLayout
-javax/swing/BufferStrategyPaintManager
-javax/swing/BufferStrategyPaintManager$BufferInfo
-javax/swing/ButtonGroup
-javax/swing/ButtonModel
-javax/swing/CellEditor
-javax/swing/CellRendererPane
-javax/swing/ClientPropertyKey
-javax/swing/ClientPropertyKey$1
-javax/swing/ComboBoxEditor
-javax/swing/ComboBoxModel
-javax/swing/ComponentInputMap
-javax/swing/DefaultBoundedRangeModel
-javax/swing/DefaultButtonModel
-javax/swing/DefaultCellEditor
-javax/swing/DefaultCellEditor$1
-javax/swing/DefaultCellEditor$EditorDelegate
-javax/swing/DefaultComboBoxModel
-javax/swing/DefaultListCellRenderer
-javax/swing/DefaultListCellRenderer$UIResource
-javax/swing/DefaultListModel
-javax/swing/DefaultListSelectionModel
-javax/swing/DefaultSingleSelectionModel
-javax/swing/DropMode
-javax/swing/FocusManager
-javax/swing/GrayFilter
-javax/swing/Icon
-javax/swing/ImageIcon
-javax/swing/ImageIcon$1
-javax/swing/ImageIcon$2
-javax/swing/ImageIcon$2$1
-javax/swing/ImageIcon$3
-javax/swing/InputMap
-javax/swing/InternalFrameFocusTraversalPolicy
-javax/swing/JButton
-javax/swing/JCheckBox
-javax/swing/JCheckBoxMenuItem
-javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem
-javax/swing/JComboBox
-javax/swing/JComboBox$1
-javax/swing/JComboBox$KeySelectionManager
-javax/swing/JComponent
-javax/swing/JComponent$1
-javax/swing/JComponent$2
-javax/swing/JComponent$AccessibleJComponent
-javax/swing/JDialog
-javax/swing/JEditorPane
-javax/swing/JFrame
-javax/swing/JInternalFrame
-javax/swing/JLabel
-javax/swing/JLayer
-javax/swing/JLayeredPane
-javax/swing/JList
-javax/swing/JList$3
-javax/swing/JList$ListSelectionHandler
-javax/swing/JMenu
-javax/swing/JMenu$MenuChangeListener
-javax/swing/JMenu$WinListener
-javax/swing/JMenuBar
-javax/swing/JMenuItem
-javax/swing/JMenuItem$AccessibleJMenuItem
-javax/swing/JMenuItem$MenuItemFocusListener
-javax/swing/JPanel
-javax/swing/JPopupMenu
-javax/swing/JPopupMenu$Separator
-javax/swing/JProgressBar
-javax/swing/JProgressBar$ModelListener
-javax/swing/JRadioButton
-javax/swing/JRadioButtonMenuItem
-javax/swing/JRootPane
-javax/swing/JRootPane$1
-javax/swing/JRootPane$RootLayout
-javax/swing/JScrollBar
-javax/swing/JScrollBar$ModelListener
-javax/swing/JScrollPane
-javax/swing/JScrollPane$ScrollBar
-javax/swing/JSeparator
-javax/swing/JSlider
-javax/swing/JSlider$ModelListener
-javax/swing/JSplitPane
-javax/swing/JTabbedPane
-javax/swing/JTabbedPane$ModelListener
-javax/swing/JTabbedPane$Page
-javax/swing/JTable
-javax/swing/JTable$2
-javax/swing/JTable$5
-javax/swing/JTable$Resizable2
-javax/swing/JTable$Resizable3
-javax/swing/JTextArea
-javax/swing/JTextField
-javax/swing/JTextField$NotifyAction
-javax/swing/JTextField$ScrollRepainter
-javax/swing/JToggleButton
-javax/swing/JToggleButton$ToggleButtonModel
-javax/swing/JToolBar
-javax/swing/JToolBar$DefaultToolBarLayout
-javax/swing/JToolBar$Separator
-javax/swing/JToolTip
-javax/swing/JTree
-javax/swing/JTree$TreeModelHandler
-javax/swing/JTree$TreeSelectionRedirector
-javax/swing/JViewport
-javax/swing/JViewport$ViewListener
-javax/swing/JWindow
-javax/swing/KeyStroke
-javax/swing/KeyboardManager
-javax/swing/KeyboardManager$ComponentKeyStrokePair
-javax/swing/LayoutComparator
-javax/swing/LayoutFocusTraversalPolicy
-javax/swing/ListCellRenderer
-javax/swing/ListModel
-javax/swing/ListSelectionModel
-javax/swing/LookAndFeel
-javax/swing/MenuElement
-javax/swing/MenuSelectionManager
-javax/swing/MultiUIDefaults
-javax/swing/MutableComboBoxModel
-javax/swing/Popup$HeavyWeightWindow
-javax/swing/RepaintManager
-javax/swing/RepaintManager$1
-javax/swing/RepaintManager$1$1
-javax/swing/RepaintManager$2
-javax/swing/RepaintManager$3
-javax/swing/RepaintManager$DisplayChangedHandler
-javax/swing/RepaintManager$PaintManager
-javax/swing/RepaintManager$ProcessingRunnable
-javax/swing/RootPaneContainer
-javax/swing/ScrollPaneConstants
-javax/swing/ScrollPaneLayout
-javax/swing/ScrollPaneLayout$UIResource
-javax/swing/Scrollable
-javax/swing/SingleSelectionModel
-javax/swing/SizeRequirements
-javax/swing/SortingFocusTraversalPolicy
-javax/swing/SwingConstants
-javax/swing/SwingContainerOrderFocusTraversalPolicy
-javax/swing/SwingDefaultFocusTraversalPolicy
-javax/swing/SwingPaintEventDispatcher
-javax/swing/SwingUtilities
-javax/swing/SwingUtilities$SharedOwnerFrame
-javax/swing/Timer
-javax/swing/Timer$DoPostEvent
-javax/swing/TimerQueue
-javax/swing/TimerQueue$1
-javax/swing/TimerQueue$DelayedTimer
-javax/swing/ToolTipManager
-javax/swing/ToolTipManager$AccessibilityKeyListener
-javax/swing/ToolTipManager$MoveBeforeEnterListener
-javax/swing/ToolTipManager$insideTimerAction
-javax/swing/ToolTipManager$outsideTimerAction
-javax/swing/ToolTipManager$stillInsideTimerAction
-javax/swing/TransferHandler
-javax/swing/TransferHandler$DropHandler
-javax/swing/TransferHandler$HasGetTransferHandler
-javax/swing/TransferHandler$SwingDropTarget
-javax/swing/TransferHandler$TransferAction
-javax/swing/TransferHandler$TransferSupport
-javax/swing/UIDefaults
-javax/swing/UIDefaults$ActiveValue
-javax/swing/UIDefaults$LazyInputMap
-javax/swing/UIDefaults$LazyValue
-javax/swing/UIDefaults$TextAndMnemonicHashMap
-javax/swing/UIManager
-javax/swing/UIManager$1
-javax/swing/UIManager$2
-javax/swing/UIManager$LAFState
-javax/swing/UIManager$LookAndFeelInfo
-javax/swing/UnsupportedLookAndFeelException
-javax/swing/ViewportLayout
-javax/swing/WindowConstants
-javax/swing/border/AbstractBorder
-javax/swing/border/BevelBorder
-javax/swing/border/Border
-javax/swing/border/CompoundBorder
-javax/swing/border/EmptyBorder
-javax/swing/border/EtchedBorder
-javax/swing/border/LineBorder
-javax/swing/border/MatteBorder
-javax/swing/border/TitledBorder
-javax/swing/event/AncestorListener
-javax/swing/event/CaretEvent
-javax/swing/event/CaretListener
-javax/swing/event/CellEditorListener
-javax/swing/event/ChangeEvent
-javax/swing/event/ChangeListener
-javax/swing/event/DocumentEvent
-javax/swing/event/DocumentEvent$ElementChange
-javax/swing/event/DocumentEvent$EventType
-javax/swing/event/DocumentListener
-javax/swing/event/EventListenerList
-javax/swing/event/ListDataEvent
-javax/swing/event/ListDataListener
-javax/swing/event/ListSelectionEvent
-javax/swing/event/ListSelectionListener
-javax/swing/event/MenuDragMouseListener
-javax/swing/event/MenuEvent
-javax/swing/event/MenuKeyListener
-javax/swing/event/MenuListener
-javax/swing/event/MouseInputAdapter
-javax/swing/event/MouseInputListener
-javax/swing/event/PopupMenuListener
-javax/swing/event/RowSorterListener
-javax/swing/event/SwingPropertyChangeSupport
-javax/swing/event/TableColumnModelEvent
-javax/swing/event/TableColumnModelListener
-javax/swing/event/TableModelEvent
-javax/swing/event/TableModelListener
-javax/swing/event/TreeExpansionListener
-javax/swing/event/TreeModelEvent
-javax/swing/event/TreeModelListener
-javax/swing/event/TreeSelectionEvent
-javax/swing/event/TreeSelectionListener
-javax/swing/event/UndoableEditEvent
-javax/swing/event/UndoableEditListener
-javax/swing/filechooser/FileFilter
-javax/swing/filechooser/FileSystemView
-javax/swing/filechooser/FileSystemView$1
-javax/swing/filechooser/WindowsFileSystemView
-javax/swing/plaf/ActionMapUIResource
-javax/swing/plaf/BorderUIResource
-javax/swing/plaf/BorderUIResource$CompoundBorderUIResource
-javax/swing/plaf/BorderUIResource$EmptyBorderUIResource
-javax/swing/plaf/BorderUIResource$LineBorderUIResource
-javax/swing/plaf/ButtonUI
-javax/swing/plaf/ColorUIResource
-javax/swing/plaf/ComboBoxUI
-javax/swing/plaf/ComponentInputMapUIResource
-javax/swing/plaf/ComponentUI
-javax/swing/plaf/DimensionUIResource
-javax/swing/plaf/FontUIResource
-javax/swing/plaf/InputMapUIResource
-javax/swing/plaf/InsetsUIResource
-javax/swing/plaf/LabelUI
-javax/swing/plaf/ListUI
-javax/swing/plaf/MenuBarUI
-javax/swing/plaf/MenuItemUI
-javax/swing/plaf/PanelUI
-javax/swing/plaf/PopupMenuUI
-javax/swing/plaf/ProgressBarUI
-javax/swing/plaf/RootPaneUI
-javax/swing/plaf/ScrollBarUI
-javax/swing/plaf/ScrollPaneUI
-javax/swing/plaf/SeparatorUI
-javax/swing/plaf/SliderUI
-javax/swing/plaf/SplitPaneUI
-javax/swing/plaf/TabbedPaneUI
-javax/swing/plaf/TableHeaderUI
-javax/swing/plaf/TableUI
-javax/swing/plaf/TextUI
-javax/swing/plaf/ToolBarUI
-javax/swing/plaf/TreeUI
-javax/swing/plaf/UIResource
-javax/swing/plaf/ViewportUI
-javax/swing/plaf/basic/BasicArrowButton
-javax/swing/plaf/basic/BasicBorders
-javax/swing/plaf/basic/BasicBorders$ButtonBorder
-javax/swing/plaf/basic/BasicBorders$MarginBorder
-javax/swing/plaf/basic/BasicBorders$RadioButtonBorder
-javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder
-javax/swing/plaf/basic/BasicBorders$SplitPaneBorder
-javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder
-javax/swing/plaf/basic/BasicButtonListener
-javax/swing/plaf/basic/BasicButtonUI
-javax/swing/plaf/basic/BasicCheckBoxMenuItemUI
-javax/swing/plaf/basic/BasicComboBoxEditor
-javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField
-javax/swing/plaf/basic/BasicComboBoxEditor$UIResource
-javax/swing/plaf/basic/BasicComboBoxRenderer
-javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource
-javax/swing/plaf/basic/BasicComboBoxUI
-javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager
-javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager
-javax/swing/plaf/basic/BasicComboBoxUI$Handler
-javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicComboPopup
-javax/swing/plaf/basic/BasicComboPopup$1
-javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass
-javax/swing/plaf/basic/BasicComboPopup$Handler
-javax/swing/plaf/basic/BasicGraphicsUtils
-javax/swing/plaf/basic/BasicHTML
-javax/swing/plaf/basic/BasicLabelUI
-javax/swing/plaf/basic/BasicListUI
-javax/swing/plaf/basic/BasicListUI$Handler
-javax/swing/plaf/basic/BasicListUI$ListTransferHandler
-javax/swing/plaf/basic/BasicLookAndFeel
-javax/swing/plaf/basic/BasicLookAndFeel$1
-javax/swing/plaf/basic/BasicLookAndFeel$2
-javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper
-javax/swing/plaf/basic/BasicMenuBarUI
-javax/swing/plaf/basic/BasicMenuBarUI$Handler
-javax/swing/plaf/basic/BasicMenuItemUI
-javax/swing/plaf/basic/BasicMenuItemUI$Handler
-javax/swing/plaf/basic/BasicMenuUI
-javax/swing/plaf/basic/BasicMenuUI$Handler
-javax/swing/plaf/basic/BasicPanelUI
-javax/swing/plaf/basic/BasicPopupMenuUI
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener
-javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper
-javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1
-javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber
-javax/swing/plaf/basic/BasicProgressBarUI
-javax/swing/plaf/basic/BasicProgressBarUI$Handler
-javax/swing/plaf/basic/BasicRadioButtonMenuItemUI
-javax/swing/plaf/basic/BasicRadioButtonUI
-javax/swing/plaf/basic/BasicRootPaneUI
-javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap
-javax/swing/plaf/basic/BasicScrollBarUI
-javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener
-javax/swing/plaf/basic/BasicScrollBarUI$Handler
-javax/swing/plaf/basic/BasicScrollBarUI$ModelListener
-javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener
-javax/swing/plaf/basic/BasicScrollBarUI$TrackListener
-javax/swing/plaf/basic/BasicScrollPaneUI
-javax/swing/plaf/basic/BasicScrollPaneUI$Handler
-javax/swing/plaf/basic/BasicSeparatorUI
-javax/swing/plaf/basic/BasicSliderUI
-javax/swing/plaf/basic/BasicSliderUI$Actions
-javax/swing/plaf/basic/BasicSliderUI$Handler
-javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler
-javax/swing/plaf/basic/BasicSliderUI$ScrollListener
-javax/swing/plaf/basic/BasicSliderUI$TrackListener
-javax/swing/plaf/basic/BasicSplitPaneDivider
-javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout
-javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler
-javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler
-javax/swing/plaf/basic/BasicSplitPaneUI
-javax/swing/plaf/basic/BasicSplitPaneUI$1
-javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager
-javax/swing/plaf/basic/BasicSplitPaneUI$Handler
-javax/swing/plaf/basic/BasicTabbedPaneUI
-javax/swing/plaf/basic/BasicTabbedPaneUI$Handler
-javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout
-javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout
-javax/swing/plaf/basic/BasicTableHeaderUI
-javax/swing/plaf/basic/BasicTableHeaderUI$1
-javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler
-javax/swing/plaf/basic/BasicTableUI
-javax/swing/plaf/basic/BasicTableUI$Handler
-javax/swing/plaf/basic/BasicTableUI$TableTransferHandler
-javax/swing/plaf/basic/BasicTextAreaUI
-javax/swing/plaf/basic/BasicTextFieldUI
-javax/swing/plaf/basic/BasicTextUI
-javax/swing/plaf/basic/BasicTextUI$BasicCaret
-javax/swing/plaf/basic/BasicTextUI$BasicCursor
-javax/swing/plaf/basic/BasicTextUI$BasicHighlighter
-javax/swing/plaf/basic/BasicTextUI$DragListener
-javax/swing/plaf/basic/BasicTextUI$FocusAction
-javax/swing/plaf/basic/BasicTextUI$RootView
-javax/swing/plaf/basic/BasicTextUI$TextActionWrapper
-javax/swing/plaf/basic/BasicTextUI$TextTransferHandler
-javax/swing/plaf/basic/BasicTextUI$UpdateHandler
-javax/swing/plaf/basic/BasicToggleButtonUI
-javax/swing/plaf/basic/BasicToolBarSeparatorUI
-javax/swing/plaf/basic/BasicToolBarUI
-javax/swing/plaf/basic/BasicToolBarUI$DockingListener
-javax/swing/plaf/basic/BasicToolBarUI$Handler
-javax/swing/plaf/basic/BasicTreeUI
-javax/swing/plaf/basic/BasicTreeUI$Actions
-javax/swing/plaf/basic/BasicTreeUI$Handler
-javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler
-javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler
-javax/swing/plaf/basic/BasicViewportUI
-javax/swing/plaf/basic/ComboPopup
-javax/swing/plaf/basic/DefaultMenuLayout
-javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag
-javax/swing/plaf/basic/LazyActionMap
-javax/swing/plaf/metal/BumpBuffer
-javax/swing/plaf/metal/DefaultMetalTheme
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate
-javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1
-javax/swing/plaf/metal/MetalBorders
-javax/swing/plaf/metal/MetalBorders$ButtonBorder
-javax/swing/plaf/metal/MetalBorders$Flush3DBorder
-javax/swing/plaf/metal/MetalBorders$MenuBarBorder
-javax/swing/plaf/metal/MetalBorders$MenuItemBorder
-javax/swing/plaf/metal/MetalBorders$PopupMenuBorder
-javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder
-javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder
-javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder
-javax/swing/plaf/metal/MetalBorders$TextFieldBorder
-javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder
-javax/swing/plaf/metal/MetalBorders$ToolBarBorder
-javax/swing/plaf/metal/MetalBumps
-javax/swing/plaf/metal/MetalButtonUI
-javax/swing/plaf/metal/MetalCheckBoxUI
-javax/swing/plaf/metal/MetalComboBoxButton
-javax/swing/plaf/metal/MetalComboBoxButton$1
-javax/swing/plaf/metal/MetalComboBoxEditor
-javax/swing/plaf/metal/MetalComboBoxEditor$1
-javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder
-javax/swing/plaf/metal/MetalComboBoxEditor$UIResource
-javax/swing/plaf/metal/MetalComboBoxIcon
-javax/swing/plaf/metal/MetalComboBoxUI
-javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager
-javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener
-javax/swing/plaf/metal/MetalIconFactory
-javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon
-javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon
-javax/swing/plaf/metal/MetalIconFactory$FolderIcon16
-javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon
-javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon
-javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon
-javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon
-javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon
-javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon
-javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon
-javax/swing/plaf/metal/MetalLabelUI
-javax/swing/plaf/metal/MetalLookAndFeel
-javax/swing/plaf/metal/MetalLookAndFeel$AATextListener
-javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue
-javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue
-javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue$1
-javax/swing/plaf/metal/MetalPopupMenuSeparatorUI
-javax/swing/plaf/metal/MetalProgressBarUI
-javax/swing/plaf/metal/MetalRadioButtonUI
-javax/swing/plaf/metal/MetalRootPaneUI
-javax/swing/plaf/metal/MetalScrollBarUI
-javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener
-javax/swing/plaf/metal/MetalScrollButton
-javax/swing/plaf/metal/MetalScrollPaneUI
-javax/swing/plaf/metal/MetalScrollPaneUI$1
-javax/swing/plaf/metal/MetalSeparatorUI
-javax/swing/plaf/metal/MetalSliderUI
-javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener
-javax/swing/plaf/metal/MetalSplitPaneDivider
-javax/swing/plaf/metal/MetalSplitPaneDivider$1
-javax/swing/plaf/metal/MetalSplitPaneDivider$2
-javax/swing/plaf/metal/MetalSplitPaneUI
-javax/swing/plaf/metal/MetalTabbedPaneUI
-javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout
-javax/swing/plaf/metal/MetalTextFieldUI
-javax/swing/plaf/metal/MetalTheme
-javax/swing/plaf/metal/MetalToggleButtonUI
-javax/swing/plaf/metal/MetalToolBarUI
-javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener
-javax/swing/plaf/metal/MetalTreeUI
-javax/swing/plaf/metal/MetalTreeUI$LineListener
-javax/swing/plaf/metal/MetalUtils
-javax/swing/plaf/metal/OceanTheme
-javax/swing/plaf/metal/OceanTheme$1
-javax/swing/plaf/metal/OceanTheme$2
-javax/swing/plaf/metal/OceanTheme$3
-javax/swing/plaf/metal/OceanTheme$4
-javax/swing/plaf/metal/OceanTheme$5
-javax/swing/plaf/metal/OceanTheme$6
-javax/swing/plaf/synth/SynthConstants
-javax/swing/plaf/synth/SynthUI
-javax/swing/table/AbstractTableModel
-javax/swing/table/DefaultTableCellRenderer
-javax/swing/table/DefaultTableColumnModel
-javax/swing/table/DefaultTableModel
-javax/swing/table/JTableHeader
-javax/swing/table/TableCellEditor
-javax/swing/table/TableCellRenderer
-javax/swing/table/TableColumn
-javax/swing/table/TableColumnModel
-javax/swing/table/TableModel
-javax/swing/text/AbstractDocument
-javax/swing/text/AbstractDocument$1
-javax/swing/text/AbstractDocument$AbstractElement
-javax/swing/text/AbstractDocument$AttributeContext
-javax/swing/text/AbstractDocument$BidiElement
-javax/swing/text/AbstractDocument$BidiRootElement
-javax/swing/text/AbstractDocument$BranchElement
-javax/swing/text/AbstractDocument$Content
-javax/swing/text/AbstractDocument$DefaultDocumentEvent
-javax/swing/text/AbstractDocument$ElementEdit
-javax/swing/text/AbstractDocument$InsertStringResult
-javax/swing/text/AbstractDocument$LeafElement
-javax/swing/text/AttributeSet
-javax/swing/text/AttributeSet$CharacterAttribute
-javax/swing/text/AttributeSet$ColorAttribute
-javax/swing/text/AttributeSet$FontAttribute
-javax/swing/text/AttributeSet$ParagraphAttribute
-javax/swing/text/Caret
-javax/swing/text/DefaultCaret
-javax/swing/text/DefaultCaret$Handler
-javax/swing/text/DefaultEditorKit
-javax/swing/text/DefaultEditorKit$BeepAction
-javax/swing/text/DefaultEditorKit$BeginAction
-javax/swing/text/DefaultEditorKit$BeginLineAction
-javax/swing/text/DefaultEditorKit$BeginParagraphAction
-javax/swing/text/DefaultEditorKit$BeginWordAction
-javax/swing/text/DefaultEditorKit$CopyAction
-javax/swing/text/DefaultEditorKit$CutAction
-javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction
-javax/swing/text/DefaultEditorKit$DeleteNextCharAction
-javax/swing/text/DefaultEditorKit$DeletePrevCharAction
-javax/swing/text/DefaultEditorKit$DeleteWordAction
-javax/swing/text/DefaultEditorKit$DumpModelAction
-javax/swing/text/DefaultEditorKit$EndAction
-javax/swing/text/DefaultEditorKit$EndLineAction
-javax/swing/text/DefaultEditorKit$EndParagraphAction
-javax/swing/text/DefaultEditorKit$EndWordAction
-javax/swing/text/DefaultEditorKit$InsertBreakAction
-javax/swing/text/DefaultEditorKit$InsertContentAction
-javax/swing/text/DefaultEditorKit$InsertTabAction
-javax/swing/text/DefaultEditorKit$NextVisualPositionAction
-javax/swing/text/DefaultEditorKit$NextWordAction
-javax/swing/text/DefaultEditorKit$PageAction
-javax/swing/text/DefaultEditorKit$PasteAction
-javax/swing/text/DefaultEditorKit$PreviousWordAction
-javax/swing/text/DefaultEditorKit$ReadOnlyAction
-javax/swing/text/DefaultEditorKit$SelectAllAction
-javax/swing/text/DefaultEditorKit$SelectLineAction
-javax/swing/text/DefaultEditorKit$SelectParagraphAction
-javax/swing/text/DefaultEditorKit$SelectWordAction
-javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction
-javax/swing/text/DefaultEditorKit$UnselectAction
-javax/swing/text/DefaultEditorKit$VerticalPageAction
-javax/swing/text/DefaultEditorKit$WritableAction
-javax/swing/text/DefaultHighlighter
-javax/swing/text/DefaultHighlighter$DefaultHighlightPainter
-javax/swing/text/DefaultHighlighter$SafeDamager
-javax/swing/text/Document
-javax/swing/text/EditorKit
-javax/swing/text/Element
-javax/swing/text/FieldView
-javax/swing/text/GapContent
-javax/swing/text/GapContent$InsertUndo
-javax/swing/text/GapContent$MarkData
-javax/swing/text/GapContent$MarkVector
-javax/swing/text/GapContent$StickyPosition
-javax/swing/text/GapVector
-javax/swing/text/Highlighter
-javax/swing/text/Highlighter$Highlight
-javax/swing/text/Highlighter$HighlightPainter
-javax/swing/text/JTextComponent
-javax/swing/text/JTextComponent$1
-javax/swing/text/JTextComponent$DefaultKeymap
-javax/swing/text/JTextComponent$KeymapActionMap
-javax/swing/text/JTextComponent$KeymapWrapper
-javax/swing/text/JTextComponent$MutableCaretEvent
-javax/swing/text/Keymap
-javax/swing/text/LayeredHighlighter
-javax/swing/text/LayeredHighlighter$LayerPainter
-javax/swing/text/MutableAttributeSet
-javax/swing/text/PlainDocument
-javax/swing/text/PlainView
-javax/swing/text/Position
-javax/swing/text/Position$Bias
-javax/swing/text/Segment
-javax/swing/text/SegmentCache
-javax/swing/text/SegmentCache$CachedSegment
-javax/swing/text/SimpleAttributeSet
-javax/swing/text/SimpleAttributeSet$EmptyAttributeSet
-javax/swing/text/Style
-javax/swing/text/StyleConstants
-javax/swing/text/StyleConstants$CharacterConstants
-javax/swing/text/StyleConstants$ColorConstants
-javax/swing/text/StyleConstants$FontConstants
-javax/swing/text/StyleConstants$ParagraphConstants
-javax/swing/text/StyleContext
-javax/swing/text/StyleContext$FontKey
-javax/swing/text/StyleContext$KeyEnumeration
-javax/swing/text/StyleContext$NamedStyle
-javax/swing/text/StyleContext$SmallAttributeSet
-javax/swing/text/TabExpander
-javax/swing/text/TextAction
-javax/swing/text/Utilities
-javax/swing/text/View
-javax/swing/text/ViewFactory
-javax/swing/tree/AbstractLayoutCache
-javax/swing/tree/AbstractLayoutCache$NodeDimensions
-javax/swing/tree/DefaultMutableTreeNode
-javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration
-javax/swing/tree/DefaultTreeCellEditor
-javax/swing/tree/DefaultTreeCellEditor$1
-javax/swing/tree/DefaultTreeCellEditor$DefaultTextField
-javax/swing/tree/DefaultTreeCellEditor$EditorContainer
-javax/swing/tree/DefaultTreeCellRenderer
-javax/swing/tree/DefaultTreeModel
-javax/swing/tree/DefaultTreeSelectionModel
-javax/swing/tree/MutableTreeNode
-javax/swing/tree/PathPlaceHolder
-javax/swing/tree/RowMapper
-javax/swing/tree/TreeCellEditor
-javax/swing/tree/TreeCellRenderer
-javax/swing/tree/TreeModel
-javax/swing/tree/TreeNode
-javax/swing/tree/TreePath
-javax/swing/tree/TreeSelectionModel
-javax/swing/tree/VariableHeightLayoutCache
-javax/swing/tree/VariableHeightLayoutCache$TreeStateNode
-javax/swing/undo/AbstractUndoableEdit
-javax/swing/undo/CompoundEdit
-javax/swing/undo/UndoableEdit
-javax/xml/parsers/DocumentBuilder
-javax/xml/parsers/DocumentBuilderFactory
-javax/xml/parsers/FactoryFinder
-javax/xml/parsers/FactoryFinder$1
-javax/xml/parsers/ParserConfigurationException
-javax/xml/parsers/SecuritySupport
-javax/xml/parsers/SecuritySupport$2
-javax/xml/parsers/SecuritySupport$5
-org/w3c/dom/Attr
-org/w3c/dom/CDATASection
-org/w3c/dom/CharacterData
-org/w3c/dom/Comment
-org/w3c/dom/DOMException
-org/w3c/dom/Document
-org/w3c/dom/DocumentFragment
-org/w3c/dom/DocumentType
-org/w3c/dom/Element
-org/w3c/dom/Entity
-org/w3c/dom/EntityReference
-org/w3c/dom/NamedNodeMap
-org/w3c/dom/Node
-org/w3c/dom/NodeList
-org/w3c/dom/Notation
-org/w3c/dom/ProcessingInstruction
-org/w3c/dom/Text
-org/w3c/dom/events/DocumentEvent
-org/w3c/dom/events/Event
-org/w3c/dom/events/EventException
-org/w3c/dom/events/EventTarget
-org/w3c/dom/events/MutationEvent
-org/w3c/dom/ranges/DocumentRange
-org/w3c/dom/ranges/Range
-org/w3c/dom/traversal/DocumentTraversal
-org/w3c/dom/traversal/NodeIterator
-org/w3c/dom/traversal/TreeWalker
-org/xml/sax/AttributeList
-org/xml/sax/ContentHandler
-org/xml/sax/DTDHandler
-org/xml/sax/EntityResolver
-org/xml/sax/ErrorHandler
-org/xml/sax/InputSource
-org/xml/sax/Locator
-org/xml/sax/SAXException
-org/xml/sax/SAXNotRecognizedException
-org/xml/sax/SAXNotSupportedException
-org/xml/sax/SAXParseException
-org/xml/sax/helpers/DefaultHandler
-sun/awt/AWTAccessor
-sun/awt/AWTAccessor$AWTEventAccessor
-sun/awt/AWTAccessor$ClientPropertyKeyAccessor
-sun/awt/AWTAccessor$ComponentAccessor
-sun/awt/AWTAccessor$ContainerAccessor
-sun/awt/AWTAccessor$CursorAccessor
-sun/awt/AWTAccessor$DefaultKeyboardFocusManagerAccessor
-sun/awt/AWTAccessor$EventQueueAccessor
-sun/awt/AWTAccessor$FrameAccessor
-sun/awt/AWTAccessor$InputEventAccessor
-sun/awt/AWTAccessor$InvocationEventAccessor
-sun/awt/AWTAccessor$KeyEventAccessor
-sun/awt/AWTAccessor$KeyboardFocusManagerAccessor
-sun/awt/AWTAccessor$SequencedEventAccessor
-sun/awt/AWTAccessor$ToolkitAccessor
-sun/awt/AWTAccessor$WindowAccessor
-sun/awt/AWTAutoShutdown
-sun/awt/AWTAutoShutdown$1
-sun/awt/AppContext
-sun/awt/AppContext$1
-sun/awt/AppContext$2
-sun/awt/AppContext$3
-sun/awt/AppContext$6
-sun/awt/AppContext$GetAppContextLock
-sun/awt/AppContext$PostShutdownEventRunnable
-sun/awt/AppContext$State
-sun/awt/CausedFocusEvent
-sun/awt/CausedFocusEvent$Cause
-sun/awt/ComponentFactory
-sun/awt/ConstrainableGraphics
-sun/awt/DisplayChangedListener
-sun/awt/EmbeddedFrame
-sun/awt/EventQueueDelegate
-sun/awt/EventQueueItem
-sun/awt/ExtendedKeyCodes
-sun/awt/FontConfiguration
-sun/awt/FontConfiguration$2
-sun/awt/FontDescriptor
-sun/awt/GlobalCursorManager
-sun/awt/GlobalCursorManager$NativeUpdater
-sun/awt/HeadlessToolkit
-sun/awt/InputMethodSupport
-sun/awt/KeyboardFocusManagerPeerImpl
-sun/awt/KeyboardFocusManagerPeerProvider
-sun/awt/LightweightFrame
-sun/awt/ModalExclude
-sun/awt/ModalityListener
-sun/awt/MostRecentKeyValue
-sun/awt/NativeLibLoader
-sun/awt/NativeLibLoader$1
-sun/awt/NullComponentPeer
-sun/awt/OSInfo
-sun/awt/OSInfo$1
-sun/awt/OSInfo$OSType
-sun/awt/OSInfo$WindowsVersion
-sun/awt/PaintEventDispatcher
-sun/awt/PeerEvent
-sun/awt/PlatformFont
-sun/awt/PostEventQueue
-sun/awt/RepaintArea
-sun/awt/RequestFocusController
-sun/awt/SubRegionShowable
-sun/awt/SunDisplayChanger
-sun/awt/SunGraphicsCallback
-sun/awt/SunHints
-sun/awt/SunHints$Key
-sun/awt/SunHints$LCDContrastKey
-sun/awt/SunHints$Value
-sun/awt/SunToolkit
-sun/awt/SunToolkit$ModalityListenerList
-sun/awt/Symbol
-sun/awt/Symbol$Encoder
-sun/awt/TimedWindowEvent
-sun/awt/Win32FontManager
-sun/awt/Win32FontManager$1
-sun/awt/Win32FontManager$2
-sun/awt/Win32GraphicsConfig
-sun/awt/Win32GraphicsDevice
-sun/awt/Win32GraphicsEnvironment
-sun/awt/WindowClosingListener
-sun/awt/WindowClosingSupport
-sun/awt/dnd/SunDragSourceContextPeer
-sun/awt/dnd/SunDropTargetEvent
-sun/awt/event/IgnorePaintEvent
-sun/awt/geom/PathConsumer2D
-sun/awt/im/ExecutableInputMethodManager
-sun/awt/im/ExecutableInputMethodManager$3
-sun/awt/im/InputContext
-sun/awt/im/InputMethodAdapter
-sun/awt/im/InputMethodContext
-sun/awt/im/InputMethodLocator
-sun/awt/im/InputMethodManager
-sun/awt/im/InputMethodWindow
-sun/awt/image/BufImgSurfaceData
-sun/awt/image/BufImgSurfaceData$ICMColorData
-sun/awt/image/BufImgSurfaceManager
-sun/awt/image/BufImgVolatileSurfaceManager
-sun/awt/image/BufferedImageDevice
-sun/awt/image/BufferedImageGraphicsConfig
-sun/awt/image/ByteComponentRaster
-sun/awt/image/ByteInterleavedRaster
-sun/awt/image/BytePackedRaster
-sun/awt/image/FetcherInfo
-sun/awt/image/GifFrame
-sun/awt/image/GifImageDecoder
-sun/awt/image/ImageConsumerQueue
-sun/awt/image/ImageDecoder
-sun/awt/image/ImageDecoder$1
-sun/awt/image/ImageFetchable
-sun/awt/image/ImageFetcher
-sun/awt/image/ImageFetcher$1
-sun/awt/image/ImageRepresentation
-sun/awt/image/ImageWatched
-sun/awt/image/ImageWatched$Link
-sun/awt/image/ImageWatched$WeakLink
-sun/awt/image/InputStreamImageSource
-sun/awt/image/IntegerComponentRaster
-sun/awt/image/IntegerInterleavedRaster
-sun/awt/image/NativeLibLoader
-sun/awt/image/NativeLibLoader$1
-sun/awt/image/OffScreenImage
-sun/awt/image/PNGFilterInputStream
-sun/awt/image/PNGImageDecoder
-sun/awt/image/PixelConverter
-sun/awt/image/PixelConverter$Argb
-sun/awt/image/PixelConverter$ArgbBm
-sun/awt/image/PixelConverter$ArgbPre
-sun/awt/image/PixelConverter$Bgrx
-sun/awt/image/PixelConverter$ByteGray
-sun/awt/image/PixelConverter$Rgba
-sun/awt/image/PixelConverter$RgbaPre
-sun/awt/image/PixelConverter$Rgbx
-sun/awt/image/PixelConverter$Ushort4444Argb
-sun/awt/image/PixelConverter$Ushort555Rgb
-sun/awt/image/PixelConverter$Ushort555Rgbx
-sun/awt/image/PixelConverter$Ushort565Rgb
-sun/awt/image/PixelConverter$UshortGray
-sun/awt/image/PixelConverter$Xbgr
-sun/awt/image/PixelConverter$Xrgb
-sun/awt/image/SunVolatileImage
-sun/awt/image/SunWritableRaster
-sun/awt/image/SunWritableRaster$DataStealer
-sun/awt/image/SurfaceManager
-sun/awt/image/SurfaceManager$FlushableCacheData
-sun/awt/image/SurfaceManager$ImageAccessor
-sun/awt/image/SurfaceManager$ProxiedGraphicsConfig
-sun/awt/image/ToolkitImage
-sun/awt/image/URLImageSource
-sun/awt/image/VolatileSurfaceManager
-sun/awt/resources/awt
-sun/awt/util/IdentityArrayList
-sun/awt/windows/ThemeReader
-sun/awt/windows/WCanvasPeer
-sun/awt/windows/WColor
-sun/awt/windows/WComponentPeer
-sun/awt/windows/WComponentPeer$2
-sun/awt/windows/WDesktopProperties
-sun/awt/windows/WDesktopProperties$WinPlaySound
-sun/awt/windows/WFontConfiguration
-sun/awt/windows/WFontPeer
-sun/awt/windows/WFramePeer
-sun/awt/windows/WGlobalCursorManager
-sun/awt/windows/WInputMethod
-sun/awt/windows/WInputMethodDescriptor
-sun/awt/windows/WKeyboardFocusManagerPeer
-sun/awt/windows/WLabelPeer
-sun/awt/windows/WObjectPeer
-sun/awt/windows/WPanelPeer
-sun/awt/windows/WToolkit
-sun/awt/windows/WToolkit$1
-sun/awt/windows/WToolkit$2
-sun/awt/windows/WToolkit$3
-sun/awt/windows/WToolkit$3$1
-sun/awt/windows/WToolkit$ToolkitDisposer
-sun/awt/windows/WWindowPeer
-sun/awt/windows/WWindowPeer$ActiveWindowListener
-sun/awt/windows/WWindowPeer$GuiDisposedListener
-sun/awt/windows/WingDings
-sun/awt/windows/WingDings$Encoder
-sun/dc/DuctusRenderingEngine
-sun/dc/path/PathConsumer
-sun/dc/pr/PathDasher
-sun/dc/pr/PathDasher$1
-sun/dc/pr/PathStroker
-sun/dc/pr/PathStroker$1
-sun/font/AttributeValues
-sun/font/CMap
-sun/font/CMap$CMapFormat4
-sun/font/CMap$NullCMapClass
-sun/font/CharToGlyphMapper
-sun/font/CompositeFont
-sun/font/CompositeFontDescriptor
-sun/font/CompositeGlyphMapper
-sun/font/CompositeStrike
-sun/font/CoreMetrics
-sun/font/EAttribute
-sun/font/FileFont
-sun/font/FileFontStrike
-sun/font/Font2D
-sun/font/Font2DHandle
-sun/font/FontAccess
-sun/font/FontDesignMetrics
-sun/font/FontDesignMetrics$KeyReference
-sun/font/FontDesignMetrics$MetricsKey
-sun/font/FontFamily
-sun/font/FontLineMetrics
-sun/font/FontManager
-sun/font/FontManagerFactory
-sun/font/FontManagerFactory$1
-sun/font/FontManagerForSGE
-sun/font/FontManagerNativeLibrary
-sun/font/FontManagerNativeLibrary$1
-sun/font/FontScaler
-sun/font/FontStrike
-sun/font/FontStrikeDesc
-sun/font/FontStrikeDisposer
-sun/font/FontUtilities
-sun/font/FontUtilities$1
-sun/font/GlyphList
-sun/font/PhysicalFont
-sun/font/PhysicalStrike
-sun/font/StandardGlyphVector
-sun/font/StandardGlyphVector$GlyphStrike
-sun/font/StrikeCache
-sun/font/StrikeCache$1
-sun/font/StrikeCache$DisposableStrike
-sun/font/StrikeCache$SoftDisposerRef
-sun/font/StrikeMetrics
-sun/font/SunFontManager
-sun/font/SunFontManager$1
-sun/font/SunFontManager$11
-sun/font/SunFontManager$12
-sun/font/SunFontManager$2
-sun/font/SunFontManager$3
-sun/font/SunFontManager$FamilyDescription
-sun/font/SunFontManager$FontRegistrationInfo
-sun/font/SunFontManager$T1Filter
-sun/font/SunFontManager$TTFilter
-sun/font/T2KFontScaler
-sun/font/T2KFontScaler$1
-sun/font/TrueTypeFont
-sun/font/TrueTypeFont$1
-sun/font/TrueTypeFont$DirectoryEntry
-sun/font/TrueTypeFont$TTDisposerRecord
-sun/font/TrueTypeGlyphMapper
-sun/font/Type1Font
-sun/io/Win32ErrorMode
-sun/java2d/DefaultDisposerRecord
-sun/java2d/DestSurfaceProvider
-sun/java2d/Disposer
-sun/java2d/Disposer$1
-sun/java2d/Disposer$2
-sun/java2d/Disposer$PollDisposable
-sun/java2d/DisposerRecord
-sun/java2d/DisposerTarget
-sun/java2d/FontSupport
-sun/java2d/InvalidPipeException
-sun/java2d/NullSurfaceData
-sun/java2d/ScreenUpdateManager
-sun/java2d/StateTrackable
-sun/java2d/StateTrackable$State
-sun/java2d/StateTrackableDelegate
-sun/java2d/StateTrackableDelegate$2
-sun/java2d/StateTracker
-sun/java2d/StateTracker$1
-sun/java2d/StateTracker$2
-sun/java2d/SunGraphics2D
-sun/java2d/SunGraphicsEnvironment
-sun/java2d/SunGraphicsEnvironment$1
-sun/java2d/Surface
-sun/java2d/SurfaceData
-sun/java2d/SurfaceData$PixelToPgramLoopConverter
-sun/java2d/SurfaceData$PixelToShapeLoopConverter
-sun/java2d/SurfaceDataProxy
-sun/java2d/SurfaceDataProxy$1
-sun/java2d/SurfaceManagerFactory
-sun/java2d/WindowsSurfaceManagerFactory
-sun/java2d/cmm/ProfileActivator
-sun/java2d/cmm/ProfileDeferralInfo
-sun/java2d/cmm/ProfileDeferralMgr
-sun/java2d/d3d/D3DContext$D3DContextCaps
-sun/java2d/d3d/D3DGraphicsConfig
-sun/java2d/d3d/D3DGraphicsDevice
-sun/java2d/d3d/D3DGraphicsDevice$1
-sun/java2d/d3d/D3DGraphicsDevice$1Result
-sun/java2d/d3d/D3DRenderQueue
-sun/java2d/d3d/D3DRenderQueue$1
-sun/java2d/d3d/D3DScreenUpdateManager
-sun/java2d/d3d/D3DScreenUpdateManager$1
-sun/java2d/d3d/D3DScreenUpdateManager$1$1
-sun/java2d/d3d/D3DSurfaceData
-sun/java2d/d3d/D3DSurfaceData$D3DWindowSurfaceData
-sun/java2d/loops/Blit
-sun/java2d/loops/BlitBg
-sun/java2d/loops/CompositeType
-sun/java2d/loops/CustomComponent
-sun/java2d/loops/DrawGlyphList
-sun/java2d/loops/DrawGlyphListAA
-sun/java2d/loops/DrawGlyphListLCD
-sun/java2d/loops/DrawLine
-sun/java2d/loops/DrawParallelogram
-sun/java2d/loops/DrawPath
-sun/java2d/loops/DrawPolygons
-sun/java2d/loops/DrawRect
-sun/java2d/loops/FillParallelogram
-sun/java2d/loops/FillPath
-sun/java2d/loops/FillRect
-sun/java2d/loops/FillSpans
-sun/java2d/loops/FontInfo
-sun/java2d/loops/GeneralRenderer
-sun/java2d/loops/GraphicsPrimitive
-sun/java2d/loops/GraphicsPrimitiveMgr
-sun/java2d/loops/GraphicsPrimitiveMgr$1
-sun/java2d/loops/GraphicsPrimitiveMgr$2
-sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec
-sun/java2d/loops/GraphicsPrimitiveProxy
-sun/java2d/loops/MaskBlit
-sun/java2d/loops/MaskFill
-sun/java2d/loops/RenderCache
-sun/java2d/loops/RenderCache$Entry
-sun/java2d/loops/RenderLoops
-sun/java2d/loops/ScaledBlit
-sun/java2d/loops/SurfaceType
-sun/java2d/loops/TransformHelper
-sun/java2d/loops/XORComposite
-sun/java2d/opengl/OGLGraphicsConfig
-sun/java2d/opengl/WGLGraphicsConfig
-sun/java2d/pipe/AAShapePipe
-sun/java2d/pipe/AATextRenderer
-sun/java2d/pipe/AlphaColorPipe
-sun/java2d/pipe/AlphaPaintPipe
-sun/java2d/pipe/CompositePipe
-sun/java2d/pipe/DrawImage
-sun/java2d/pipe/DrawImagePipe
-sun/java2d/pipe/GeneralCompositePipe
-sun/java2d/pipe/GlyphListLoopPipe
-sun/java2d/pipe/GlyphListPipe
-sun/java2d/pipe/LCDTextRenderer
-sun/java2d/pipe/LoopBasedPipe
-sun/java2d/pipe/LoopPipe
-sun/java2d/pipe/NullPipe
-sun/java2d/pipe/OutlineTextRenderer
-sun/java2d/pipe/ParallelogramPipe
-sun/java2d/pipe/PixelDrawPipe
-sun/java2d/pipe/PixelFillPipe
-sun/java2d/pipe/PixelToParallelogramConverter
-sun/java2d/pipe/PixelToShapeConverter
-sun/java2d/pipe/Region
-sun/java2d/pipe/Region$ImmutableRegion
-sun/java2d/pipe/RegionIterator
-sun/java2d/pipe/RenderBuffer
-sun/java2d/pipe/RenderQueue
-sun/java2d/pipe/RenderingEngine
-sun/java2d/pipe/RenderingEngine$1
-sun/java2d/pipe/ShapeDrawPipe
-sun/java2d/pipe/ShapeSpanIterator
-sun/java2d/pipe/SolidTextRenderer
-sun/java2d/pipe/SpanClipRenderer
-sun/java2d/pipe/SpanIterator
-sun/java2d/pipe/SpanShapeRenderer
-sun/java2d/pipe/SpanShapeRenderer$Composite
-sun/java2d/pipe/TextPipe
-sun/java2d/pipe/TextRenderer
-sun/java2d/pipe/ValidatePipe
-sun/java2d/pipe/hw/AccelGraphicsConfig
-sun/java2d/pipe/hw/AccelSurface
-sun/java2d/pipe/hw/BufferedContextProvider
-sun/java2d/pipe/hw/ContextCapabilities
-sun/java2d/windows/GDIBlitLoops
-sun/java2d/windows/GDIRenderer
-sun/java2d/windows/GDIWindowSurfaceData
-sun/java2d/windows/WindowsFlags
-sun/java2d/windows/WindowsFlags$1
-sun/launcher/LauncherHelper
-sun/launcher/LauncherHelper$FXHelper
-sun/misc/ASCIICaseInsensitiveComparator
-sun/misc/Cleaner
-sun/misc/CompoundEnumeration
-sun/misc/ExtensionDependency
-sun/misc/FDBigInteger
-sun/misc/FileURLMapper
-sun/misc/FloatingDecimal
-sun/misc/FloatingDecimal$1
-sun/misc/FloatingDecimal$ASCIIToBinaryBuffer
-sun/misc/FloatingDecimal$ASCIIToBinaryConverter
-sun/misc/FloatingDecimal$BinaryToASCIIBuffer
-sun/misc/FloatingDecimal$BinaryToASCIIConverter
-sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
-sun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer
-sun/misc/IOUtils
-sun/misc/JarIndex
-sun/misc/JavaAWTAccess
-sun/misc/JavaIOFileDescriptorAccess
-sun/misc/JavaLangAccess
-sun/misc/JavaNetAccess
-sun/misc/JavaNioAccess
-sun/misc/JavaSecurityAccess
-sun/misc/JavaSecurityProtectionDomainAccess
-sun/misc/JavaUtilJarAccess
-sun/misc/JavaUtilZipFileAccess
-sun/misc/Launcher
-sun/misc/Launcher$AppClassLoader
-sun/misc/Launcher$AppClassLoader$1
-sun/misc/Launcher$BootClassPathHolder
-sun/misc/Launcher$BootClassPathHolder$1
-sun/misc/Launcher$ExtClassLoader
-sun/misc/Launcher$ExtClassLoader$1
-sun/misc/Launcher$Factory
-sun/misc/MetaIndex
-sun/misc/NativeSignalHandler
-sun/misc/OSEnvironment
-sun/misc/Perf
-sun/misc/Perf$GetPerfAction
-sun/misc/PerfCounter
-sun/misc/PerfCounter$CoreCounters
-sun/misc/PerfCounter$WindowsClientCounters
-sun/misc/PerformanceLogger
-sun/misc/PerformanceLogger$TimeData
-sun/misc/PostVMInitHook
-sun/misc/Resource
-sun/misc/SharedSecrets
-sun/misc/Signal
-sun/misc/SignalHandler
-sun/misc/SoftCache
-sun/misc/SoftCache$ValueCell
-sun/misc/URLClassPath
-sun/misc/URLClassPath$1
-sun/misc/URLClassPath$2
-sun/misc/URLClassPath$3
-sun/misc/URLClassPath$FileLoader
-sun/misc/URLClassPath$JarLoader
-sun/misc/URLClassPath$JarLoader$1
-sun/misc/URLClassPath$JarLoader$2
-sun/misc/URLClassPath$Loader
-sun/misc/Unsafe
-sun/misc/VM
-sun/misc/Version
-sun/net/DefaultProgressMeteringPolicy
-sun/net/InetAddressCachePolicy
-sun/net/InetAddressCachePolicy$1
-sun/net/InetAddressCachePolicy$2
-sun/net/NetHooks
-sun/net/NetProperties
-sun/net/NetProperties$1
-sun/net/ProgressMeteringPolicy
-sun/net/ProgressMonitor
-sun/net/ResourceManager
-sun/net/spi/DefaultProxySelector
-sun/net/spi/DefaultProxySelector$1
-sun/net/spi/DefaultProxySelector$3
-sun/net/spi/DefaultProxySelector$NonProxyInfo
-sun/net/spi/nameservice/NameService
-sun/net/util/IPAddressUtil
-sun/net/util/URLUtil
-sun/net/www/MessageHeader
-sun/net/www/MimeEntry
-sun/net/www/MimeTable
-sun/net/www/MimeTable$1
-sun/net/www/MimeTable$DefaultInstanceHolder
-sun/net/www/MimeTable$DefaultInstanceHolder$1
-sun/net/www/ParseUtil
-sun/net/www/URLConnection
-sun/net/www/protocol/file/FileURLConnection
-sun/net/www/protocol/file/Handler
-sun/net/www/protocol/http/Handler
-sun/net/www/protocol/jar/Handler
-sun/net/www/protocol/jar/JarFileFactory
-sun/net/www/protocol/jar/JarURLConnection
-sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream
-sun/net/www/protocol/jar/URLJarFile
-sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController
-sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry
-sun/nio/ByteBuffered
-sun/nio/ch/DirectBuffer
-sun/nio/ch/FileChannelImpl
-sun/nio/ch/FileDispatcher
-sun/nio/ch/FileDispatcherImpl
-sun/nio/ch/IOStatus
-sun/nio/ch/IOUtil
-sun/nio/ch/IOUtil$1
-sun/nio/ch/Interruptible
-sun/nio/ch/NativeDispatcher
-sun/nio/ch/NativeThread
-sun/nio/ch/NativeThreadSet
-sun/nio/ch/Util
-sun/nio/ch/Util$1
-sun/nio/ch/Util$BufferCache
-sun/nio/cs/ArrayDecoder
-sun/nio/cs/ArrayEncoder
-sun/nio/cs/FastCharsetProvider
-sun/nio/cs/HistoricallyNamedCharset
-sun/nio/cs/ISO_8859_1
-sun/nio/cs/MS1252
-sun/nio/cs/SingleByte
-sun/nio/cs/SingleByte$Decoder
-sun/nio/cs/SingleByte$Encoder
-sun/nio/cs/StandardCharsets
-sun/nio/cs/StandardCharsets$Aliases
-sun/nio/cs/StandardCharsets$Cache
-sun/nio/cs/StandardCharsets$Classes
-sun/nio/cs/StreamDecoder
-sun/nio/cs/StreamEncoder
-sun/nio/cs/Surrogate
-sun/nio/cs/Surrogate$Parser
-sun/nio/cs/US_ASCII
-sun/nio/cs/UTF_16
-sun/nio/cs/UTF_16$Decoder
-sun/nio/cs/UTF_16BE
-sun/nio/cs/UTF_16LE
-sun/nio/cs/UTF_16LE$Decoder
-sun/nio/cs/UTF_16LE$Encoder
-sun/nio/cs/UTF_8
-sun/nio/cs/UTF_8$Decoder
-sun/nio/cs/UTF_8$Encoder
-sun/nio/cs/Unicode
-sun/nio/cs/UnicodeDecoder
-sun/nio/cs/UnicodeEncoder
-sun/print/PrinterGraphicsConfig
-sun/reflect/AccessorGenerator
-sun/reflect/BootstrapConstructorAccessorImpl
-sun/reflect/ByteVector
-sun/reflect/ByteVectorFactory
-sun/reflect/ByteVectorImpl
-sun/reflect/CallerSensitive
-sun/reflect/ClassDefiner
-sun/reflect/ClassDefiner$1
-sun/reflect/ClassFileAssembler
-sun/reflect/ClassFileConstants
-sun/reflect/ConstantPool
-sun/reflect/ConstructorAccessor
-sun/reflect/ConstructorAccessorImpl
-sun/reflect/DelegatingClassLoader
-sun/reflect/DelegatingConstructorAccessorImpl
-sun/reflect/DelegatingMethodAccessorImpl
-sun/reflect/FieldAccessor
-sun/reflect/FieldAccessorImpl
-sun/reflect/Label
-sun/reflect/Label$PatchInfo
-sun/reflect/LangReflectAccess
-sun/reflect/MagicAccessorImpl
-sun/reflect/MethodAccessor
-sun/reflect/MethodAccessorGenerator
-sun/reflect/MethodAccessorGenerator$1
-sun/reflect/MethodAccessorImpl
-sun/reflect/NativeConstructorAccessorImpl
-sun/reflect/NativeMethodAccessorImpl
-sun/reflect/Reflection
-sun/reflect/ReflectionFactory
-sun/reflect/ReflectionFactory$1
-sun/reflect/ReflectionFactory$GetReflectionFactoryAction
-sun/reflect/SerializationConstructorAccessorImpl
-sun/reflect/UTF8
-sun/reflect/UnsafeFieldAccessorFactory
-sun/reflect/UnsafeFieldAccessorImpl
-sun/reflect/UnsafeObjectFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl
-sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl
-sun/reflect/UnsafeStaticFieldAccessorImpl
-sun/reflect/annotation/AnnotationType
-sun/reflect/generics/repository/AbstractRepository
-sun/reflect/generics/repository/ClassRepository
-sun/reflect/generics/repository/GenericDeclRepository
-sun/reflect/misc/MethodUtil
-sun/reflect/misc/MethodUtil$1
-sun/reflect/misc/ReflectUtil
-sun/security/action/GetBooleanAction
-sun/security/action/GetIntegerAction
-sun/security/action/GetPropertyAction
-sun/security/jca/GetInstance
-sun/security/jca/GetInstance$Instance
-sun/security/jca/ProviderConfig
-sun/security/jca/ProviderConfig$2
-sun/security/jca/ProviderList
-sun/security/jca/ProviderList$1
-sun/security/jca/ProviderList$2
-sun/security/jca/ProviderList$3
-sun/security/jca/ProviderList$ServiceList
-sun/security/jca/ProviderList$ServiceList$1
-sun/security/jca/Providers
-sun/security/jca/ServiceId
-sun/security/provider/ByteArrayAccess
-sun/security/provider/DSA
-sun/security/provider/DSA$LegacyDSA
-sun/security/provider/DSA$SHA1withDSA
-sun/security/provider/DSAParameters
-sun/security/provider/DSAPublicKey
-sun/security/provider/DigestBase
-sun/security/provider/NativePRNG
-sun/security/provider/NativePRNG$Blocking
-sun/security/provider/NativePRNG$NonBlocking
-sun/security/provider/SHA
-sun/security/provider/Sun
-sun/security/provider/SunEntries
-sun/security/provider/SunEntries$1
-sun/security/util/ByteArrayLexOrder
-sun/security/util/ByteArrayTagOrder
-sun/security/util/Debug
-sun/security/util/DerEncoder
-sun/security/util/DerIndefLenConverter
-sun/security/util/DerInputBuffer
-sun/security/util/DerInputStream
-sun/security/util/DerOutputStream
-sun/security/util/DerValue
-sun/security/util/ManifestEntryVerifier
-sun/security/util/ObjectIdentifier
-sun/security/util/SignatureFileVerifier
-sun/security/x509/AlgorithmId
-sun/security/x509/X509Key
-sun/swing/DefaultLookup
-sun/swing/ImageIconUIResource
-sun/swing/JLightweightFrame
-sun/swing/MenuItemLayoutHelper
-sun/swing/MenuItemLayoutHelper$ColumnAlignment
-sun/swing/MenuItemLayoutHelper$LayoutResult
-sun/swing/MenuItemLayoutHelper$RectSize
-sun/swing/PrintColorUIResource
-sun/swing/StringUIClientPropertyKey
-sun/swing/SwingAccessor
-sun/swing/SwingAccessor$JTextComponentAccessor
-sun/swing/SwingLazyValue
-sun/swing/SwingLazyValue$1
-sun/swing/SwingUtilities2
-sun/swing/SwingUtilities2$2
-sun/swing/SwingUtilities2$AATextInfo
-sun/swing/SwingUtilities2$LSBCacheEntry
-sun/swing/UIAction
-sun/swing/UIClientPropertyKey
-sun/swing/table/DefaultTableCellHeaderRenderer
-sun/swing/table/DefaultTableCellHeaderRenderer$EmptyIcon
-sun/text/ComposedCharIter
-sun/text/IntHashtable
-sun/text/UCompactIntArray
-sun/text/normalizer/CharTrie
-sun/text/normalizer/CharTrie$FriendAgent
-sun/text/normalizer/ICUBinary
-sun/text/normalizer/ICUBinary$Authenticate
-sun/text/normalizer/ICUData
-sun/text/normalizer/IntTrie
-sun/text/normalizer/NormalizerDataReader
-sun/text/normalizer/NormalizerImpl
-sun/text/normalizer/NormalizerImpl$AuxTrieImpl
-sun/text/normalizer/NormalizerImpl$DecomposeArgs
-sun/text/normalizer/NormalizerImpl$FCDTrieImpl
-sun/text/normalizer/NormalizerImpl$NormTrieImpl
-sun/text/normalizer/Trie
-sun/text/normalizer/Trie$DataManipulate
-sun/text/normalizer/UTF16
-sun/text/normalizer/UnicodeMatcher
-sun/text/normalizer/UnicodeSet
-sun/text/resources/CollationData
-sun/text/resources/FormatData
-sun/text/resources/en/FormatData_en
-sun/text/resources/en/FormatData_en_US
-sun/util/CoreResourceBundleControl
-sun/util/PreHashedMap
-sun/util/ResourceBundleEnumeration
-sun/util/calendar/AbstractCalendar
-sun/util/calendar/BaseCalendar
-sun/util/calendar/BaseCalendar$Date
-sun/util/calendar/CalendarDate
-sun/util/calendar/CalendarSystem
-sun/util/calendar/CalendarUtils
-sun/util/calendar/Gregorian
-sun/util/calendar/Gregorian$Date
-sun/util/calendar/ZoneInfo
-sun/util/calendar/ZoneInfoFile
-sun/util/calendar/ZoneInfoFile$1
-sun/util/calendar/ZoneInfoFile$Checksum
-sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule
-sun/util/locale/BaseLocale
-sun/util/locale/BaseLocale$Cache
-sun/util/locale/BaseLocale$Key
-sun/util/locale/InternalLocaleBuilder
-sun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar
-sun/util/locale/LanguageTag
-sun/util/locale/LocaleObjectCache
-sun/util/locale/LocaleObjectCache$CacheEntry
-sun/util/locale/LocaleUtils
-sun/util/locale/ParseStatus
-sun/util/locale/StringTokenIterator
-sun/util/locale/provider/AuxLocaleProviderAdapter
-sun/util/locale/provider/AuxLocaleProviderAdapter$NullProvider
-sun/util/locale/provider/AvailableLanguageTags
-sun/util/locale/provider/CalendarDataProviderImpl
-sun/util/locale/provider/CalendarDataUtility
-sun/util/locale/provider/CalendarDataUtility$CalendarWeekParameterGetter
-sun/util/locale/provider/CalendarProviderImpl
-sun/util/locale/provider/CollatorProviderImpl
-sun/util/locale/provider/CurrencyNameProviderImpl
-sun/util/locale/provider/DateFormatSymbolsProviderImpl
-sun/util/locale/provider/DecimalFormatSymbolsProviderImpl
-sun/util/locale/provider/JRELocaleProviderAdapter
-sun/util/locale/provider/JRELocaleProviderAdapter$1
-sun/util/locale/provider/LocaleDataMetaInfo
-sun/util/locale/provider/LocaleProviderAdapter
-sun/util/locale/provider/LocaleProviderAdapter$1
-sun/util/locale/provider/LocaleProviderAdapter$Type
-sun/util/locale/provider/LocaleResources
-sun/util/locale/provider/LocaleResources$ResourceReference
-sun/util/locale/provider/LocaleServiceProviderPool
-sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter
-sun/util/locale/provider/NumberFormatProviderImpl
-sun/util/locale/provider/ResourceBundleBasedAdapter
-sun/util/locale/provider/SPILocaleProviderAdapter
-sun/util/locale/provider/SPILocaleProviderAdapter$1
-sun/util/locale/provider/TimeZoneNameProviderImpl
-sun/util/locale/provider/TimeZoneNameUtility
-sun/util/locale/provider/TimeZoneNameUtility$TimeZoneNameGetter
-sun/util/logging/LoggingProxy
-sun/util/logging/LoggingSupport
-sun/util/logging/LoggingSupport$1
-sun/util/logging/LoggingSupport$2
-sun/util/logging/PlatformLogger
-sun/util/logging/PlatformLogger$1
-sun/util/logging/PlatformLogger$DefaultLoggerProxy
-sun/util/logging/PlatformLogger$JavaLoggerProxy
-sun/util/logging/PlatformLogger$Level
-sun/util/logging/PlatformLogger$LoggerProxy
-sun/util/logging/resources/logging
-sun/util/resources/CalendarData
-sun/util/resources/CurrencyNames
-sun/util/resources/LocaleData
-sun/util/resources/LocaleData$1
-sun/util/resources/LocaleData$LocaleDataResourceBundleControl
-sun/util/resources/LocaleNamesBundle
-sun/util/resources/OpenListResourceBundle
-sun/util/resources/ParallelListResourceBundle
-sun/util/resources/ParallelListResourceBundle$KeySet
-sun/util/resources/TimeZoneNames
-sun/util/resources/TimeZoneNamesBundle
-sun/util/resources/en/CalendarData_en
-sun/util/resources/en/CurrencyNames_en_US
-sun/util/resources/en/TimeZoneNames_en
-sun/util/spi/CalendarProvider
-# 729efa63b41fc759
--- a/jdk/make/data/x11wrappergen/sizes.32	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/data/x11wrappergen/sizes.32	Wed Jul 05 21:40:37 2017 +0200
@@ -206,7 +206,8 @@
 ColorData.img_oda_blue	32
 ColorData.pGrayInverseLutData	36
 ColorData.screendata	40
-ColorData	44
+ColorData.representsPrimaries	44
+ColorData	48
 XFontStruct.ext_data	0
 XFontStruct.fid	4
 XFontStruct.direction	8
--- a/jdk/make/data/x11wrappergen/sizes.64	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/data/x11wrappergen/sizes.64	Wed Jul 05 21:40:37 2017 +0200
@@ -206,6 +206,7 @@
 ColorData.img_oda_blue	64
 ColorData.pGrayInverseLutData	72
 ColorData.screendata	80
+ColorData.representsPrimaries	84
 ColorData	88
 XFontStruct.ext_data	0
 XFontStruct.fid	8
--- a/jdk/make/data/x11wrappergen/sizes.64-solaris-i386	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/data/x11wrappergen/sizes.64-solaris-i386	Wed Jul 05 21:40:37 2017 +0200
@@ -206,6 +206,7 @@
 ColorData.img_oda_blue	64
 ColorData.pGrayInverseLutData	72
 ColorData.screendata	80
+ColorData.representsPrimaries	84
 ColorData	88
 XFontStruct.ext_data	0
 XFontStruct.fid	8
--- a/jdk/make/data/x11wrappergen/xlibtypes.txt	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/data/x11wrappergen/xlibtypes.txt	Wed Jul 05 21:40:37 2017 +0200
@@ -749,6 +749,7 @@
     img_oda_blue pointer byte
     pGrayInverseLutData pointer int
     screendata int
+    representsPrimaries int
 
 AwtGraphicsConfigData
     awt_depth int
--- a/jdk/make/gendata/Gendata-java.base.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/gendata/Gendata-java.base.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -75,14 +75,3 @@
 TARGETS += $(GENDATA_JAVA_SECURITY)
 
 ################################################################################
-
-$(SUPPORT_OUTPUTDIR)/modules_libs/java.base/classlist: \
-    $(JDK_TOPDIR)/make/data/classlist/classlist.$(OPENJDK_TARGET_OS)
-	$(call MakeDir, $(@D))
-	$(RM) $@ $@.tmp
-	$(TOOL_ADDJSUM) $< $@.tmp
-	$(MV) $@.tmp $@
-
-TARGETS += $(SUPPORT_OUTPUTDIR)/modules_libs/java.base/classlist
-
-################################################################################
--- a/jdk/make/gendata/GendataBreakIterator.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/gendata/GendataBreakIterator.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -62,10 +62,13 @@
     BIN := $(BREAK_ITERATOR_CLASSES)/jdk.localedata))
 
 ifeq ($(BOOT_JDK_MODULAR), true)
-  BREAK_ITERATOR_BOOTCLASSPATH := -Xpatch:$(BREAK_ITERATOR_CLASSES) \
-        -XaddExports:java.base/sun.text=ALL-UNNAMED \
-        -XaddExports:java.base/sun.text.resources=ALL-UNNAMED \
-        -XaddExports:jdk.localedata/sun.text.resources.ext=ALL-UNNAMED
+  BREAK_ITERATOR_BOOTCLASSPATH := \
+      -Xpatch:java.base=$(BREAK_ITERATOR_CLASSES)/java.base \
+      -Xpatch:jdk.localedata=$(BREAK_ITERATOR_CLASSES)/jdk.localedata \
+      -XaddExports:java.base/sun.text=ALL-UNNAMED \
+      -XaddExports:java.base/sun.text.resources=ALL-UNNAMED \
+      -XaddExports:jdk.localedata/sun.text.resources.ext=ALL-UNNAMED \
+      #
 else
   BREAK_ITERATOR_BOOTCLASSPATH := -Xbootclasspath/p:$(call PathList, \
       $(BREAK_ITERATOR_CLASSES)/java.base \
--- a/jdk/make/launcher/Launcher-java.desktop.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/launcher/Launcher-java.desktop.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -31,7 +31,7 @@
 ifndef BUILD_HEADLESS_ONLY
   $(eval $(call SetupBuildLauncher, appletviewer, \
       MAIN_CLASS := sun.applet.Main, \
-      JAVA_ARGS := -addmods ALL-SYSTEM, \
+      JAVA_ARGS := -addmods ALL-DEFAULT, \
       LIBS_unix := $(X_LIBS), \
   ))
 endif
--- a/jdk/make/launcher/Launcher-java.scripting.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/launcher/Launcher-java.scripting.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -27,4 +27,5 @@
 
 $(eval $(call SetupBuildLauncher, jrunscript, \
     MAIN_CLASS := com.sun.tools.script.shell.Main, \
+    JAVA_ARGS := -addmods ALL-DEFAULT, \
 ))
--- a/jdk/make/launcher/Launcher-jdk.compiler.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/launcher/Launcher-jdk.compiler.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -27,7 +27,8 @@
 
 $(eval $(call SetupBuildLauncher, javac, \
    MAIN_CLASS := com.sun.tools.javac.Main, \
-    CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
+   JAVA_ARGS := -addmods ALL-DEFAULT, \
+   CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
         -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
 ))
 
--- a/jdk/make/launcher/Launcher-jdk.javadoc.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/launcher/Launcher-jdk.javadoc.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -27,6 +27,7 @@
 
 $(eval $(call SetupBuildLauncher, javadoc, \
     MAIN_CLASS := jdk.javadoc.internal.tool.Main, \
+    JAVA_ARGS := -addmods ALL-DEFAULT, \
     CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
         -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
 ))
--- a/jdk/make/launcher/Launcher-jdk.jlink.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/launcher/Launcher-jdk.jlink.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -32,6 +32,7 @@
 
 $(eval $(call SetupBuildLauncher, jlink,\
     MAIN_CLASS := jdk.tools.jlink.internal.Main, \
+    JAVA_ARGS := -addmods ALL-DEFAULT, \
     CFLAGS := -DENABLE_ARG_FILES \
         -DEXPAND_CLASSPATH_WILDCARDS \
         -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
--- a/jdk/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -27,6 +27,6 @@
 
 $(eval $(call SetupBuildLauncher, jjs, \
     MAIN_CLASS := jdk.nashorn.tools.jjs.Main, \
-    JAVA_ARGS := -addmods ALL-SYSTEM, \
+    JAVA_ARGS := -addmods ALL-DEFAULT, \
     CFLAGS := -DENABLE_ARG_FILES, \
 ))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/make/src/classes/build/tools/classlist/HelloClasslist.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+/**
+ * This application is meant to be run to create a classlist file representing
+ * common use.
+ *
+ * The classlist is produced by adding -XX:DumpLoadedClassList=classlist
+ */
+package build.tools.classlist;
+
+import java.net.InetAddress;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.stream.Stream;
+import java.util.logging.*;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.text.DateFormat;
+
+import static java.util.stream.Collectors.*;
+
+/**
+ * This class is used to generate a classlist during build. Intent
+ * is to touch a reasonable amount of JDK classes that are commonly
+ * loaded and used early.
+ */
+public class HelloClasslist {
+
+    private static final Logger LOGGER = Logger.getLogger("Hello");
+
+    public static void main(String ... args) {
+
+        List<String> strings = Arrays.asList("Hello", "World!", "From: ",
+              InetAddress.getLoopbackAddress().toString());
+
+        String helloWorld = strings.parallelStream()
+              .map(s -> s.toLowerCase(Locale.ROOT))
+              .collect(joining(","));
+
+        Stream.of(helloWorld.split(","))
+              .forEach(System.out::println);
+
+        String newDate = DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(
+                LocalDateTime.now(ZoneId.of("GMT")));
+
+        String oldDate = String.format("%s%n",
+                DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.ROOT)
+                        .format(new Date()));
+
+        LOGGER.log(Level.INFO, "New Date: " + newDate + " - old: " + oldDate);
+    }
+
+}
--- a/jdk/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -102,7 +102,7 @@
 
     @Override
     FileTypeDetector getFileTypeDetector() {
-        String userHome = GetPropertyAction.getProperty("user.home");
+        String userHome = GetPropertyAction.privilegedGetProperty("user.home");
         Path userMimeTypes = Paths.get(userHome, ".mime.types");
         Path etcMimeTypes = Paths.get("/etc/mime.types");
 
--- a/jdk/src/java.base/linux/native/libnio/ch/EPollArrayWrapper.c	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/linux/native/libnio/ch/EPollArrayWrapper.c	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2016, 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
@@ -53,7 +53,7 @@
     start = t.tv_sec * 1000 + t.tv_usec / 1000;
 
     for (;;) {
-        int res = epoll_wait(epfd, events, numfds, timeout);
+        int res = epoll_wait(epfd, events, numfds, remaining);
         if (res < 0 && errno == EINTR) {
             if (remaining >= 0) {
                 gettimeofday(&t, NULL);
--- a/jdk/src/java.base/macosx/classes/sun/nio/ch/KQueueArrayWrapper.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/macosx/classes/sun/nio/ch/KQueueArrayWrapper.java	Wed Jul 05 21:40:37 2017 +0200
@@ -84,7 +84,8 @@
     static {
         IOUtil.load();
         initStructSizes();
-        String datamodel = GetPropertyAction.getProperty("sun.arch.data.model");
+        String datamodel =
+                GetPropertyAction.privilegedGetProperty("sun.arch.data.model");
         is64bit = "64".equals(datamodel);
     }
 
--- a/jdk/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystem.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystem.java	Wed Jul 05 21:40:37 2017 +0200
@@ -29,8 +29,6 @@
 import java.io.IOException;
 import java.util.*;
 import java.util.regex.Pattern;
-import java.security.AccessController;
-import sun.security.action.GetPropertyAction;
 
 import static sun.nio.fs.MacOSXNativeDispatcher.*;
 
--- a/jdk/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystemProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystemProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -46,8 +46,8 @@
 
     @Override
     FileTypeDetector getFileTypeDetector() {
-        Path userMimeTypes = Paths.get(
-            GetPropertyAction.getProperty("user.home"), ".mime.types");
+        Path userMimeTypes = Paths.get(GetPropertyAction
+                .privilegedGetProperty("user.home"), ".mime.types");
 
         return chain(new MimeTypesFileTypeDetector(userMimeTypes),
                      new UTIFileTypeDetector());
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java	Wed Jul 05 21:40:37 2017 +0200
@@ -262,4 +262,14 @@
             super("SHA-512", 128);
         }
     }
+    public static final class HmacSHA512_224 extends HmacCore {
+        public HmacSHA512_224() throws NoSuchAlgorithmException {
+            super("SHA-512/224", 128);
+        }
+    }
+    public static final class HmacSHA512_256 extends HmacCore {
+        public HmacSHA512_256() throws NoSuchAlgorithmException {
+            super("SHA-512/256", 128);
+        }
+    }
 }
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java	Wed Jul 05 21:40:37 2017 +0200
@@ -704,6 +704,12 @@
                     put("Alg.Alias.Mac.OID.1.2.840.113549.2.11", "HmacSHA512");
                     put("Alg.Alias.Mac.1.2.840.113549.2.11", "HmacSHA512");
 
+                    // TODO: aliases with OIDs
+                    put("Mac.HmacSHA512/224",
+                            "com.sun.crypto.provider.HmacCore$HmacSHA512_224");
+                    put("Mac.HmacSHA512/256",
+                            "com.sun.crypto.provider.HmacCore$HmacSHA512_256");
+
                     put("Mac.HmacPBESHA1",
                         "com.sun.crypto.provider.HmacPKCS12PBESHA1");
 
--- a/jdk/src/java.base/share/classes/java/io/File.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/io/File.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1896,7 +1896,7 @@
 
         // temporary directory location
         private static final File tmpdir = new File(
-                GetPropertyAction.getProperty("java.io.tmpdir"));
+                GetPropertyAction.privilegedGetProperty("java.io.tmpdir"));
         static File location() {
             return tmpdir;
         }
--- a/jdk/src/java.base/share/classes/java/lang/Class.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Class.java	Wed Jul 05 21:40:37 2017 +0200
@@ -470,7 +470,7 @@
      * expression with an empty argument list.  The class is initialized if it
      * has not already been initialized.
      *
-     * <p>Note that this method propagates any exception thrown by the
+     * @deprecated This method propagates any exception thrown by the
      * nullary constructor, including a checked exception.  Use of
      * this method effectively bypasses the compile-time exception
      * checking that would otherwise be performed by the compiler.
@@ -500,6 +500,7 @@
      *          of this class.
      */
     @CallerSensitive
+    @Deprecated(since="9")
     public T newInstance()
         throws InstantiationException, IllegalAccessException
     {
--- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -2615,7 +2615,7 @@
     ServicesCatalog createOrGetServicesCatalog() {
         ServicesCatalog catalog = servicesCatalog;
         if (catalog == null) {
-            catalog = new ServicesCatalog();
+            catalog = ServicesCatalog.create();
             boolean set = trySetObjectField("servicesCatalog", catalog);
             if (!set) {
                 // beaten by someone else
--- a/jdk/src/java.base/share/classes/java/lang/ProcessBuilder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessBuilder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -468,7 +468,7 @@
      */
     public abstract static class Redirect {
         private static final File NULL_FILE = new File(
-                (GetPropertyAction.getProperty("os.name")
+                (GetPropertyAction.privilegedGetProperty("os.name")
                         .startsWith("Windows") ? "NUL" : "/dev/null")
         );
 
--- a/jdk/src/java.base/share/classes/java/lang/StackFrameInfo.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/StackFrameInfo.java	Wed Jul 05 21:40:37 2017 +0200
@@ -29,21 +29,20 @@
 
 import static java.lang.StackWalker.Option.*;
 import java.lang.StackWalker.StackFrame;
-import java.lang.reflect.Module;
 import java.util.Optional;
 import java.util.OptionalInt;
 
 class StackFrameInfo implements StackFrame {
-    private final static JavaLangInvokeAccess jlInvokeAccess =
+    private final static JavaLangInvokeAccess JLIA =
         SharedSecrets.getJavaLangInvokeAccess();
 
     // Footprint improvement: MemberName::clazz can replace
     // StackFrameInfo::declaringClass.
 
-    final StackWalker walker;
-    final Class<?> declaringClass;
-    final Object memberName;
-    final short bci;
+    private final StackWalker walker;
+    private final Class<?> declaringClass;
+    private final Object memberName;
+    private final short bci;
     private volatile StackTraceElement ste;
 
     /*
@@ -54,9 +53,17 @@
         this.walker = walker;
         this.declaringClass = null;
         this.bci = -1;
-        this.memberName = jlInvokeAccess.newMemberName();
+        this.memberName = JLIA.newMemberName();
     }
 
+    // package-private called by StackStreamFactory to skip
+    // the capability check
+    Class<?> declaringClass() {
+        return declaringClass;
+    }
+
+    // ----- implementation of StackFrame methods
+
     @Override
     public String getClassName() {
         return declaringClass.getName();
@@ -70,31 +77,39 @@
 
     @Override
     public String getMethodName() {
-        return jlInvokeAccess.getName(memberName);
+        return JLIA.getName(memberName);
     }
 
     @Override
-    public final Optional<String> getFileName() {
-        StackTraceElement ste = toStackTraceElement();
-        return ste.getFileName() != null ? Optional.of(ste.getFileName()) : Optional.empty();
+    public int getByteCodeIndex() {
+        return bci;
     }
 
     @Override
-    public final OptionalInt getLineNumber() {
-        StackTraceElement ste = toStackTraceElement();
-        return ste.getLineNumber() > 0 ? OptionalInt.of(ste.getLineNumber()) : OptionalInt.empty();
+    public String getFileName() {
+        if (isNativeMethod())
+            return null;
+
+        return toStackTraceElement().getFileName();
     }
 
     @Override
-    public final boolean isNativeMethod() {
-        StackTraceElement ste = toStackTraceElement();
-        return ste.isNativeMethod();
+    public int getLineNumber() {
+        if (isNativeMethod())
+            return -2;
+
+        return toStackTraceElement().getLineNumber();
+    }
+
+
+    @Override
+    public boolean isNativeMethod() {
+        return JLIA.isNative(memberName);
     }
 
     @Override
     public String toString() {
-        StackTraceElement ste = toStackTraceElement();
-        return ste.toString();
+        return toStackTraceElement().toString();
     }
 
     /**
--- a/jdk/src/java.base/share/classes/java/lang/StackStreamFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/StackStreamFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -78,7 +78,8 @@
      * Performance work and extensive testing is needed to replace the
      * VM built-in backtrace filled in Throwable with the StackWalker.
      */
-    final static boolean isDebug = getProperty("stackwalk.debug", false);
+    final static boolean isDebug =
+            "true".equals(GetPropertyAction.privilegedGetProperty("stackwalk.debug"));
 
     static <T> StackFrameTraverser<T>
         makeStackTraverser(StackWalker walker, Function<? super Stream<StackFrame>, ? extends T> function)
@@ -491,7 +492,7 @@
 
             @Override
             final Class<?> at(int index) {
-                return stackFrames[index].declaringClass;
+                return stackFrames[index].declaringClass();
             }
         }
 
@@ -760,7 +761,7 @@
 
             @Override
             final Class<?> at(int index) {
-                return stackFrames[index].declaringClass;
+                return stackFrames[index].declaringClass();
             }
         }
 
@@ -988,11 +989,4 @@
                 c.getName().startsWith("java.lang.invoke.LambdaForm");
     }
 
-    private static boolean getProperty(String key, boolean value) {
-        String s = GetPropertyAction.getProperty(key);
-        if (s != null) {
-            return Boolean.parseBoolean(s);
-        }
-        return value;
-    }
 }
--- a/jdk/src/java.base/share/classes/java/lang/StackWalker.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/StackWalker.java	Wed Jul 05 21:40:37 2017 +0200
@@ -127,6 +127,20 @@
         public Class<?> getDeclaringClass();
 
         /**
+         * Returns the index to the code array of the {@code Code} attribute
+         * containing the execution point represented by this stack frame.
+         * The code array gives the actual bytes of Java Virtual Machine code
+         * that implement the method.
+         *
+         * @return the index to the code array of the {@code Code} attribute
+         *         containing the execution point represented by this stack frame,
+         *         or a negative number if the method is native.
+         *
+         * @jvms 4.7.3 The {@code Code} Attribute
+         */
+        public int getByteCodeIndex();
+
+        /**
          * Returns the name of the source file containing the execution point
          * represented by this stack frame.  Generally, this corresponds
          * to the {@code SourceFile} attribute of the relevant {@code class}
@@ -135,12 +149,12 @@
          * other than a file, such as an entry in a source repository.
          *
          * @return the name of the file containing the execution point
-         *         represented by this stack frame, or empty {@code Optional}
-         *         is unavailable.
+         *         represented by this stack frame, or {@code null} if
+         *         this information is unavailable.
          *
          * @jvms 4.7.10 The {@code SourceFile} Attribute
          */
-        public Optional<String> getFileName();
+        public String getFileName();
 
         /**
          * Returns the line number of the source line containing the execution
@@ -150,12 +164,12 @@
          * Specification</cite>.
          *
          * @return the line number of the source line containing the execution
-         *         point represented by this stack frame, or empty
-         *         {@code Optional} if this information is unavailable.
+         *         point represented by this stack frame, or a negative number if
+         *         this information is unavailable.
          *
          * @jvms 4.7.12 The {@code LineNumberTable} Attribute
          */
-        public OptionalInt getLineNumber();
+        public int getLineNumber();
 
         /**
          * Returns {@code true} if the method containing the execution point
--- a/jdk/src/java.base/share/classes/java/lang/System.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/System.java	Wed Jul 05 21:40:37 2017 +0200
@@ -69,7 +69,6 @@
 import jdk.internal.logger.LocalizedLoggerWrapper;
 
 import jdk.internal.module.ModuleBootstrap;
-import jdk.internal.module.Modules;
 import jdk.internal.module.ServicesCatalog;
 
 /**
@@ -1924,10 +1923,6 @@
         // initialize the module system
         System.bootLayer = ModuleBootstrap.boot();
 
-        // base module needs to be loose (CODETOOLS-7901619)
-        Module base = Object.class.getModule();
-        Modules.addReads(base, null);
-
         // module system initialized
         VM.initLevel(2);
     }
--- a/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java	Wed Jul 05 21:40:37 2017 +0200
@@ -33,8 +33,6 @@
 import sun.invoke.util.Wrapper;
 
 import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Objects;
 
--- a/jdk/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -88,7 +88,7 @@
 
     static {
         final String key = "jdk.internal.lambda.dumpProxyClasses";
-        String path = GetPropertyAction.getProperty(key);
+        String path = GetPropertyAction.privilegedGetProperty(key);
         dumper = (null == path) ? null : ProxyClassesDumper.getInstance(path);
     }
 
--- a/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java	Wed Jul 05 21:40:37 2017 +0200
@@ -396,7 +396,7 @@
         LambdaForm lform = new LambdaForm(name + ":VarHandle_invoke_MT_" + shortenSignature(basicTypeSignature(mtype)),
                                           ARG_LIMIT + 1, names);
 
-        lform.prepare();
+        lform.compileToBytecode();
         return lform;
     }
 
@@ -448,7 +448,7 @@
         LambdaForm lform = new LambdaForm(name + ":VarHandle_exactInvoker" + shortenSignature(basicTypeSignature(mtype)),
                                           ARG_LIMIT, names);
 
-        lform.prepare();
+        lform.compileToBytecode();
         return lform;
     }
 
@@ -497,44 +497,33 @@
 
     /*non-public*/ static
     @ForceInline
-    MethodHandle checkVarHandleGenericType(VarHandle vh, VarHandle.AccessDescriptor vad) {
-        MethodType expected = vad.symbolicMethodType;
-        MethodType actual = VarHandle.AccessType.getMethodType(vad.type, vh);
-
-        MemberName mn = VarHandle.AccessMode.getMemberName(vad.mode, vh.vform);
-        if (mn == null)
-            throw vh.unsupported();
-        // TODO the following MH is not constant, cache in stable field array
-        // on VarForm?
-        MethodHandle mh = DirectMethodHandle.make(mn);
-        if (actual == expected) {
+    MethodHandle checkVarHandleGenericType(VarHandle handle, VarHandle.AccessDescriptor ad) {
+        // Test for exact match on invoker types
+        // TODO match with erased types and add cast of return value to lambda form
+        MethodHandle mh = handle.getMethodHandle(ad.mode);
+        if (mh.type() == ad.symbolicMethodTypeInvoker) {
             return mh;
         }
         else {
-            // Adapt to the actual (which should never fail since mh's method
-            // type is in the basic form), then to the expected (which my fail
-            // if the symbolic type descriptor does not match)
-            // TODO optimize for the case of actual.erased() == expected.erased()
-            return mh.asType(actual.insertParameterTypes(0, VarHandle.class)).
-                    asType(expected.insertParameterTypes(0, VarHandle.class));
+            return mh.asType(ad.symbolicMethodTypeInvoker);
         }
     }
 
     /*non-public*/ static
     @ForceInline
-    void checkVarHandleExactType(VarHandle vh, VarHandle.AccessDescriptor vad) {
-        MethodType expected = vad.symbolicMethodType;
-        MethodType actual = VarHandle.AccessType.getMethodType(vad.type, vh);
-        if (actual != expected)
-            throw newWrongMethodTypeException(expected, actual);
+    void checkVarHandleExactType(VarHandle handle, VarHandle.AccessDescriptor ad) {
+        MethodType erasedTarget = handle.vform.methodType_table[ad.type];
+        MethodType erasedSymbolic = ad.symbolicMethodTypeErased;
+        if (erasedTarget != erasedSymbolic)
+            throw newWrongMethodTypeException(erasedTarget, erasedSymbolic);
     }
 
     /*non-public*/ static
     @ForceInline
-    MemberName getVarHandleMemberName(VarHandle vh, VarHandle.AccessDescriptor vad) {
-        MemberName mn = VarHandle.AccessMode.getMemberName(vad.mode, vh.vform);
+    MemberName getVarHandleMemberName(VarHandle handle, VarHandle.AccessDescriptor ad) {
+        MemberName mn = handle.vform.memberName_table[ad.mode];
         if (mn == null) {
-            throw vh.unsupported();
+            throw handle.unsupported();
         }
         return mn;
     }
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,6 +25,8 @@
 
 package java.lang.invoke;
 
+import jdk.internal.misc.JavaLangInvokeAccess;
+import jdk.internal.misc.SharedSecrets;
 import sun.invoke.util.BytecodeDescriptor;
 import sun.invoke.util.VerifyAccess;
 
@@ -1143,15 +1145,25 @@
     }
 
     static {
-        // Allow privileged classes outside of java.lang
-        jdk.internal.misc.SharedSecrets.setJavaLangInvokeAccess(new jdk.internal.misc.JavaLangInvokeAccess() {
+        // StackFrameInfo stores Member and this provides the shared secrets
+        // for stack walker to access MemberName information.
+        SharedSecrets.setJavaLangInvokeAccess(new JavaLangInvokeAccess() {
+            @Override
             public Object newMemberName() {
                 return new MemberName();
             }
+
+            @Override
             public String getName(Object mname) {
                 MemberName memberName = (MemberName)mname;
                 return memberName.getName();
             }
+
+            @Override
+            public boolean isNative(Object mname) {
+                MemberName memberName = (MemberName)mname;
+                return memberName.isNative();
+            }
         });
     }
 }
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java	Wed Jul 05 21:40:37 2017 +0200
@@ -430,14 +430,14 @@
 
         // If not polymorphic in the return type, such as the compareAndSet
         // methods that return boolean
-        if (ak.isPolyMorphicInReturnType) {
-            if (ak.returnType != mtype.returnType()) {
+        if (ak.at.isMonomorphicInReturnType) {
+            if (ak.at.returnType != mtype.returnType()) {
                 // The caller contains a different return type than that
                 // defined by the method
                 throw newNoSuchMethodErrorOnVarHandle(name, mtype);
             }
             // Adjust the return type of the signature method type
-            sigType = sigType.changeReturnType(ak.returnType);
+            sigType = sigType.changeReturnType(ak.at.returnType);
         }
 
         // Get the guard method type for linking
@@ -455,26 +455,25 @@
             MemberName linker = new MemberName(
                     VarHandleGuards.class, "guard_" + getVarHandleMethodSignature(sigType),
                     guardType, REF_invokeStatic);
-            try {
-                return MemberName.getFactory().resolveOrFail(
-                        REF_invokeStatic, linker, VarHandleGuards.class, ReflectiveOperationException.class);
-            } catch (ReflectiveOperationException ex) {
-                // Fall back to lambda form linkage if guard method is not available
-                // TODO Optionally log fallback ?
+
+            linker = MemberName.getFactory().resolveOrNull(REF_invokeStatic, linker,
+                                                           VarHandleGuards.class);
+            if (linker != null) {
+                return linker;
             }
+            // Fall back to lambda form linkage if guard method is not available
+            // TODO Optionally log fallback ?
         }
         return Invokers.varHandleInvokeLinkerMethod(name, mtype);
     }
     static String getVarHandleMethodSignature(MethodType mt) {
-        StringBuilder sb = new StringBuilder(mt.parameterCount() + 1);
+        StringBuilder sb = new StringBuilder(mt.parameterCount() + 2);
 
         for (int i = 0; i < mt.parameterCount(); i++) {
             Class<?> pt = mt.parameterType(i);
             sb.append(getCharType(pt));
         }
-
         sb.append('_').append(getCharType(mt.returnType()));
-
         return sb.toString();
     }
     static char getCharType(Class<?> pt) {
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java	Wed Jul 05 21:40:37 2017 +0200
@@ -53,7 +53,7 @@
     static final boolean VAR_HANDLE_GUARDS;
 
     static {
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         DEBUG_METHOD_HANDLE_NAMES = Boolean.parseBoolean(
                 props.getProperty("java.lang.invoke.MethodHandle.DEBUG_NAMES"));
         DUMP_CLASS_FILES = Boolean.parseBoolean(
--- a/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -197,7 +197,7 @@
         // DEBUG = false;        // implied
         // DUMPER = null;        // implied
 
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         final String strategy =
                 props.getProperty("java.lang.invoke.stringConcat");
         CACHE_ENABLE = Boolean.parseBoolean(
--- a/jdk/src/java.base/share/classes/java/lang/invoke/VarForm.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarForm.java	Wed Jul 05 21:40:37 2017 +0200
@@ -24,42 +24,102 @@
  */
 package java.lang.invoke;
 
+import jdk.internal.vm.annotation.ForceInline;
 import jdk.internal.vm.annotation.Stable;
 
 import java.lang.invoke.VarHandle.AccessMode;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * A var handle form containing a set of member name, one for each operation.
  * Each member characterizes a static method.
  */
-class VarForm {
+final class VarForm {
+
+    final @Stable MethodType[] methodType_table;
+
+    final @Stable MemberName[] memberName_table;
+
+    VarForm(Class<?> implClass, Class<?> receiver, Class<?> value, Class<?>... intermediate) {
+        this.methodType_table = new MethodType[VarHandle.AccessType.values().length];
+
+        // TODO lazily calculate
+        this.memberName_table = linkFromStatic(implClass);
+
+        // (Receiver, <Intermediates>)
+        List<Class<?>> l = new ArrayList<>();
+        if (receiver != null)
+            l.add(receiver);
+        l.addAll(Arrays.asList(intermediate));
 
-    // Holds VarForm for VarHandle implementation classes
-    private static final ClassValue<VarForm> VFORMS
-            = new ClassValue<>() {
-        @Override
-        protected VarForm computeValue(Class<?> impl) {
-            return new VarForm(linkFromStatic(impl));
-        }
-    };
+        // (Receiver, <Intermediates>)Value
+        methodType_table[VarHandle.AccessType.GET.ordinal()] =
+                MethodType.methodType(value, l).erase();
+
+        // (Receiver, <Intermediates>, Value)void
+        l.add(value);
+        methodType_table[VarHandle.AccessType.SET.ordinal()] =
+                MethodType.methodType(void.class, l).erase();
 
-    final @Stable MemberName[] table;
+        // (Receiver, <Intermediates>, Value)Value
+        methodType_table[VarHandle.AccessType.GET_AND_UPDATE.ordinal()] =
+                MethodType.methodType(value, l).erase();
 
-    VarForm(MemberName[] table) {
-        this.table = table;
+        // (Receiver, <Intermediates>, Value, Value)boolean
+        l.add(value);
+        methodType_table[VarHandle.AccessType.COMPARE_AND_SWAP.ordinal()] =
+                MethodType.methodType(boolean.class, l).erase();
+
+        // (Receiver, <Intermediates>, Value, Value)Value
+        methodType_table[VarHandle.AccessType.COMPARE_AND_EXCHANGE.ordinal()] =
+                MethodType.methodType(value, l).erase();
     }
 
-    /**
-     * Creates a var form given an VarHandle implementation class.
-     * Each signature polymorphic method is linked to a static method of the
-     * same name on the implementation class or a super class.
-     */
-    static VarForm createFromStatic(Class<? extends VarHandle> impl) {
-        return VFORMS.get(impl);
+    @ForceInline
+    final MethodType getMethodType(int type) {
+        return methodType_table[type];
+    }
+
+    @ForceInline
+    final MemberName getMemberName(int mode) {
+        // TODO calculate lazily
+        MemberName mn = memberName_table[mode];
+        if (mn == null) {
+            throw new UnsupportedOperationException();
+        }
+        return mn;
     }
 
+
+    @Stable
+    MethodType[] methodType_V_table;
+
+    @ForceInline
+    final MethodType[] getMethodType_V_init() {
+        MethodType[] table = new MethodType[VarHandle.AccessType.values().length];
+        for (int i = 0; i < methodType_table.length; i++) {
+            MethodType mt = methodType_table[i];
+            // TODO only adjust for sig-poly methods returning Object
+            table[i] = mt.changeReturnType(void.class);
+        }
+        methodType_V_table = table;
+        return table;
+    }
+
+    @ForceInline
+    final MethodType getMethodType_V(int type) {
+        MethodType[] table = methodType_V_table;
+        if (table == null) {
+            table = getMethodType_V_init();
+        }
+        return table[type];
+    }
+
+
     /**
      * Link all signature polymorphic methods.
      */
--- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,10 +27,9 @@
 
 import jdk.internal.HotSpotIntrinsicCandidate;
 import jdk.internal.vm.annotation.ForceInline;
+import jdk.internal.vm.annotation.Stable;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -406,42 +405,10 @@
  * @since 9
  */
 public abstract class VarHandle {
-    // Use explicit final fields rather than an @Stable array as
-    // this can reduce the memory per handle
-    // e.g. by 24 bytes on 64 bit architectures
-    final MethodType typeGet;
-    final MethodType typeSet;
-    final MethodType typeCompareSwap;
-    final MethodType typeCompareExchange;
-    final MethodType typeGetAndUpdate;
-
     final VarForm vform;
 
-    VarHandle(VarForm vform, Class<?> receiver, Class<?> value, Class<?>... intermediate) {
+    VarHandle(VarForm vform) {
         this.vform = vform;
-
-        // (Receiver, <Intermediates>)
-        List<Class<?>> l = new ArrayList<>();
-        if (receiver != null)
-            l.add(receiver);
-        l.addAll(Arrays.asList(intermediate));
-
-        // (Receiver, <Intermediates>)Value
-        this.typeGet = MethodType.methodType(value, l);
-
-        // (Receiver, <Intermediates>, Value)void
-        l.add(value);
-        this.typeSet = MethodType.methodType(void.class, l);
-
-        // (Receiver, <Intermediates>, Value)Value
-        this.typeGetAndUpdate = MethodType.methodType(value, l);
-
-        // (Receiver, <Intermediates>, Value, Value)boolean
-        l.add(value);
-        this.typeCompareSwap = MethodType.methodType(boolean.class, l);
-
-        // (Receiver, <Intermediates>, Value, Value)Value
-        this.typeCompareExchange = MethodType.methodType(value, l);
     }
 
     RuntimeException unsupported() {
@@ -1090,36 +1057,83 @@
     Object addAndGet(Object... args);
 
     enum AccessType {
-        GET,                    // 0
-        SET,                    // 1
-        COMPARE_AND_SWAP,       // 2
-        COMPARE_AND_EXCHANGE,   // 3
-        GET_AND_UPDATE;         // 4
+        GET(Object.class) {
+            @Override
+            MethodType accessModeType(Class<?> receiver, Class<?> value,
+                                      Class<?>... intermediate) {
+                Class<?>[] ps =  allocateParameters(0, receiver, intermediate);
+                fillParameters(ps, receiver, intermediate);
+                return MethodType.methodType(value, ps);
+            }
+        },
+        SET(void.class) {
+            @Override
+            MethodType accessModeType(Class<?> receiver, Class<?> value,
+                                      Class<?>... intermediate) {
+                Class<?>[] ps =  allocateParameters(1, receiver, intermediate);
+                int i = fillParameters(ps, receiver, intermediate);
+                ps[i] = value;
+                return MethodType.methodType(void.class, ps);
+            }
+        },
+        COMPARE_AND_SWAP(boolean.class) {
+            @Override
+            MethodType accessModeType(Class<?> receiver, Class<?> value,
+                                      Class<?>... intermediate) {
+                Class<?>[] ps =  allocateParameters(2, receiver, intermediate);
+                int i = fillParameters(ps, receiver, intermediate);
+                ps[i++] = value;
+                ps[i] = value;
+                return MethodType.methodType(boolean.class, ps);
+            }
+        },
+        COMPARE_AND_EXCHANGE(Object.class) {
+            @Override
+            MethodType accessModeType(Class<?> receiver, Class<?> value,
+                                      Class<?>... intermediate) {
+                Class<?>[] ps =  allocateParameters(2, receiver, intermediate);
+                int i = fillParameters(ps, receiver, intermediate);
+                ps[i++] = value;
+                ps[i] = value;
+                return MethodType.methodType(value, ps);
+            }
+        },
+        GET_AND_UPDATE(Object.class) {
+            @Override
+            MethodType accessModeType(Class<?> receiver, Class<?> value,
+                                      Class<?>... intermediate) {
+                Class<?>[] ps =  allocateParameters(1, receiver, intermediate);
+                int i = fillParameters(ps, receiver, intermediate);
+                ps[i] = value;
+                return MethodType.methodType(value, ps);
+            }
+        };
 
-        MethodType getMethodType(VarHandle vh) {
-            return getMethodType(this.ordinal(), vh);
+        final Class<?> returnType;
+        final boolean isMonomorphicInReturnType;
+
+        AccessType(Class<?> returnType) {
+            this.returnType = returnType;
+            isMonomorphicInReturnType = returnType != Object.class;
         }
 
-        @ForceInline
-        static MethodType getMethodType(int ordinal, VarHandle vh) {
-            if (ordinal == 0) {
-                return vh.typeGet;
-            }
-            else if (ordinal == 1) {
-                return vh.typeSet;
-            }
-            else if (ordinal == 2) {
-                return vh.typeCompareSwap;
-            }
-            else if (ordinal == 3) {
-                return vh.typeCompareExchange;
-            }
-            else if (ordinal == 4) {
-                return vh.typeGetAndUpdate;
-            }
-            else {
-                throw new IllegalStateException("Illegal access type: " + ordinal);
-            }
+        abstract MethodType accessModeType(Class<?> receiver, Class<?> value,
+                                           Class<?>... intermediate);
+
+        private static Class<?>[] allocateParameters(int values,
+                                                     Class<?> receiver, Class<?>... intermediate) {
+            int size = ((receiver != null) ? 1 : 0) + intermediate.length + values;
+            return new Class<?>[size];
+        }
+
+        private static int fillParameters(Class<?>[] ps,
+                                          Class<?> receiver, Class<?>... intermediate) {
+            int i = 0;
+            if (receiver != null)
+                ps[i++] = receiver;
+            for (int j = 0; j < intermediate.length; j++)
+                ps[i++] = intermediate[j];
+            return i;
         }
     }
 
@@ -1133,115 +1147,115 @@
          * method
          * {@link VarHandle#get VarHandle.get}
          */
-        GET("get", AccessType.GET, Object.class),
+        GET("get", AccessType.GET),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#set VarHandle.set}
          */
-        SET("set", AccessType.SET, void.class),
+        SET("set", AccessType.SET),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#getVolatile VarHandle.getVolatile}
          */
-        GET_VOLATILE("getVolatile", AccessType.GET, Object.class),
+        GET_VOLATILE("getVolatile", AccessType.GET),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#setVolatile VarHandle.setVolatile}
          */
-        SET_VOLATILE("setVolatile", AccessType.SET, void.class),
+        SET_VOLATILE("setVolatile", AccessType.SET),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#getAcquire VarHandle.getAcquire}
          */
-        GET_ACQUIRE("getAcquire", AccessType.GET, Object.class),
+        GET_ACQUIRE("getAcquire", AccessType.GET),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#setRelease VarHandle.setRelease}
          */
-        SET_RELEASE("setRelease", AccessType.SET, void.class),
+        SET_RELEASE("setRelease", AccessType.SET),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#getOpaque VarHandle.getOpaque}
          */
-        GET_OPAQUE("getOpaque", AccessType.GET, Object.class),
+        GET_OPAQUE("getOpaque", AccessType.GET),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#setOpaque VarHandle.setOpaque}
          */
-        SET_OPAQUE("setOpaque", AccessType.SET, void.class),
+        SET_OPAQUE("setOpaque", AccessType.SET),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#compareAndSet VarHandle.compareAndSet}
          */
-        COMPARE_AND_SET("compareAndSet", AccessType.COMPARE_AND_SWAP, boolean.class),
+        COMPARE_AND_SET("compareAndSet", AccessType.COMPARE_AND_SWAP),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#compareAndExchangeVolatile VarHandle.compareAndExchangeVolatile}
          */
-        COMPARE_AND_EXCHANGE_VOLATILE("compareAndExchangeVolatile", AccessType.COMPARE_AND_EXCHANGE, Object.class),
+        COMPARE_AND_EXCHANGE_VOLATILE("compareAndExchangeVolatile", AccessType.COMPARE_AND_EXCHANGE),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#compareAndExchangeAcquire VarHandle.compareAndExchangeAcquire}
          */
-        COMPARE_AND_EXCHANGE_ACQUIRE("compareAndExchangeAcquire", AccessType.COMPARE_AND_EXCHANGE, Object.class),
+        COMPARE_AND_EXCHANGE_ACQUIRE("compareAndExchangeAcquire", AccessType.COMPARE_AND_EXCHANGE),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#compareAndExchangeRelease VarHandle.compareAndExchangeRelease}
          */
-        COMPARE_AND_EXCHANGE_RELEASE("compareAndExchangeRelease", AccessType.COMPARE_AND_EXCHANGE, Object.class),
+        COMPARE_AND_EXCHANGE_RELEASE("compareAndExchangeRelease", AccessType.COMPARE_AND_EXCHANGE),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#weakCompareAndSet VarHandle.weakCompareAndSet}
          */
-        WEAK_COMPARE_AND_SET("weakCompareAndSet", AccessType.COMPARE_AND_SWAP, boolean.class),
+        WEAK_COMPARE_AND_SET("weakCompareAndSet", AccessType.COMPARE_AND_SWAP),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#weakCompareAndSetVolatile VarHandle.weakCompareAndSetVolatile}
          */
-        WEAK_COMPARE_AND_SET_VOLATILE("weakCompareAndSetVolatile", AccessType.COMPARE_AND_SWAP, boolean.class),
+        WEAK_COMPARE_AND_SET_VOLATILE("weakCompareAndSetVolatile", AccessType.COMPARE_AND_SWAP),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#weakCompareAndSetAcquire VarHandle.weakCompareAndSetAcquire}
          */
-        WEAK_COMPARE_AND_SET_ACQUIRE("weakCompareAndSetAcquire", AccessType.COMPARE_AND_SWAP, boolean.class),
+        WEAK_COMPARE_AND_SET_ACQUIRE("weakCompareAndSetAcquire", AccessType.COMPARE_AND_SWAP),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#weakCompareAndSetRelease VarHandle.weakCompareAndSetRelease}
          */
-        WEAK_COMPARE_AND_SET_RELEASE("weakCompareAndSetRelease", AccessType.COMPARE_AND_SWAP, boolean.class),
+        WEAK_COMPARE_AND_SET_RELEASE("weakCompareAndSetRelease", AccessType.COMPARE_AND_SWAP),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#getAndSet VarHandle.getAndSet}
          */
-        GET_AND_SET("getAndSet", AccessType.GET_AND_UPDATE, Object.class),
+        GET_AND_SET("getAndSet", AccessType.GET_AND_UPDATE),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#getAndAdd VarHandle.getAndAdd}
          */
-        GET_AND_ADD("getAndAdd", AccessType.GET_AND_UPDATE, Object.class),
+        GET_AND_ADD("getAndAdd", AccessType.GET_AND_UPDATE),
         /**
          * The access mode whose access is specified by the corresponding
          * method
          * {@link VarHandle#addAndGet VarHandle.addAndGet}
          */
-        ADD_AND_GET("addAndGet", AccessType.GET_AND_UPDATE, Object.class),
+        ADD_AND_GET("addAndGet", AccessType.GET_AND_UPDATE),
         ;
 
         static final Map<String, AccessMode> methodNameToAccessMode;
@@ -1256,10 +1270,8 @@
 
         final String methodName;
         final AccessType at;
-        final boolean isPolyMorphicInReturnType;
-        final Class<?> returnType;
 
-        AccessMode(final String methodName, AccessType at, Class<?> returnType) {
+        AccessMode(final String methodName, AccessType at) {
             this.methodName = methodName;
             this.at = at;
 
@@ -1267,10 +1279,7 @@
             assert methodName.equals(toMethodName(name()));
             // Assert that return type is correct
             // Otherwise, when disabled avoid using reflection
-            assert returnType == getReturnType(methodName);
-
-            this.returnType = returnType;
-            isPolyMorphicInReturnType = returnType != Object.class;
+            assert at.returnType == getReturnType(methodName);
         }
 
         /**
@@ -1324,17 +1333,21 @@
 
         @ForceInline
         static MemberName getMemberName(int ordinal, VarForm vform) {
-            return vform.table[ordinal];
+            return vform.memberName_table[ordinal];
         }
     }
 
     static final class AccessDescriptor {
-        final MethodType symbolicMethodType;
+        final MethodType symbolicMethodTypeErased;
+        final MethodType symbolicMethodTypeInvoker;
+        final Class<?> returnType;
         final int type;
         final int mode;
 
         public AccessDescriptor(MethodType symbolicMethodType, int type, int mode) {
-            this.symbolicMethodType = symbolicMethodType;
+            this.symbolicMethodTypeErased = symbolicMethodType.erase();
+            this.symbolicMethodTypeInvoker = symbolicMethodType.insertParameterTypes(0, VarHandle.class);
+            this.returnType = symbolicMethodType.returnType();
             this.type = type;
             this.mode = mode;
         }
@@ -1346,6 +1359,7 @@
      * @return the variable type of variables referenced by this VarHandle
      */
     public final Class<?> varType() {
+        MethodType typeSet = accessModeType(AccessMode.SET);
         return typeSet.parameterType(typeSet.parameterCount() - 1);
     }
 
@@ -1356,6 +1370,7 @@
      * list is unmodifiable
      */
     public final List<Class<?>> coordinateTypes() {
+        MethodType typeGet = accessModeType(AccessMode.GET);
         return typeGet.parameterList();
     }
 
@@ -1374,9 +1389,15 @@
      * @return the access mode type for the given access mode
      */
     public final MethodType accessModeType(AccessMode accessMode) {
-        return accessMode.at.getMethodType(this);
+        TypesAndInvokers tis = getTypesAndInvokers();
+        MethodType mt = tis.methodType_table[accessMode.at.ordinal()];
+        if (mt == null) {
+            mt = tis.methodType_table[accessMode.at.ordinal()] =
+                    accessModeTypeUncached(accessMode);
+        }
+        return mt;
     }
-
+    abstract MethodType accessModeTypeUncached(AccessMode accessMode);
 
     /**
      * Returns {@code true} if the given access mode is supported, otherwise
@@ -1417,9 +1438,8 @@
     public final MethodHandle toMethodHandle(AccessMode accessMode) {
         MemberName mn = AccessMode.getMemberName(accessMode.ordinal(), vform);
         if (mn != null) {
-            return DirectMethodHandle.make(mn).
-                    bindTo(this).
-                    asType(accessMode.at.getMethodType(this));
+            MethodHandle mh = getMethodHandle(accessMode.ordinal());
+            return mh.bindTo(this);
         }
         else {
             // Ensure an UnsupportedOperationException is thrown
@@ -1428,6 +1448,51 @@
         }
     }
 
+    @Stable
+    TypesAndInvokers typesAndInvokers;
+
+    static class TypesAndInvokers {
+        final @Stable
+        MethodType[] methodType_table =
+                new MethodType[VarHandle.AccessType.values().length];
+
+        final @Stable
+        MethodHandle[] methodHandle_table =
+                new MethodHandle[AccessMode.values().length];
+    }
+
+    @ForceInline
+    private final TypesAndInvokers getTypesAndInvokers() {
+        TypesAndInvokers tis = typesAndInvokers;
+        if (tis == null) {
+            tis = typesAndInvokers = new TypesAndInvokers();
+        }
+        return tis;
+    }
+
+    @ForceInline
+    final MethodHandle getMethodHandle(int mode) {
+        TypesAndInvokers tis = getTypesAndInvokers();
+        MethodHandle mh = tis.methodHandle_table[mode];
+        if (mh == null) {
+            mh = tis.methodHandle_table[mode] = getMethodHandleUncached(tis, mode);
+        }
+        return mh;
+    }
+    private final MethodHandle getMethodHandleUncached(TypesAndInvokers tis, int mode) {
+        MethodType mt = accessModeType(AccessMode.values()[mode]).
+                insertParameterTypes(0, VarHandle.class);
+        MemberName mn = vform.getMemberName(mode);
+        DirectMethodHandle dmh = DirectMethodHandle.make(mn);
+        // Such a method handle must not be publically exposed directly
+        // otherwise it can be cracked, it must be transformed or rebound
+        // before exposure
+        MethodHandle mh = dmh.copyWith(mt, dmh.form);
+        assert mh.type().erase() == mn.getMethodType().erase();
+        return mh;
+    }
+
+
     /*non-public*/
     final void updateVarForm(VarForm newVForm) {
         if (vform == newVForm) return;
@@ -1453,6 +1518,10 @@
         catch (ReflectiveOperationException e) {
             throw newInternalError(e);
         }
+
+        // The VarHandleGuards must be initialized to ensure correct
+        // compilation of the guard methods
+        UNSAFE.ensureClassInitialized(VarHandleGuards.class);
     }
 
 
--- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandleGuards.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandleGuards.java	Wed Jul 05 21:40:37 2017 +0200
@@ -30,1361 +30,1008 @@
 final class VarHandleGuards {
 
     @ForceInline
-    final static MemberName getMemberName(VarHandle handle, VarHandle.AccessDescriptor ad) {
-        MemberName mn = VarHandle.AccessMode.getMemberName(ad.mode, handle.vform);
-        if (mn == null) {
-            throw handle.unsupported();
-        }
-        return mn;
-    }
-
-    @ForceInline
     @LambdaForm.Compiled
     final static Object guard_L_L(VarHandle handle, Object arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            Object r = MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-            return symbolic.returnType().cast(r);
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            Object r = MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
+            return ad.returnType.cast(r);
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LL_V(VarHandle handle, Object arg0, Object arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static Object guard_LL_L(VarHandle handle, Object arg0, Object arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-            return symbolic.returnType().cast(r);
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
+            return ad.returnType.cast(r);
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LLL_Z(VarHandle handle, Object arg0, Object arg1, Object arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static Object guard_LLL_L(VarHandle handle, Object arg0, Object arg1, Object arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-            return symbolic.returnType().cast(r);
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
+            return ad.returnType.cast(r);
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_L_I(VarHandle handle, Object arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LI_V(VarHandle handle, Object arg0, int arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_LI_I(VarHandle handle, Object arg0, int arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LII_Z(VarHandle handle, Object arg0, int arg1, int arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_LII_I(VarHandle handle, Object arg0, int arg1, int arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_L_J(VarHandle handle, Object arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LJ_V(VarHandle handle, Object arg0, long arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_LJ_J(VarHandle handle, Object arg0, long arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LJJ_Z(VarHandle handle, Object arg0, long arg1, long arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_LJJ_J(VarHandle handle, Object arg0, long arg1, long arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard_L_F(VarHandle handle, Object arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LF_V(VarHandle handle, Object arg0, float arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard_LF_F(VarHandle handle, Object arg0, float arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LFF_Z(VarHandle handle, Object arg0, float arg1, float arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard_LFF_F(VarHandle handle, Object arg0, float arg1, float arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard_L_D(VarHandle handle, Object arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LD_V(VarHandle handle, Object arg0, double arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard_LD_D(VarHandle handle, Object arg0, double arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LDD_Z(VarHandle handle, Object arg0, double arg1, double arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard_LDD_D(VarHandle handle, Object arg0, double arg1, double arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static Object guard__L(VarHandle handle, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            Object r = MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
-            return symbolic.returnType().cast(r);
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            Object r = MethodHandle.linkToStatic(handle, handle.vform.getMemberName(ad.mode));
+            return ad.returnType.cast(r);
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return vh_invoker.invokeBasic(handle);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_L_V(VarHandle handle, Object arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LL_Z(VarHandle handle, Object arg0, Object arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard__I(VarHandle handle, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_I_V(VarHandle handle, int arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_I_I(VarHandle handle, int arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_II_Z(VarHandle handle, int arg0, int arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_II_I(VarHandle handle, int arg0, int arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard__J(VarHandle handle, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_J_V(VarHandle handle, long arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_J_J(VarHandle handle, long arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_JJ_Z(VarHandle handle, long arg0, long arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_JJ_J(VarHandle handle, long arg0, long arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard__F(VarHandle handle, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_F_V(VarHandle handle, float arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard_F_F(VarHandle handle, float arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_FF_Z(VarHandle handle, float arg0, float arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard_FF_F(VarHandle handle, float arg0, float arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard__D(VarHandle handle, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_D_V(VarHandle handle, double arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard_D_D(VarHandle handle, double arg0, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, arg0, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle, arg0);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_DD_Z(VarHandle handle, double arg0, double arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard_DD_D(VarHandle handle, double arg0, double arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static Object guard_LI_L(VarHandle handle, Object arg0, int arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-            return symbolic.returnType().cast(r);
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
+            return ad.returnType.cast(r);
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LIL_V(VarHandle handle, Object arg0, int arg1, Object arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static Object guard_LIL_L(VarHandle handle, Object arg0, int arg1, Object arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-            return symbolic.returnType().cast(r);
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
+            return ad.returnType.cast(r);
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LILL_Z(VarHandle handle, Object arg0, int arg1, Object arg2, Object arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static Object guard_LILL_L(VarHandle handle, Object arg0, int arg1, Object arg2, Object arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-            return symbolic.returnType().cast(r);
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            Object r = MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
+            return ad.returnType.cast(r);
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LII_V(VarHandle handle, Object arg0, int arg1, int arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LIII_Z(VarHandle handle, Object arg0, int arg1, int arg2, int arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_LIII_I(VarHandle handle, Object arg0, int arg1, int arg2, int arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_LI_J(VarHandle handle, Object arg0, int arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LIJ_V(VarHandle handle, Object arg0, int arg1, long arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_LIJ_J(VarHandle handle, Object arg0, int arg1, long arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LIJJ_Z(VarHandle handle, Object arg0, int arg1, long arg2, long arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_LIJJ_J(VarHandle handle, Object arg0, int arg1, long arg2, long arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard_LI_F(VarHandle handle, Object arg0, int arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LIF_V(VarHandle handle, Object arg0, int arg1, float arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard_LIF_F(VarHandle handle, Object arg0, int arg1, float arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LIFF_Z(VarHandle handle, Object arg0, int arg1, float arg2, float arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static float guard_LIFF_F(VarHandle handle, Object arg0, int arg1, float arg2, float arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (float) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (float) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (float) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard_LI_D(VarHandle handle, Object arg0, int arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LID_V(VarHandle handle, Object arg0, int arg1, double arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard_LID_D(VarHandle handle, Object arg0, int arg1, double arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LIDD_Z(VarHandle handle, Object arg0, int arg1, double arg2, double arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static double guard_LIDD_D(VarHandle handle, Object arg0, int arg1, double arg2, double arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (double) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (double) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (double) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_LJ_I(VarHandle handle, Object arg0, long arg1, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0, arg1);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LJI_V(VarHandle handle, Object arg0, long arg1, int arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_LJI_I(VarHandle handle, Object arg0, long arg1, int arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LJII_Z(VarHandle handle, Object arg0, long arg1, int arg2, int arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static int guard_LJII_I(VarHandle handle, Object arg0, long arg1, int arg2, int arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (int) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (int) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (int) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static void guard_LJJ_V(VarHandle handle, Object arg0, long arg1, long arg2, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
-        else if (target.erase() == symbolic.erase()) {
-            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, getMemberName(handle, ad));
+        else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodTypeErased) {
+            MethodHandle.linkToStatic(handle, arg0, arg1, arg2, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            vh_invoker.invokeBasic(handle, arg0, arg1, arg2);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static boolean guard_LJJJ_Z(VarHandle handle, Object arg0, long arg1, long arg2, long arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (boolean) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (boolean) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (boolean) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
     @ForceInline
     @LambdaForm.Compiled
     final static long guard_LJJJ_J(VarHandle handle, Object arg0, long arg1, long arg2, long arg3, VarHandle.AccessDescriptor ad) throws Throwable {
-        MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);
-        MethodType symbolic = ad.symbolicMethodType;
-        if (target == symbolic) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
-        }
-        else if (target.erase() == symbolic.erase()) {
-            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, getMemberName(handle, ad));
+        if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodTypeErased) {
+            return (long) MethodHandle.linkToStatic(handle, arg0, arg1, arg2, arg3, handle.vform.getMemberName(ad.mode));
         }
         else {
-            MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);
-            return (long) vh_invoker.invokeBasic(handle, arg0, arg1, arg2, arg3);
+            MethodHandle mh = handle.getMethodHandle(ad.mode);
+            return (long) mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(handle, arg0, arg1, arg2, arg3);
         }
     }
 
--- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandles.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandles.java	Wed Jul 05 21:40:37 2017 +0200
@@ -280,28 +280,29 @@
 //                "@ForceInline\n" +
 //                "@LambdaForm.Compiled\n" +
 //                "final static <METHOD> throws Throwable {\n" +
-//                "    MethodType target = VarHandle.AccessType.getMethodType(ad.type, handle);\n" +
-//                "    MethodType symbolic = ad.symbolicMethodType;\n" +
-//                "    if (target == symbolic) {\n" +
-//                "        <RETURN>MethodHandle.linkToStatic(<LINK_TO_STATIC_ARGS>);\n" +
-//                "    }\n" +
-//                "    else if (target.erase() == symbolic.erase()) {\n" +
+//                "    if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodType) {\n" +
 //                "        <RESULT_ERASED>MethodHandle.linkToStatic(<LINK_TO_STATIC_ARGS>);<RETURN_ERASED>\n" +
 //                "    }\n" +
 //                "    else {\n" +
-//                "        MethodHandle vh_invoker = MethodHandles.varHandleInvoker(VarHandle.AccessMode.values()[ad.mode], symbolic);\n" +
-//                "        <RETURN>vh_invoker.invokeBasic(<LINK_TO_INVOKER_ARGS>);\n" +
+//                "        MethodHandle mh = handle.getMethodHandle(ad.mode);\n" +
+//                "        <RETURN>mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(<LINK_TO_INVOKER_ARGS>);\n" +
 //                "    }\n" +
 //                "}";
 //
-//        static final String GET_MEMBER_NAME_METHOD =
+//        static final String GUARD_METHOD_TEMPLATE_V =
 //                "@ForceInline\n" +
-//                "final static MemberName getMemberName(VarHandle handle, VarHandle.AccessDescriptor ad) {\n" +
-//                "    MemberName mn = VarHandle.AccessMode.getMemberName(ad.mode, handle.vform);\n" +
-//                "    if (mn == null) {\n" +
-//                "        throw handle.unsupported();\n" +
+//                "@LambdaForm.Compiled\n" +
+//                "final static <METHOD> throws Throwable {\n" +
+//                "    if (handle.vform.methodType_table[ad.type] == ad.symbolicMethodType) {\n" +
+//                "        MethodHandle.linkToStatic(<LINK_TO_STATIC_ARGS>);\n" +
 //                "    }\n" +
-//                "    return mn;\n" +
+//                "    else if (handle.vform.getMethodType_V(ad.type) == ad.symbolicMethodType) {\n" +
+//                "        MethodHandle.linkToStatic(<LINK_TO_STATIC_ARGS>);\n" +
+//                "    }\n" +
+//                "    else {\n" +
+//                "        MethodHandle mh = handle.getMethodHandle(ad.mode);\n" +
+//                "        mh.asType(ad.symbolicMethodTypeInvoker).invokeBasic(<LINK_TO_INVOKER_ARGS>);\n" +
+//                "    }\n" +
 //                "}";
 //
 //        // A template for deriving the operations
@@ -345,8 +346,6 @@
 //            System.out.println("final class VarHandleGuards {");
 //
 //            System.out.println();
-//            System.out.println(GET_MEMBER_NAME_METHOD);
-//            System.out.println();
 //
 //            // Declare the stream of shapes
 //            Stream<HandleType> hts = Stream.of(
@@ -445,7 +444,10 @@
 //
 //            List<String> LINK_TO_STATIC_ARGS = params.keySet().stream().
 //                    collect(toList());
-//            LINK_TO_STATIC_ARGS.add("getMemberName(handle, ad)");
+//            LINK_TO_STATIC_ARGS.add("handle.vform.getMemberName(ad.mode)");
+//            List<String> LINK_TO_STATIC_ARGS_V = params.keySet().stream().
+//                    collect(toList());
+//            LINK_TO_STATIC_ARGS_V.add("handle.vform.getMemberName_V(ad.mode)");
 //
 //            List<String> LINK_TO_INVOKER_ARGS = params.keySet().stream().
 //                    collect(toList());
@@ -464,9 +466,12 @@
 //
 //            String RETURN_ERASED = returnType != Object.class
 //                                   ? ""
-//                                   : " return symbolic.returnType().cast(r);";
+//                                   : " return ad.returnType.cast(r);";
 //
-//            return GUARD_METHOD_TEMPLATE.
+//            String template = returnType == void.class
+//                              ? GUARD_METHOD_TEMPLATE_V
+//                              : GUARD_METHOD_TEMPLATE;
+//            return template.
 //                    replace("<METHOD>", METHOD).
 //                    replace("<NAME>", NAME).
 //                    replaceAll("<RETURN>", RETURN).
@@ -474,6 +479,8 @@
 //                    replace("<RETURN_ERASED>", RETURN_ERASED).
 //                    replaceAll("<LINK_TO_STATIC_ARGS>", LINK_TO_STATIC_ARGS.stream().
 //                            collect(joining(", "))).
+//                    replaceAll("<LINK_TO_STATIC_ARGS_V>", LINK_TO_STATIC_ARGS_V.stream().
+//                            collect(joining(", "))).
 //                    replace("<LINK_TO_INVOKER_ARGS>", LINK_TO_INVOKER_ARGS.stream().
 //                            collect(joining(", ")))
 //                    ;
--- a/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template	Wed Jul 05 21:40:37 2017 +0200
@@ -41,12 +41,12 @@
 #end[Object]
 
         FieldInstanceReadOnly(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
-            this(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadOnly.class);
+            this(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadOnly.FORM);
         }
 
         protected FieldInstanceReadOnly(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType},
-                                        Class<? extends FieldInstanceReadOnly> handle) {
-            super(VarForm.createFromStatic(handle), receiverType, {#if[Object]?fieldType:$type$.class});
+                                        VarForm form) {
+            super(form);
             this.fieldOffset = fieldOffset;
             this.receiverType = receiverType;
 #if[Object]
@@ -54,6 +54,11 @@
 #end[Object]
         }
 
+        @Override
+        final MethodType accessModeTypeUncached(AccessMode accessMode) {
+            return accessMode.at.accessModeType(receiverType, {#if[Object]?fieldType:$type$.class});
+        }
+
         @ForceInline
         static $type$ get(FieldInstanceReadOnly handle, Object holder) {
             return UNSAFE.get$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
@@ -77,12 +82,14 @@
             return UNSAFE.get$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
                                  handle.fieldOffset);
         }
+
+        static final VarForm FORM = new VarForm(FieldInstanceReadOnly.class, Object.class, $type$.class);
     }
 
-    static class FieldInstanceReadWrite extends FieldInstanceReadOnly {
+    static final class FieldInstanceReadWrite extends FieldInstanceReadOnly {
 
         FieldInstanceReadWrite(Class<?> receiverType, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
-            super(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadWrite.class);
+            super(receiverType, fieldOffset{#if[Object]?, fieldType}, FieldInstanceReadWrite.FORM);
         }
 
         @ForceInline
@@ -202,6 +209,8 @@
                                        value) + value;
         }
 #end[AtomicAdd]
+
+        static final VarForm FORM = new VarForm(FieldInstanceReadWrite.class, Object.class, $type$.class);
     }
 
 
@@ -213,12 +222,12 @@
 #end[Object]
 
         FieldStaticReadOnly(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
-            this(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadOnly.class);
+            this(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadOnly.FORM);
         }
 
         protected FieldStaticReadOnly(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType},
-                                      Class<? extends FieldStaticReadOnly> handle) {
-            super(VarForm.createFromStatic(handle), null, {#if[Object]?fieldType:$type$.class});
+                                      VarForm form) {
+            super(form);
             this.base = base;
             this.fieldOffset = fieldOffset;
 #if[Object]
@@ -226,6 +235,11 @@
 #end[Object]
         }
 
+        @Override
+        final MethodType accessModeTypeUncached(AccessMode accessMode) {
+            return accessMode.at.accessModeType(null, {#if[Object]?fieldType:$type$.class});
+        }
+
         @ForceInline
         static $type$ get(FieldStaticReadOnly handle) {
             return UNSAFE.get$Type$(handle.base,
@@ -249,12 +263,14 @@
             return UNSAFE.get$Type$Acquire(handle.base,
                                  handle.fieldOffset);
         }
+
+        static final VarForm FORM = new VarForm(FieldStaticReadOnly.class, null, $type$.class);
     }
 
-    static class FieldStaticReadWrite extends FieldStaticReadOnly {
+    static final class FieldStaticReadWrite extends FieldStaticReadOnly {
 
         FieldStaticReadWrite(Object base, long fieldOffset{#if[Object]?, Class<?> fieldType}) {
-            super(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.class);
+            super(base, fieldOffset{#if[Object]?, fieldType}, FieldStaticReadWrite.FORM);
         }
 
         @ForceInline
@@ -375,6 +391,8 @@
                                        value) + value;
         }
 #end[AtomicAdd]
+
+        static final VarForm FORM = new VarForm(FieldStaticReadWrite.class, null, $type$.class);
     }
 
 
@@ -387,8 +405,7 @@
 #end[Object]
 
         Array(int abase, int ashift{#if[Object]?, Class<?> arrayType}) {
-            super(VarForm.createFromStatic(Array.class),
-                  {#if[Object]?arrayType:$type$[].class}, {#if[Object]?arrayType.getComponentType():$type$.class}, int.class);
+            super(Array.FORM);
             this.abase = abase;
             this.ashift = ashift;
 #if[Object]
@@ -397,6 +414,11 @@
 #end[Object]
         }
 
+        @Override
+        final MethodType accessModeTypeUncached(AccessMode accessMode) {
+            return accessMode.at.accessModeType({#if[Object]?arrayType:$type$[].class}, {#if[Object]?arrayType.getComponentType():$type$.class}, int.class);
+        }
+
         @ForceInline
         static $type$ get(Array handle, Object oarray, int index) {
 #if[Object]
@@ -630,5 +652,7 @@
                     value) + value;
         }
 #end[AtomicAdd]
+
+        static final VarForm FORM = new VarForm(Array.class, {#if[Object]?Object[].class:$type$[].class}, {#if[Object]?Object.class:$type$.class}, int.class);
     }
 }
--- a/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template	Wed Jul 05 21:40:37 2017 +0200
@@ -59,13 +59,11 @@
 #end[floatingPoint]
 
 
-    private static class ByteArrayViewVarHandle extends VarHandle {
+    private static abstract class ByteArrayViewVarHandle extends VarHandle {
         final boolean be;
 
-        ByteArrayViewVarHandle(Class<? extends ByteArrayViewVarHandle> implSubType,
-                               Class<?> arrayType, Class<?> component, boolean be) {
-            super(VarForm.createFromStatic(implSubType),
-                  arrayType, component, int.class);
+        ByteArrayViewVarHandle(VarForm form, boolean be) {
+            super(form);
             this.be = be;
         }
     }
@@ -73,7 +71,12 @@
     static final class ArrayHandle extends ByteArrayViewVarHandle {
 
         ArrayHandle(boolean be) {
-            super(ArrayHandle.class, byte[].class, $type$.class, be);
+            super(ArrayHandle.FORM, be);
+        }
+
+        @Override
+        final MethodType accessModeTypeUncached(AccessMode accessMode) {
+            return accessMode.at.accessModeType(byte[].class, $type$.class, int.class);
         }
 
         @ForceInline
@@ -286,13 +289,20 @@
                     convEndian(handle.be, value))) + value;
         }
 #end[AtomicAdd]
+
+        static final VarForm FORM = new VarForm(ArrayHandle.class, byte[].class, $type$.class, int.class);
     }
 
 
     static final class ByteBufferHandle extends ByteArrayViewVarHandle {
 
         ByteBufferHandle(boolean be) {
-            super(ByteBufferHandle.class, ByteBuffer.class, $type$.class, be);
+            super(ByteBufferHandle.FORM, be);
+        }
+
+        @Override
+        final MethodType accessModeTypeUncached(AccessMode accessMode) {
+            return accessMode.at.accessModeType(ByteBuffer.class, $type$.class, int.class);
         }
 
         @ForceInline
@@ -513,5 +523,7 @@
                                       convEndian(handle.be, value))) + value;
         }
 #end[AtomicAdd]
+
+        static final VarForm FORM = new VarForm(ByteBufferHandle.class, ByteBuffer.class, $type$.class, int.class);
     }
 }
--- a/jdk/src/java.base/share/classes/java/lang/module/Configuration.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/Configuration.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,6 +25,7 @@
 
 package java.lang.module;
 
+import java.io.PrintStream;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -183,17 +184,20 @@
         this.nameToModule = Collections.emptyMap();
     }
 
-    private Configuration(Configuration parent, Resolver resolver) {
-        Map<ResolvedModule, Set<ResolvedModule>> graph = resolver.finish(this);
+    private Configuration(Configuration parent,
+                          Resolver resolver,
+                          boolean check)
+    {
+        Map<ResolvedModule, Set<ResolvedModule>> g = resolver.finish(this, check);
 
         Map<String, ResolvedModule> nameToModule = new HashMap<>();
-        for (ResolvedModule resolvedModule : graph.keySet()) {
+        for (ResolvedModule resolvedModule : g.keySet()) {
             nameToModule.put(resolvedModule.name(), resolvedModule);
         }
 
         this.parent = parent;
-        this.graph = graph;
-        this.modules = Collections.unmodifiableSet(graph.keySet());
+        this.graph = g;
+        this.modules = Collections.unmodifiableSet(g.keySet());
         this.nameToModule = Collections.unmodifiableMap(nameToModule);
     }
 
@@ -283,10 +287,10 @@
         Objects.requireNonNull(after);
         Objects.requireNonNull(roots);
 
-        Resolver resolver = new Resolver(before, this, after);
+        Resolver resolver = new Resolver(before, this, after, null);
         resolver.resolveRequires(roots);
 
-        return new Configuration(this, resolver);
+        return new Configuration(this, resolver, true);
     }
 
 
@@ -340,10 +344,32 @@
         Objects.requireNonNull(after);
         Objects.requireNonNull(roots);
 
-        Resolver resolver = new Resolver(before, this, after);
+        Resolver resolver = new Resolver(before, this, after, null);
         resolver.resolveRequires(roots).resolveUses();
 
-        return new Configuration(this, resolver);
+        return new Configuration(this, resolver, true);
+    }
+
+
+    /**
+     * Resolves a collection of root modules, with service binding, and with
+     * the empty configuration as its parent. The post resolution checks
+     * are optionally run.
+     *
+     * This method is used to create the configuration for the boot layer.
+     */
+    static Configuration resolveRequiresAndUses(ModuleFinder finder,
+                                                Collection<String> roots,
+                                                boolean check,
+                                                PrintStream traceOutput)
+    {
+        Configuration parent = empty();
+
+        Resolver resolver
+            = new Resolver(finder, parent, ModuleFinder.empty(), traceOutput);
+        resolver.resolveRequires(roots).resolveUses();
+
+        return new Configuration(parent, resolver, check);
     }
 
 
--- a/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,13 +27,17 @@
 
 import java.io.InputStream;
 import java.io.IOException;
+import java.io.PrintStream;
 import java.io.UncheckedIOException;
+import java.net.URI;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -45,7 +49,7 @@
 import static java.util.Objects.*;
 
 import jdk.internal.module.Checks;
-import jdk.internal.module.Hasher.DependencyHashes;
+import jdk.internal.module.ModuleHashes;
 
 
 /**
@@ -372,8 +376,9 @@
 
         private Provides(String service, Set<String> providers, boolean check) {
             this.service = check ? requireServiceTypeName(service) : service;
-            providers = check ? Collections.unmodifiableSet(new HashSet<>(providers))
-                              : Collections.unmodifiableSet(providers);
+            providers = check
+                ? Collections.unmodifiableSet(new LinkedHashSet<>(providers))
+                : Collections.unmodifiableSet(providers);
             if (providers.isEmpty())
                 throw new IllegalArgumentException("Empty providers set");
             if (check)
@@ -787,7 +792,7 @@
     private final String osVersion;
     private final Set<String> conceals;
     private final Set<String> packages;
-    private final DependencyHashes hashes;
+    private final ModuleHashes hashes;
 
     private ModuleDescriptor(String name,
                              boolean automatic,
@@ -802,7 +807,7 @@
                              String osArch,
                              String osVersion,
                              Set<String> conceals,
-                             DependencyHashes hashes)
+                             ModuleHashes hashes)
     {
 
         this.name = name;
@@ -878,7 +883,8 @@
                      String osArch,
                      String osVersion,
                      Set<String> conceals,
-                     Set<String> packages) {
+                     Set<String> packages,
+                     ModuleHashes hashes) {
         this.name = name;
         this.automatic = automatic;
         this.synthetic = synthetic;
@@ -894,7 +900,7 @@
         this.osName = osName;
         this.osArch = osArch;
         this.osVersion = osVersion;
-        this.hashes = null;
+        this.hashes = hashes;
     }
 
     /**
@@ -1063,9 +1069,9 @@
     }
 
     /**
-     * Returns the object with the hashes of the dependences.
+     * Returns the object with the hashes of other modules
      */
-    Optional<DependencyHashes> hashes() {
+    Optional<ModuleHashes> hashes() {
         return Optional.ofNullable(hashes);
     }
 
@@ -1103,7 +1109,7 @@
         String osArch;
         String osVersion;
         String mainClass;
-        DependencyHashes hashes;
+        ModuleHashes hashes;
 
         /**
          * Initializes a new builder with the given module name.
@@ -1580,7 +1586,7 @@
             return this;
         }
 
-        /* package */ Builder hashes(DependencyHashes hashes) {
+        /* package */ Builder hashes(ModuleHashes hashes) {
             this.hashes = hashes;
             return this;
         }
@@ -1719,7 +1725,9 @@
             hc = hc * 43 + Objects.hashCode(osVersion);
             hc = hc * 43 + Objects.hashCode(conceals);
             hc = hc * 43 + Objects.hashCode(hashes);
-            if (hc != 0) hash = hc;
+            if (hc == 0)
+                hc = -1;
+            hash = hc;
         }
         return hc;
     }
@@ -1925,11 +1933,12 @@
 
     static {
         /**
-         * Setup the shared secret to allow code in other packages create
-         * ModuleDescriptor and associated objects directly.
+         * Setup the shared secret to allow code in other packages access
+         * private package methods in java.lang.module.
          */
         jdk.internal.misc.SharedSecrets
             .setJavaLangModuleAccess(new jdk.internal.misc.JavaLangModuleAccess() {
+
                 @Override
                 public Requires newRequires(Set<Requires.Modifier> ms, String mn) {
                     return new Requires(ms, mn, false);
@@ -1974,7 +1983,8 @@
                                                             String osArch,
                                                             String osVersion,
                                                             Set<String> conceals,
-                                                            Set<String> packages) {
+                                                            Set<String> packages,
+                                                            ModuleHashes hashes) {
                     return new ModuleDescriptor(name,
                                                 automatic,
                                                 synthetic,
@@ -1988,7 +1998,29 @@
                                                 osArch,
                                                 osVersion,
                                                 conceals,
-                                                packages);
+                                                packages,
+                                                hashes);
+                }
+
+                @Override
+                public Configuration resolveRequiresAndUses(ModuleFinder finder,
+                                                            Collection<String> roots,
+                                                            boolean check,
+                                                            PrintStream traceOutput)
+                {
+                    return Configuration.resolveRequiresAndUses(finder, roots, check, traceOutput);
+                }
+
+                @Override
+                public ModuleReference newPatchedModule(ModuleDescriptor descriptor,
+                                                        URI location,
+                                                        Supplier<ModuleReader> s) {
+                    return new ModuleReference(descriptor, location, s, true, null);
+                }
+
+                @Override
+                public Optional<ModuleHashes> hashes(ModuleDescriptor descriptor) {
+                    return descriptor.hashes();
                 }
             });
     }
--- a/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java	Wed Jul 05 21:40:37 2017 +0200
@@ -37,11 +37,12 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Supplier;
 
-import jdk.internal.module.Hasher.DependencyHashes;
+import jdk.internal.module.ModuleHashes;
 
 import static jdk.internal.module.ClassFileConstants.*;
 
@@ -337,7 +338,7 @@
                 // computeIfAbsent
                 Set<String> providers = pm.get(sn);
                 if (providers == null) {
-                    providers = new HashSet<>();
+                    providers = new LinkedHashSet<>(); // preserve order
                     pm.put(sn, providers);
                 }
                 providers.add(cn);
@@ -425,7 +426,7 @@
             map.put(dn, hash);
         }
 
-        builder.hashes(new DependencyHashes(algorithm, map));
+        builder.hashes(new ModuleHashes(algorithm, map));
     }
 
 
--- a/jdk/src/java.base/share/classes/java/lang/module/ModulePath.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModulePath.java	Wed Jul 05 21:40:37 2017 +0200
@@ -40,7 +40,7 @@
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
@@ -52,7 +52,6 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
@@ -190,18 +189,16 @@
                 }
             }
 
-            if (attrs.isRegularFile() || attrs.isDirectory()) {
-                // packaged or exploded module
-                ModuleReference mref = readModule(entry, attrs);
-                if (mref != null) {
-                    String name = mref.descriptor().name();
-                    return Collections.singletonMap(name, mref);
-                }
+            // packaged or exploded module
+            ModuleReference mref = readModule(entry, attrs);
+            if (mref != null) {
+                String name = mref.descriptor().name();
+                return Collections.singletonMap(name, mref);
+            } else {
+                // skipped
+                return Collections.emptyMap();
             }
 
-            // not recognized
-            throw new FindException("Unrecognized module: " + entry);
-
         } catch (IOException ioe) {
             throw new FindException(ioe);
         }
@@ -238,16 +235,13 @@
 
                 // module found
                 if (mref != null) {
-
                     // can have at most one version of a module in the directory
                     String name = mref.descriptor().name();
                     if (nameToReference.put(name, mref) != null) {
                         throw new FindException("Two versions of module "
-                                + name + " found in " + dir);
+                                                  + name + " found in " + dir);
                     }
-
                 }
-
             }
         }
 
@@ -257,28 +251,40 @@
 
     /**
      * Locates a packaged or exploded module, returning a {@code ModuleReference}
-     * to the module. Returns {@code null} if the module is not recognized
-     * as a packaged or exploded module.
+     * to the module. Returns {@code null} if the entry is skipped because it is
+     * to a directory that does not contain a module-info.class or it's a hidden
+     * file.
      *
      * @throws IOException if an I/O error occurs
-     * @throws FindException if an error occurs parsing the module descriptor
+     * @throws FindException if the file is not recognized as a module or an
+     *         error occurs parsing its module descriptor
      */
     private ModuleReference readModule(Path entry, BasicFileAttributes attrs)
         throws IOException
     {
         try {
 
-            ModuleReference mref = null;
             if (attrs.isDirectory()) {
-                mref = readExplodedModule(entry);
-            } if (attrs.isRegularFile()) {
-                if (entry.toString().endsWith(".jar")) {
-                    mref = readJar(entry);
-                } else if (isLinkPhase && entry.toString().endsWith(".jmod")) {
-                    mref = readJMod(entry);
+                return readExplodedModule(entry); // may return null
+            }
+
+            String fn = entry.getFileName().toString();
+            if (attrs.isRegularFile()) {
+                if (fn.endsWith(".jar")) {
+                    return readJar(entry);
+                } else if (fn.endsWith(".jmod")) {
+                    if (isLinkPhase)
+                        return readJMod(entry);
+                    throw new FindException("JMOD files not supported: " + entry);
                 }
             }
-            return mref;
+
+            // skip hidden files
+            if (fn.startsWith(".") || Files.isHidden(entry)) {
+                return null;
+            } else {
+                throw new FindException("Unrecognized module: " + entry);
+            }
 
         } catch (InvalidModuleDescriptorException e) {
             throw new FindException("Error reading module: " + entry, e);
@@ -292,15 +298,17 @@
         return zf.stream()
             .filter(e -> e.getName().startsWith("classes/") &&
                     e.getName().endsWith(".class"))
-            .map(e -> toPackageName(e))
+            .map(e -> toPackageName(e.getName().substring(8)))
             .filter(pkg -> pkg.length() > 0) // module-info
-            .distinct()
             .collect(Collectors.toSet());
     }
 
     /**
      * Returns a {@code ModuleReference} to a module in jmod file on the
      * file system.
+     *
+     * @throws IOException
+     * @throws InvalidModuleDescriptorException
      */
     private ModuleReference readJMod(Path file) throws IOException {
         try (ZipFile zf = new ZipFile(file.toString())) {
@@ -419,13 +427,12 @@
 
         // scan the entries in the JAR file to locate the .class and service
         // configuration file
-        Stream<String> stream = jf.stream()
-            .map(e -> e.getName())
-            .filter(e -> (e.endsWith(".class") || e.startsWith(SERVICES_PREFIX)))
-            .distinct();
-        Map<Boolean, Set<String>> map
-            = stream.collect(Collectors.partitioningBy(s -> s.endsWith(".class"),
-                             Collectors.toSet()));
+        Map<Boolean, Set<String>> map =
+            jf.stream()
+              .map(JarEntry::getName)
+              .filter(s -> (s.endsWith(".class") ^ s.startsWith(SERVICES_PREFIX)))
+              .collect(Collectors.partitioningBy(s -> s.endsWith(".class"),
+                                                 Collectors.toSet()));
         Set<String> classFiles = map.get(Boolean.TRUE);
         Set<String> configFiles = map.get(Boolean.FALSE);
 
@@ -433,19 +440,18 @@
         classFiles.stream()
             .map(c -> toPackageName(c))
             .distinct()
-            .forEach(p -> builder.exports(p));
+            .forEach(builder::exports);
 
         // map names of service configuration files to service names
         Set<String> serviceNames = configFiles.stream()
             .map(this::toServiceName)
-            .filter(Optional::isPresent)
-            .map(Optional::get)
+            .flatMap(Optional::stream)
             .collect(Collectors.toSet());
 
         // parse each service configuration file
         for (String sn : serviceNames) {
             JarEntry entry = jf.getJarEntry(SERVICES_PREFIX + sn);
-            Set<String> providerClasses = new HashSet<>();
+            Set<String> providerClasses = new LinkedHashSet<>();
             try (InputStream in = jf.getInputStream(entry)) {
                 BufferedReader reader
                     = new BufferedReader(new InputStreamReader(in, "UTF-8"));
@@ -475,19 +481,25 @@
     private Set<String> jarPackages(JarFile jf) {
         return jf.stream()
             .filter(e -> e.getName().endsWith(".class"))
-            .map(e -> toPackageName(e))
+            .map(e -> toPackageName(e.getName()))
             .filter(pkg -> pkg.length() > 0)   // module-info
-            .distinct()
             .collect(Collectors.toSet());
     }
 
     /**
      * Returns a {@code ModuleReference} to a module in modular JAR file on
      * the file system.
+     *
+     * @throws IOException
+     * @throws FindException
+     * @throws InvalidModuleDescriptorException
      */
     private ModuleReference readJar(Path file) throws IOException {
-        try (JarFile jf = new JarFile(file.toString())) {
-
+        try (JarFile jf = new JarFile(file.toFile(),
+                                      true,               // verify
+                                      ZipFile.OPEN_READ,
+                                      JarFile.Release.RUNTIME))
+        {
             ModuleDescriptor md;
             JarEntry entry = jf.getJarEntry(MODULE_INFO);
             if (entry == null) {
@@ -520,7 +532,6 @@
                                path.toString().endsWith(".class")))
                 .map(path -> toPackageName(dir.relativize(path)))
                 .filter(pkg -> pkg.length() > 0)   // module-info
-                .distinct()
                 .collect(Collectors.toSet());
         } catch (IOException x) {
             throw new UncheckedIOException(x);
@@ -530,6 +541,9 @@
     /**
      * Returns a {@code ModuleReference} to an exploded module on the file
      * system or {@code null} if {@code module-info.class} not found.
+     *
+     * @throws IOException
+     * @throws InvalidModuleDescriptorException
      */
     private ModuleReference readExplodedModule(Path dir) throws IOException {
         Path mi = dir.resolve(MODULE_INFO);
@@ -559,19 +573,6 @@
         }
     }
 
-    private String toPackageName(ZipEntry entry) {
-        String name = entry.getName();
-        assert name.endsWith(".class");
-        // jmod classes in classes/, jar in /
-        int start = name.startsWith("classes/") ? 8 : 0;
-        int index = name.lastIndexOf("/");
-        if (index > start) {
-            return name.substring(start, index).replace('/', '.');
-        } else {
-            return "";
-        }
-    }
-
     private String toPackageName(Path path) {
         String name = path.toString();
         assert name.endsWith(".class");
--- a/jdk/src/java.base/share/classes/java/lang/module/ModuleReader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -142,10 +142,11 @@
      * @see ClassLoader#defineClass(String, ByteBuffer, java.security.ProtectionDomain)
      */
     default Optional<ByteBuffer> read(String name) throws IOException {
-        Optional<InputStream> in = open(name);
-        if (in.isPresent()) {
-            byte[] bytes = in.get().readAllBytes();
-            return Optional.of(ByteBuffer.wrap(bytes));
+        Optional<InputStream> oin = open(name);
+        if (oin.isPresent()) {
+            try (InputStream in = oin.get()) {
+                return Optional.of(ByteBuffer.wrap(in.readAllBytes()));
+            }
         } else {
             return Optional.empty();
         }
--- a/jdk/src/java.base/share/classes/java/lang/module/ModuleReference.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReference.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -32,7 +32,7 @@
 import java.util.Optional;
 import java.util.function.Supplier;
 
-import jdk.internal.module.Hasher.HashSupplier;
+import jdk.internal.module.ModuleHashes.HashSupplier;
 
 
 /**
@@ -54,12 +54,33 @@
     private final URI location;
     private final Supplier<ModuleReader> readerSupplier;
 
+    // true if this is a reference to a patched module
+    private boolean patched;
+
     // the function that computes the hash of this module reference
     private final HashSupplier hasher;
 
     // cached hash string to avoid needing to compute it many times
     private String cachedHash;
 
+
+    /**
+     * Constructs a new instance of this class.
+     */
+    ModuleReference(ModuleDescriptor descriptor,
+                    URI location,
+                    Supplier<ModuleReader> readerSupplier,
+                    boolean patched,
+                    HashSupplier hasher)
+
+    {
+        this.descriptor = Objects.requireNonNull(descriptor);
+        this.location = location;
+        this.readerSupplier = Objects.requireNonNull(readerSupplier);
+        this.patched = patched;
+        this.hasher = hasher;
+    }
+
     /**
      * Constructs a new instance of this class.
      */
@@ -67,11 +88,9 @@
                     URI location,
                     Supplier<ModuleReader> readerSupplier,
                     HashSupplier hasher)
+
     {
-        this.descriptor = Objects.requireNonNull(descriptor);
-        this.location = location;
-        this.readerSupplier = Objects.requireNonNull(readerSupplier);
-        this.hasher = hasher;
+        this(descriptor, location, readerSupplier, false, hasher);
     }
 
 
@@ -96,10 +115,9 @@
                            URI location,
                            Supplier<ModuleReader> readerSupplier)
     {
-        this(descriptor, location, readerSupplier, null);
+        this(descriptor, location, readerSupplier, false, null);
     }
 
-
     /**
      * Returns the module descriptor.
      *
@@ -151,6 +169,20 @@
 
 
     /**
+     * Returns {@code true} if this module has been patched via -Xpatch.
+     */
+    boolean isPatched() {
+        return patched;
+    }
+
+    /**
+     * Returns the hash supplier for this module.
+     */
+    HashSupplier hasher() {
+        return hasher;
+    }
+
+    /**
      * Computes the hash of this module, returning it as a hex string.
      * Returns {@code null} if the hash cannot be computed.
      *
@@ -166,8 +198,6 @@
         return result;
     }
 
-    private int hash;
-
     /**
      * Computes a hash code for this module reference.
      *
@@ -181,12 +211,17 @@
     public int hashCode() {
         int hc = hash;
         if (hc == 0) {
-            hc = Objects.hash(descriptor, location, readerSupplier, hasher);
-            if (hc != 0) hash = hc;
+            hc = Objects.hash(descriptor, location, readerSupplier, hasher,
+                    Boolean.valueOf(patched));
+            if (hc == 0)
+                hc = -1;
+            hash = hc;
         }
         return hc;
     }
 
+    private int hash;
+
     /**
      * Tests this module reference for equality with the given object.
      *
@@ -214,7 +249,8 @@
         return Objects.equals(this.descriptor, that.descriptor)
                 && Objects.equals(this.location, that.location)
                 && Objects.equals(this.readerSupplier, that.readerSupplier)
-                && Objects.equals(this.hasher, that.hasher);
+                && Objects.equals(this.hasher, that.hasher)
+                && this.patched == that.patched;
     }
 
     /**
--- a/jdk/src/java.base/share/classes/java/lang/module/ModuleReferences.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReferences.java	Wed Jul 05 21:40:37 2017 +0200
@@ -48,8 +48,8 @@
 
 import jdk.internal.misc.JavaLangAccess;
 import jdk.internal.misc.SharedSecrets;
-import jdk.internal.module.Hasher;
-import jdk.internal.module.Hasher.HashSupplier;
+import jdk.internal.module.ModuleHashes;
+import jdk.internal.module.ModuleHashes.HashSupplier;
 import jdk.internal.module.ModulePatcher;
 import sun.net.www.ParseUtil;
 
@@ -89,7 +89,7 @@
     static ModuleReference newJarModule(ModuleDescriptor md, Path file) {
         URI uri = file.toUri();
         Supplier<ModuleReader> supplier = () -> new JarModuleReader(file, uri);
-        HashSupplier hasher = (algorithm) -> Hasher.generate(file, algorithm);
+        HashSupplier hasher = (a) -> ModuleHashes.computeHashAsString(file, a);
         return newModule(md, uri, supplier, hasher);
     }
 
@@ -99,7 +99,7 @@
     static ModuleReference newJModModule(ModuleDescriptor md, Path file) {
         URI uri = file.toUri();
         Supplier<ModuleReader> supplier = () -> new JModModuleReader(file, uri);
-        HashSupplier hasher = (algorithm) -> Hasher.generate(file, algorithm);
+        HashSupplier hasher = (a) -> ModuleHashes.computeHashAsString(file, a);
         return newModule(md, file.toUri(), supplier, hasher);
     }
 
@@ -122,7 +122,7 @@
         private final ReadWriteLock lock = new ReentrantReadWriteLock();
         private final Lock readLock = lock.readLock();
         private final Lock writeLock = lock.writeLock();
-        private volatile boolean closed;
+        private boolean closed;
 
         SafeCloseModuleReader() { }
 
@@ -198,7 +198,10 @@
 
         static JarFile newJarFile(Path path) {
             try {
-                return new JarFile(path.toFile());
+                return new JarFile(path.toFile(),
+                                   true,               // verify
+                                   ZipFile.OPEN_READ,
+                                   JarFile.Release.RUNTIME);
             } catch (IOException ioe) {
                 throw new UncheckedIOException(ioe);
             }
@@ -219,6 +222,8 @@
             if (je != null) {
                 String encodedPath = ParseUtil.encodePath(name, false);
                 String uris = "jar:" + uri + "!/" + encodedPath;
+                if (jf.isMultiRelease())
+                    uris += "#runtime";
                 return Optional.of(URI.create(uris));
             } else {
                 return Optional.empty();
--- a/jdk/src/java.base/share/classes/java/lang/module/Resolver.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/Resolver.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,8 +25,8 @@
 
 package java.lang.module;
 
+import java.io.PrintStream;
 import java.lang.module.ModuleDescriptor.Requires.Modifier;
-import java.lang.reflect.Layer;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -43,7 +43,7 @@
 import java.util.StringJoiner;
 import java.util.stream.Collectors;
 
-import jdk.internal.module.Hasher;
+import jdk.internal.module.ModuleHashes;
 
 /**
  * The resolver used by {@link Configuration#resolveRequires} and
@@ -55,6 +55,7 @@
     private final ModuleFinder beforeFinder;
     private final Configuration parent;
     private final ModuleFinder afterFinder;
+    private final PrintStream traceOutput;
 
     // maps module name to module reference
     private final Map<String, ModuleReference> nameToReference = new HashMap<>();
@@ -62,10 +63,12 @@
 
     Resolver(ModuleFinder beforeFinder,
              Configuration parent,
-             ModuleFinder afterFinder) {
+             ModuleFinder afterFinder,
+             PrintStream traceOutput) {
         this.beforeFinder = beforeFinder;
         this.parent = parent;
         this.afterFinder = afterFinder;
+        this.traceOutput = traceOutput;
     }
 
 
@@ -76,8 +79,6 @@
      */
     Resolver resolveRequires(Collection<String> roots) {
 
-        long start = trace_start("Resolve");
-
         // create the visit stack to get us started
         Deque<ModuleDescriptor> q = new ArrayDeque<>();
         for (String root : roots) {
@@ -95,10 +96,9 @@
                 }
             }
 
-            if (TRACE) {
+            if (isTracing()) {
                 trace("Root module %s located", root);
-                if (mref.location().isPresent())
-                    trace("  (%s)", mref.location().get());
+                mref.location().ifPresent(uri -> trace("  (%s)", uri));
             }
 
             assert mref.descriptor().name().equals(root);
@@ -108,13 +108,6 @@
 
         resolve(q);
 
-        if (TRACE) {
-            long duration = System.currentTimeMillis() - start;
-            Set<String> names = nameToReference.keySet();
-            trace("Resolver completed in %s ms", duration);
-            names.stream().sorted().forEach(name -> trace("  %s", name));
-        }
-
         return this;
     }
 
@@ -153,11 +146,10 @@
                     q.offer(mref.descriptor());
                     resolved.add(mref.descriptor());
 
-                    if (TRACE) {
+                    if (isTracing()) {
                         trace("Module %s located, required by %s",
                                 dn, descriptor.name());
-                        if (mref.location().isPresent())
-                            trace("  (%s)", mref.location().get());
+                        mref.location().ifPresent(uri -> trace("  (%s)", uri));
                     }
                 }
 
@@ -175,8 +167,6 @@
      */
     Resolver resolveUses() {
 
-        long start = trace_start("Bind");
-
         // Scan the finders for all available service provider modules. As
         // java.base uses services then then module finders will be scanned
         // anyway.
@@ -230,10 +220,10 @@
 
                                     String pn = provider.name();
                                     if (!nameToReference.containsKey(pn)) {
-
-                                        if (TRACE && mref.location().isPresent())
-                                            trace("  (%s)", mref.location().get());
-
+                                        if (isTracing()) {
+                                            mref.location()
+                                                .ifPresent(uri -> trace("  (%s)", uri));
+                                        }
                                         nameToReference.put(pn, mref);
                                         q.push(provider);
                                     }
@@ -248,14 +238,6 @@
 
         } while (!candidateConsumers.isEmpty());
 
-
-        if (TRACE) {
-            long duration = System.currentTimeMillis() - start;
-            Set<String> names = nameToReference.keySet();
-            trace("Bind completed in %s ms", duration);
-            names.stream().sorted().forEach(name -> trace("  %s", name));
-        }
-
         return this;
     }
 
@@ -264,23 +246,33 @@
      * Execute post-resolution checks and returns the module graph of resolved
      * modules as {@code Map}. The resolved modules will be in the given
      * configuration.
+     *
+     * @param check {@true} to execute the post resolution checks
      */
-    Map<ResolvedModule, Set<ResolvedModule>> finish(Configuration cf) {
+    Map<ResolvedModule, Set<ResolvedModule>> finish(Configuration cf,
+                                                    boolean check)
+    {
+        if (isTracing()) {
+            trace("Result:");
+            Set<String> names = nameToReference.keySet();
+            names.stream().sorted().forEach(name -> trace("  %s", name));
+        }
 
-        detectCycles();
-
-        checkPlatformConstraints();
-
-        checkHashes();
+        if (check) {
+            detectCycles();
+            checkPlatformConstraints();
+            checkHashes();
+        }
 
         Map<ResolvedModule, Set<ResolvedModule>> graph = makeGraph(cf);
 
-        checkExportSuppliers(graph);
+        if (check) {
+            checkExportSuppliers(graph);
+        }
 
         return graph;
     }
 
-
     /**
      * Checks the given module graph for cycles.
      *
@@ -420,52 +412,44 @@
 
     }
 
-
     /**
      * Checks the hashes in the module descriptor to ensure that they match
-     * the hash of the dependency's module reference.
+     * any recorded hashes.
      */
     private void checkHashes() {
-
         for (ModuleReference mref : nameToReference.values()) {
             ModuleDescriptor descriptor = mref.descriptor();
 
-            // get map of module names to hash
-            Optional<Hasher.DependencyHashes> ohashes = descriptor.hashes();
+            // get map of module hashes
+            Optional<ModuleHashes> ohashes = descriptor.hashes();
             if (!ohashes.isPresent())
                 continue;
-            Hasher.DependencyHashes hashes = ohashes.get();
-
-            // check dependences
-            for (ModuleDescriptor.Requires d : descriptor.requires()) {
-                String dn = d.name();
-                String recordedHash = hashes.hashFor(dn);
-
-                if (recordedHash != null) {
+            ModuleHashes hashes = ohashes.get();
 
-                    ModuleReference other = nameToReference.get(dn);
-                    if (other == null) {
-                        other = parent.findModule(dn)
-                                .map(ResolvedModule::reference)
-                                .orElse(null);
-                    }
-                    if (other == null)
-                        throw new InternalError(dn + " not found");
+            String algorithm = hashes.algorithm();
+            for (String dn : hashes.names()) {
+                ModuleReference other = nameToReference.get(dn);
+                if (other == null) {
+                    other = parent.findModule(dn)
+                            .map(ResolvedModule::reference)
+                            .orElse(null);
+                }
 
-                    String actualHash = other.computeHash(hashes.algorithm());
+                // skip checking the hash if the module has been patched
+                if (other != null && !other.isPatched()) {
+                    String recordedHash = hashes.hashFor(dn);
+                    String actualHash = other.computeHash(algorithm);
                     if (actualHash == null)
                         fail("Unable to compute the hash of module %s", dn);
-
                     if (!recordedHash.equals(actualHash)) {
-                        fail("Hash of %s (%s) differs to expected hash (%s)",
-                                dn, actualHash, recordedHash);
+                        fail("Hash of %s (%s) differs to expected hash (%s)" +
+                             " recorded in %s", dn, actualHash, recordedHash,
+                             descriptor.name());
                     }
+                }
+            }
 
-                }
-
-            }
         }
-
     }
 
 
@@ -666,7 +650,7 @@
                     // source is exported to descriptor2
                     String source = export.source();
                     ModuleDescriptor other
-                            = packageToExporter.put(source, descriptor2);
+                        = packageToExporter.put(source, descriptor2);
 
                     if (other != null && other != descriptor2) {
                         // package might be local to descriptor1
@@ -690,33 +674,38 @@
                 }
             }
 
-            // uses S
-            for (String service : descriptor1.uses()) {
-                String pn = packageName(service);
-                if (!packageToExporter.containsKey(pn)) {
-                    fail("Module %s does not read a module that exports %s",
-                            descriptor1.name(), pn);
-                }
-            }
+            // uses/provides checks not applicable to automatic modules
+            if (!descriptor1.isAutomatic()) {
 
-            // provides S
-            for (Map.Entry<String, ModuleDescriptor.Provides> entry :
-                    descriptor1.provides().entrySet()) {
-                String service = entry.getKey();
-                ModuleDescriptor.Provides provides = entry.getValue();
-
-                String pn = packageName(service);
-                if (!packageToExporter.containsKey(pn)) {
-                    fail("Module %s does not read a module that exports %s",
-                            descriptor1.name(), pn);
+                // uses S
+                for (String service : descriptor1.uses()) {
+                    String pn = packageName(service);
+                    if (!packageToExporter.containsKey(pn)) {
+                        fail("Module %s does not read a module that exports %s",
+                             descriptor1.name(), pn);
+                    }
                 }
 
-                for (String provider : provides.providers()) {
-                    if (!packages.contains(packageName(provider))) {
-                        fail("Provider %s not in module %s",
-                                provider, descriptor1.name());
+                // provides S
+                for (Map.Entry<String, ModuleDescriptor.Provides> entry :
+                        descriptor1.provides().entrySet()) {
+                    String service = entry.getKey();
+                    ModuleDescriptor.Provides provides = entry.getValue();
+
+                    String pn = packageName(service);
+                    if (!packageToExporter.containsKey(pn)) {
+                        fail("Module %s does not read a module that exports %s",
+                             descriptor1.name(), pn);
+                    }
+
+                    for (String provider : provides.providers()) {
+                        if (!packages.contains(packageName(provider))) {
+                            fail("Provider %s not in module %s",
+                                 provider, descriptor1.name());
+                        }
                     }
                 }
+
             }
 
         }
@@ -796,27 +785,18 @@
         throw new ResolutionException(msg);
     }
 
-
     /**
-     * Tracing support, limited to boot layer for now.
+     * Tracing support
      */
 
-    private final static boolean TRACE
-        = Boolean.getBoolean("jdk.launcher.traceResolver")
-            && (Layer.boot() == null);
-
-    private String op;
-
-    private long trace_start(String op) {
-        this.op = op;
-        return System.currentTimeMillis();
+    private boolean isTracing() {
+        return traceOutput != null;
     }
 
     private void trace(String fmt, Object ... args) {
-        if (TRACE) {
-            System.out.print("[" + op + "] ");
-            System.out.format(fmt, args);
-            System.out.println();
+        if (traceOutput != null) {
+            traceOutput.format("[Resolver] " + fmt, args);
+            traceOutput.println();
         }
     }
 
--- a/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -44,6 +44,7 @@
 import jdk.internal.jimage.ImageLocation;
 import jdk.internal.jimage.ImageReader;
 import jdk.internal.jimage.ImageReaderFactory;
+import jdk.internal.module.ModuleHashes;
 import jdk.internal.module.SystemModules;
 import jdk.internal.module.ModulePatcher;
 import jdk.internal.perf.PerfCounter;
@@ -101,13 +102,16 @@
         for (int i = 0; i < n; i++) {
             String mn = moduleNames[i];
             ModuleDescriptor md;
+            String hash;
             if (fastLoad) {
                 md = descriptors[i];
+                hash = SystemModules.MODULES_TO_HASH[i];
             } else {
                 // fallback to read module-info.class
                 // if fast loading of ModuleDescriptors is disabled
                 ImageLocation location = imageReader.findLocation(mn, "module-info.class");
                 md = ModuleDescriptor.read(imageReader.getResourceBuffer(location));
+                hash = null;
             }
             if (!md.name().equals(mn))
                 throw new InternalError();
@@ -123,7 +127,8 @@
                 }
             };
 
-            ModuleReference mref = new ModuleReference(md, uri, readerSupplier);
+            ModuleReference mref =
+                new ModuleReference(md, uri, readerSupplier, hashSupplier(hash));
 
             // may need a reference to a patched module if -Xpatch specified
             mref = ModulePatcher.interposeIfNeeded(mref);
@@ -142,6 +147,18 @@
         initTime.addElapsedTimeFrom(t0);
     }
 
+    private static ModuleHashes.HashSupplier hashSupplier(String hash) {
+        if (hash == null)
+            return null;
+
+        return new ModuleHashes.HashSupplier() {
+            @Override
+            public String generate(String algorithm) {
+                return hash;
+            }
+        };
+    }
+
     SystemModuleFinder() { }
 
     @Override
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,6 +27,7 @@
 
 import java.lang.module.Configuration;
 import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleDescriptor.Provides;
 import java.lang.module.ResolvedModule;
 import java.util.Collections;
 import java.util.HashMap;
@@ -41,6 +42,8 @@
 import jdk.internal.loader.Loader;
 import jdk.internal.loader.LoaderPool;
 import jdk.internal.misc.SharedSecrets;
+import jdk.internal.module.ServicesCatalog;
+import jdk.internal.module.ServicesCatalog.ServiceProvider;
 import sun.security.util.SecurityConstants;
 
 
@@ -549,4 +552,55 @@
     public static Layer boot() {
         return SharedSecrets.getJavaLangAccess().getBootLayer();
     }
+
+
+    /**
+     * Returns the ServicesCatalog for this Layer, creating it if not
+     * already created.
+     */
+    ServicesCatalog getServicesCatalog() {
+        ServicesCatalog servicesCatalog = this.servicesCatalog;
+        if (servicesCatalog != null)
+            return servicesCatalog;
+
+        Map<String, Set<ServiceProvider>> map = new HashMap<>();
+        for (Module m : nameToModule.values()) {
+            ModuleDescriptor descriptor = m.getDescriptor();
+            for (Provides provides : descriptor.provides().values()) {
+                String service = provides.service();
+                Set<ServiceProvider> providers
+                    = map.computeIfAbsent(service, k -> new HashSet<>());
+                for (String pn : provides.providers()) {
+                    providers.add(new ServiceProvider(m, pn));
+                }
+            }
+        }
+
+        ServicesCatalog catalog = new ServicesCatalog() {
+            @Override
+            public void register(Module module) {
+                throw new UnsupportedOperationException();
+            }
+            @Override
+            public Set<ServiceProvider> findServices(String service) {
+                Set<ServiceProvider> providers = map.get(service);
+                if (providers == null) {
+                    return Collections.emptySet();
+                } else {
+                    return Collections.unmodifiableSet(providers);
+                }
+            }
+        };
+
+        synchronized (this) {
+            servicesCatalog = this.servicesCatalog;
+            if (servicesCatalog == null) {
+                this.servicesCatalog = servicesCatalog = catalog;
+            }
+        }
+
+        return servicesCatalog;
+    }
+
+    private volatile ServicesCatalog servicesCatalog;
 }
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Module.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Module.java	Wed Jul 05 21:40:37 2017 +0200
@@ -43,11 +43,7 @@
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
-import java.util.WeakHashMap;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
@@ -142,9 +138,6 @@
         this.name = null;
         this.loader = loader;
         this.descriptor = null;
-
-        // unnamed modules are loose
-        this.loose = true;
     }
 
 
@@ -245,17 +238,27 @@
     }
 
 
-    // -- readability --
+    // --
+
+    // the special Module to mean reads or exported to "all unnamed modules"
+    private static final Module ALL_UNNAMED_MODULE = new Module(null);
 
-    // true if this module reads all unnamed modules (a.k.a. loose module)
-    private volatile boolean loose;
+    // special Module to mean exported to "everyone"
+    private static final Module EVERYONE_MODULE = new Module(null);
+
+    // exported to all modules
+    private static final Set<Module> EVERYONE = Collections.singleton(EVERYONE_MODULE);
+
+
+    // -- readability --
 
     // the modules that this module permanently reads
     // (will be final when the modules are defined in reverse topology order)
     private volatile Set<Module> reads;
 
-    // created lazily, additional modules that this module reflectively reads
-    private volatile WeakSet<Module> transientReads;
+    // additional module (2nd key) that some module (1st key) reflectively reads
+    private static final WeakPairMap<Module, Module, Boolean> transientReads
+        = new WeakPairMap<>();
 
 
     /**
@@ -284,22 +287,19 @@
 
         // check if this module reads other
         if (other.isNamed()) {
-
             Set<Module> reads = this.reads; // volatile read
             if (reads != null && reads.contains(other))
                 return true;
-
-        } else {
-
-            // loose modules read all unnamed modules
-            if (this.loose)
-                return true;
-
         }
 
         // check if this module reads the other module reflectively
-        WeakSet<Module> tr = this.transientReads; // volatile read
-        if (tr != null && tr.contains(other))
+        if (transientReads.containsKeyPair(this, other))
+            return true;
+
+        // if other is an unnamed module then check if this module reads
+        // all unnamed modules
+        if (!other.isNamed()
+            && transientReads.containsKeyPair(this, ALL_UNNAMED_MODULE))
             return true;
 
         return false;
@@ -346,8 +346,7 @@
     }
 
     /**
-     * Makes the given {@code Module} readable to this module without
-     * notifying the VM.
+     * Updates this module to read another module without notifying the VM.
      *
      * @apiNote This method is for VM white-box testing.
      */
@@ -361,40 +360,28 @@
      * If {@code syncVM} is {@code true} then the VM is notified.
      */
     private void implAddReads(Module other, boolean syncVM) {
+        Objects.requireNonNull(other);
 
         // nothing to do
         if (other == this || !this.isNamed())
             return;
 
-        // if the other is null then change this module to be loose.
-        if (other == null) {
-            if (syncVM)
-                addReads0(this, null);
-            this.loose = true;
-            return;
-        }
-
         // check if we already read this module
         Set<Module> reads = this.reads;
         if (reads != null && reads.contains(other))
             return;
 
         // update VM first, just in case it fails
-        if (syncVM)
-            addReads0(this, other);
+        if (syncVM) {
+            if (other == ALL_UNNAMED_MODULE) {
+                addReads0(this, null);
+            } else {
+                addReads0(this, other);
+            }
+        }
 
         // add reflective read
-        WeakSet<Module> tr = this.transientReads;
-        if (tr == null) {
-            synchronized (this) {
-                tr = this.transientReads;
-                if (tr == null) {
-                    tr = new WeakSet<>();
-                    this.transientReads = tr;
-                }
-            }
-        }
-        tr.add(other);
+        transientReads.putIfAbsent(this, other, Boolean.TRUE);
     }
 
 
@@ -404,15 +391,10 @@
     // (will be final when the modules are defined in reverse topology order)
     private volatile Map<String, Set<Module>> exports;
 
-    // created lazily, additional exports added at run-time
-    private volatile Map<String, WeakSet<Module>> transientExports;
-
-    // the special Module to mean exported to all modules
-    private static final Module EVERYONE_MODULE = new Module(null);
-    private static final Set<Module> EVERYONE = Collections.singleton(EVERYONE_MODULE);
-
-    // the special Module to mean exported to all unnamed modules
-    private static final Module ALL_UNNAMED_MODULE = new Module(null);
+    // additional exports added at run-time
+    // this module (1st key), other module (2nd key), exported packages (value)
+    private static final WeakPairMap<Module, Module, Map<String, Boolean>>
+        transientExports = new WeakPairMap<>();
 
 
     /**
@@ -489,23 +471,9 @@
         if (exports != null) {
             Set<Module> targets = exports.get(pn);
 
-            if (targets != null) {
-
-                // exported to all modules
-                if (targets.contains(EVERYONE_MODULE))
-                    return true;
-
-                if (other != EVERYONE_MODULE) {
-                    // exported to other
-                    if (targets.contains(other))
-                        return true;
-
-                    // other is an unnamed module && exported to all unnamed
-                    if (!other.isNamed() && targets.contains(ALL_UNNAMED_MODULE))
-                        return true;
-                }
-
-            }
+            if ((targets != null)
+                && (targets.contains(other) || targets.contains(EVERYONE_MODULE)))
+                return true;
         }
         return false;
     }
@@ -515,29 +483,27 @@
      * package package to the given module.
      */
     private boolean isExportedReflectively(String pn, Module other) {
-        Map<String, WeakSet<Module>> te = this.transientExports;
-        if (te != null) {
-            WeakSet<Module> targets = te.get(pn);
+        // exported to all modules
+        Map<String, ?> exports = transientExports.get(this, EVERYONE_MODULE);
+        if (exports != null && exports.containsKey(pn))
+            return true;
 
-            if (targets != null) {
-
-                // exported to all modules
-                if (targets.contains(EVERYONE_MODULE))
-                    return true;
+        if (other != EVERYONE_MODULE) {
 
-                if (other != EVERYONE_MODULE) {
+            // exported to other
+            exports = transientExports.get(this, other);
+            if (exports != null && exports.containsKey(pn))
+                return true;
 
-                    // exported to other
-                    if (targets.contains(other))
-                        return true;
-
-                    // other is an unnamed module && exported to all unnamed
-                    if (!other.isNamed() && targets.contains(ALL_UNNAMED_MODULE))
-                        return true;
-                }
+            // other is an unnamed module && exported to all unnamed
+            if (!other.isNamed()) {
+                exports = transientExports.get(this, ALL_UNNAMED_MODULE);
+                if (exports != null && exports.containsKey(pn))
+                    return true;
             }
 
         }
+
         return false;
     }
 
@@ -638,34 +604,19 @@
             }
         }
 
-        // create transientExports if needed
-        Map<String, WeakSet<Module>> te = this.transientExports; // read
-        if (te == null) {
-            synchronized (this) {
-                te = this.transientExports;
-                if (te == null) {
-                    te = new ConcurrentHashMap<>();
-                    this.transientExports = te;  // volatile write
-                }
-            }
-        }
-
         // add package name to transientExports if absent
-        WeakSet<Module> s = te.get(pn);
-        if (s == null) {
-            s = new WeakSet<>();
-            WeakSet<Module> prev = te.putIfAbsent(pn, s);
-            if (prev != null)
-                s = prev;
-        }
-        s.add(other);
+        transientExports
+            .computeIfAbsent(this, other,
+                             (_this, _other) -> new ConcurrentHashMap<>())
+            .putIfAbsent(pn, Boolean.TRUE);
     }
 
 
     // -- services --
 
-    // created lazily, additional service types that this module uses
-    private volatile WeakSet<Class<?>> transientUses;
+    // additional service type (2nd key) that some module (1st key) uses
+    private static final WeakPairMap<Module, Class<?>, Boolean> transientUses
+        = new WeakPairMap<>();
 
     /**
      * If the caller's module is this module then update this module to add a
@@ -702,17 +653,7 @@
             }
 
             if (!canUse(st)) {
-                WeakSet<Class<?>> uses = this.transientUses;
-                if (uses == null) {
-                    synchronized (this) {
-                        uses = this.transientUses;
-                        if (uses == null) {
-                            uses = new WeakSet<>();
-                            this.transientUses = uses;
-                        }
-                    }
-                }
-                uses.add(st);
+                transientUses.putIfAbsent(this, st, Boolean.TRUE);
             }
 
         }
@@ -746,11 +687,7 @@
             return true;
 
         // uses added via addUses
-        WeakSet<Class<?>> uses = this.transientUses;
-        if (uses != null && uses.contains(st))
-            return true;
-
-        return false;
+        return transientUses.containsKeyPair(this, st);
     }
 
 
@@ -885,7 +822,7 @@
     // -- creating Module objects --
 
     /**
-     * Find the runtime Module corresponding to the given ReadDependence
+     * Find the runtime Module corresponding to the given ResolvedModule
      * in the given parent Layer (or its parents).
      */
     private static Module find(ResolvedModule resolvedModule, Layer layer) {
@@ -969,7 +906,7 @@
 
             // automatic modules reads all unnamed modules
             if (descriptor.isAutomatic()) {
-                m.implAddReads(null, true);
+                m.implAddReads(ALL_UNNAMED_MODULE, true);
             }
 
             // exports
@@ -1097,7 +1034,7 @@
      * the representation is the string {@code "module"}, followed by a space,
      * and then the module name. For an unnamed module, the representation is
      * the string {@code "unnamed module"}, followed by a space, and then an
-     * implementation specific identifier for the unnamed module.
+     * implementation specific string that identifies the unnamed module.
      *
      * @return The string representation of this module
      */
@@ -1112,46 +1049,6 @@
     }
 
 
-    // -- supporting classes --
-
-
-    /**
-     * A "not-a-Set" set of weakly referenced objects that supports concurrent
-     * access.
-     */
-    private static class WeakSet<E> {
-        private final ReadWriteLock lock = new ReentrantReadWriteLock();
-        private final Lock readLock = lock.readLock();
-        private final Lock writeLock = lock.writeLock();
-
-        private final WeakHashMap<E, Boolean> map = new WeakHashMap<>();
-
-        /**
-         * Adds the specified element to the set.
-         */
-        void add(E e) {
-            writeLock.lock();
-            try {
-                map.put(e, Boolean.TRUE);
-            } finally {
-                writeLock.unlock();
-            }
-        }
-
-        /**
-         * Returns {@code true} if this set contains the specified element.
-         */
-        boolean contains(E e) {
-            readLock.lock();
-            try {
-                return map.containsKey(e);
-            } finally {
-                readLock.unlock();
-            }
-        }
-    }
-
-
     // -- native methods --
 
     // JVM_DefineModule
@@ -1196,8 +1093,12 @@
                     m1.implAddReads(m2, true);
                 }
                 @Override
+                public void addReadsAllUnnamed(Module m) {
+                    m.implAddReads(Module.ALL_UNNAMED_MODULE);
+                }
+                @Override
                 public void addExports(Module m, String pn, Module other) {
-                    m.implAddExports(pn, Objects.requireNonNull(other), true);
+                    m.implAddExports(pn, other, true);
                 }
                 @Override
                 public void addExportsToAll(Module m, String pn) {
@@ -1211,6 +1112,10 @@
                 public void addPackage(Module m, String pn) {
                     m.implAddPackage(pn, true);
                 }
+                @Override
+                public ServicesCatalog getServicesCatalog(Layer layer) {
+                    return layer.getServicesCatalog();
+                }
             });
     }
 }
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java	Wed Jul 05 21:40:37 2017 +0200
@@ -582,7 +582,7 @@
         }
 
         private static final String DEBUG =
-                GetPropertyAction.getProperty("jdk.proxy.debug", "");
+                GetPropertyAction.privilegedGetProperty("jdk.proxy.debug", "");
 
         private static boolean isDebug() {
             return !DEBUG.isEmpty();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/WeakPairMap.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2016, 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 java.lang.reflect;
+
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiFunction;
+
+/**
+ * A WeakHashMap-like data structure that uses a pair of weakly-referenced keys
+ * with identity equality semantics to associate a strongly-referenced value.
+ * Unlike WeakHashMap, this data structure is thread-safe.
+ *
+ * @param <K1> the type of 1st key in key pair
+ * @param <K2> the type of 2nd key in key pair
+ * @param <V>  the type of value
+ * @author Peter Levart
+ */
+final class WeakPairMap<K1, K2, V> {
+
+    private final ConcurrentHashMap<Pair<K1, K2>, V> map = new ConcurrentHashMap<>();
+    private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
+
+    /**
+     * Tests if the specified pair of keys are associated with a value
+     * in the WeakPairMap.
+     *
+     * @param k1 the 1st of the pair of keys
+     * @param k2 the 2nd of the pair of keys
+     * @return true if and only if the specified key pair is in this WeakPairMap,
+     * as determined by the identity comparison; false otherwise
+     * @throws NullPointerException if any of the specified keys is null
+     */
+    public boolean containsKeyPair(K1 k1, K2 k2) {
+        expungeStaleAssociations();
+        return map.containsKey(Pair.lookup(k1, k2));
+    }
+
+    /**
+     * Returns the value to which the specified pair of keys is mapped, or null
+     * if this WeakPairMap contains no mapping for the key pair.
+     * <p>More formally, if this WeakPairMap contains a mapping from a key pair
+     * {@code (_k1, _k2)} to a value {@code v} such that
+     * {@code k1 == _k1 && k2 == _k2}, then this method returns {@code v};
+     * otherwise it returns {@code null}.
+     * (There can be at most one such mapping.)
+     *
+     * @param k1 the 1st of the pair of keys for which the mapped value is to
+     *           be returned
+     * @param k2 the 2nd of the pair of keys for which the mapped value is to
+     *           be returned
+     * @return the value to which the specified key pair is mapped, or null if
+     * this map contains no mapping for the key pair
+     * @throws NullPointerException if any of the specified keys is null
+     */
+    public V get(K1 k1, K2 k2) {
+        expungeStaleAssociations();
+        return map.get(Pair.lookup(k1, k2));
+    }
+
+    /**
+     * Maps the specified key pair to the specified value in this WeakPairMap.
+     * Neither the keys nor the value can be null.
+     * <p>The value can be retrieved by calling the {@link #get} method
+     * with the the same keys (compared by identity).
+     *
+     * @param k1 the 1st of the pair of keys with which the specified value is to
+     *           be associated
+     * @param k2 the 2nd of the pair of keys with which the specified value is to
+     *           be associated
+     * @param v  value to be associated with the specified key pair
+     * @return the previous value associated with key pair, or {@code null} if
+     * there was no mapping for key pair
+     * @throws NullPointerException if any of the specified keys or value is null
+     */
+    public V put(K1 k1, K2 k2, V v) {
+        expungeStaleAssociations();
+        return map.put(Pair.weak(k1, k2, queue), v);
+    }
+
+    /**
+     * If the specified key pair is not already associated with a value,
+     * associates it with the given value and returns {@code null}, else does
+     * nothing and returns the currently associated value.
+     *
+     * @param k1 the 1st of the pair of keys with which the specified value is to
+     *           be associated
+     * @param k2 the 2nd of the pair of keys with which the specified value is to
+     *           be associated
+     * @param v  value to be associated with the specified key pair
+     * @return the previous value associated with key pair, or {@code null} if
+     * there was no mapping for key pair
+     * @throws NullPointerException if any of the specified keys or value is null
+     */
+    public V putIfAbsent(K1 k1, K2 k2, V v) {
+        expungeStaleAssociations();
+        return map.putIfAbsent(Pair.weak(k1, k2, queue), v);
+    }
+
+    /**
+     * If the specified key pair is not already associated with a value,
+     * attempts to compute its value using the given mapping function
+     * and enters it into this WeakPairMap unless {@code null}. The entire
+     * method invocation is performed atomically, so the function is
+     * applied at most once per key pair. Some attempted update operations
+     * on this WeakPairMap by other threads may be blocked while computation
+     * is in progress, so the computation should be short and simple,
+     * and must not attempt to update any other mappings of this WeakPairMap.
+     *
+     * @param k1              the 1st of the pair of keys with which the
+     *                        computed value is to be associated
+     * @param k2              the 2nd of the pair of keys with which the
+     *                        computed value is to be associated
+     * @param mappingFunction the function to compute a value
+     * @return the current (existing or computed) value associated with
+     * the specified key pair, or null if the computed value is null
+     * @throws NullPointerException  if any of the specified keys or
+     *                               mappingFunction is null
+     * @throws IllegalStateException if the computation detectably
+     *                               attempts a recursive update to this map
+     *                               that would otherwise never complete
+     * @throws RuntimeException      or Error if the mappingFunction does so, in
+     *                               which case the mapping is left unestablished
+     */
+    public V computeIfAbsent(K1 k1, K2 k2,
+                             BiFunction<? super K1, ? super K2, ? extends V>
+                                 mappingFunction) {
+        expungeStaleAssociations();
+        try {
+            return map.computeIfAbsent(
+                Pair.weak(k1, k2, queue),
+                pair -> mappingFunction.apply(pair.first(), pair.second()));
+        } finally {
+            Reference.reachabilityFence(k1);
+            Reference.reachabilityFence(k2);
+        }
+    }
+
+    /**
+     * Returns a {@link Collection} view of the values contained in this
+     * WeakPairMap. The collection is backed by the WeakPairMap, so changes to
+     * the map are reflected in the collection, and vice-versa.  The collection
+     * supports element removal, which removes the corresponding
+     * mapping from this map, via the {@code Iterator.remove},
+     * {@code Collection.remove}, {@code removeAll},
+     * {@code retainAll}, and {@code clear} operations.  It does not
+     * support the {@code add} or {@code addAll} operations.
+     *
+     * @return the collection view
+     */
+    public Collection<V> values() {
+        expungeStaleAssociations();
+        return map.values();
+    }
+
+    /**
+     * Removes associations from this WeakPairMap for which at least one of the
+     * keys in key pair has been found weakly-reachable and corresponding
+     * WeakRefPeer(s) enqueued. Called as part of each public operation.
+     */
+    private void expungeStaleAssociations() {
+        WeakRefPeer<?> peer;
+        while ((peer = (WeakRefPeer<?>) queue.poll()) != null) {
+            map.remove(peer.weakPair());
+        }
+    }
+
+    /**
+     * Common interface of both {@link Weak} and {@link Lookup} key pairs.
+     */
+    private interface Pair<K1, K2> {
+
+        static <K1, K2> Pair<K1, K2> weak(K1 k1, K2 k2,
+                                          ReferenceQueue<Object> queue) {
+            return new Weak<>(k1, k2, queue);
+        }
+
+        static <K1, K2> Pair<K1, K2> lookup(K1 k1, K2 k2) {
+            return new Lookup<>(k1, k2);
+        }
+
+        /**
+         * @return The 1st of the pair of keys (may be null for {@link Weak}
+         * when it gets cleared)
+         */
+        K1 first();
+
+        /**
+         * @return The 2nd of the pair of keys (may be null for {@link Weak}
+         * when it gets cleared)
+         */
+        K2 second();
+
+        static int hashCode(Object first, Object second) {
+            // assert first != null && second != null;
+            return System.identityHashCode(first) ^
+                   System.identityHashCode(second);
+        }
+
+        static boolean equals(Object first, Object second, Pair<?, ?> p) {
+            return first != null && second != null &&
+                   first == p.first() && second == p.second();
+        }
+
+        /**
+         * A Pair where both keys are weakly-referenced.
+         * It is composed of two instances of {@link WeakRefPeer}s:
+         * <pre>{@code
+         *
+         *     +-referent-> [K1]                +-referent-> [K2]
+         *     |                                |
+         *   +----------------+               +----------------+
+         *   | Pair.Weak <:   |-----peer----->| (anonymous) <: |
+         *   | WeakRefPeer,   |               | WeakRefPeer    |
+         *   | Pair           |<--weakPair()--|                |
+         *   +----------------+               +----------------+
+         *     |            ^
+         *     |            |
+         *     +-weakPair()-+
+         *
+         * }</pre>
+         * <p>
+         * Pair.Weak is used for CHM keys. Both peers are associated with the
+         * same {@link ReferenceQueue} so when either of their referents
+         * becomes weakly-reachable, the corresponding entries can be
+         * {@link #expungeStaleAssociations() expunged} from the map.
+         */
+        final class Weak<K1, K2> extends WeakRefPeer<K1> implements Pair<K1, K2> {
+
+            // saved hash so it can be retrieved after the reference is cleared
+            private final int hash;
+            // link to <K2> peer
+            private final WeakRefPeer<K2> peer;
+
+            Weak(K1 k1, K2 k2, ReferenceQueue<Object> queue) {
+                super(k1, queue);
+                hash = Pair.hashCode(k1, k2);
+                peer = new WeakRefPeer<>(k2, queue) {
+                    // link back to <K1> peer
+                    @Override
+                    Weak<?, ?> weakPair() { return Weak.this; }
+                };
+            }
+
+            @Override
+            Weak<?, ?> weakPair() {
+                return this;
+            }
+
+            @Override
+            public K1 first() {
+                return get();
+            }
+
+            @Override
+            public K2 second() {
+                return peer.get();
+            }
+
+            @Override
+            public int hashCode() {
+                return hash;
+            }
+
+            @Override
+            public boolean equals(Object obj) {
+                return this == obj ||
+                       (obj instanceof Pair &&
+                        Pair.equals(first(), second(), (Pair<?, ?>) obj));
+            }
+        }
+
+        /**
+         * Optimized lookup Pair, used as lookup key in methods like
+         * {@link java.util.Map#get(Object)} or
+         * {@link java.util.Map#containsKey(Object)}) where
+         * there is a great chance its allocation is eliminated
+         * by escape analysis when such lookups are inlined by JIT.
+         * All its methods are purposely designed so that 'this' is never
+         * passed to any other method or used as identity.
+         */
+        final class Lookup<K1, K2> implements Pair<K1, K2> {
+            private final K1 k1;
+            private final K2 k2;
+
+            Lookup(K1 k1, K2 k2) {
+                this.k1 = Objects.requireNonNull(k1);
+                this.k2 = Objects.requireNonNull(k2);
+            }
+
+            @Override
+            public K1 first() {
+                return k1;
+            }
+
+            @Override
+            public K2 second() {
+                return k2;
+            }
+
+            @Override
+            public int hashCode() {
+                return Pair.hashCode(k1, k2);
+            }
+
+            @Override
+            public boolean equals(Object obj) {
+                return obj instanceof Pair &&
+                       Pair.equals(k1, k2, (Pair<?, ?>) obj);
+            }
+        }
+    }
+
+    /**
+     * Common abstract supertype of a pair of WeakReference peers.
+     */
+    private static abstract class WeakRefPeer<K> extends WeakReference<K> {
+
+        WeakRefPeer(K k, ReferenceQueue<Object> queue) {
+            super(Objects.requireNonNull(k), queue);
+        }
+
+        /**
+         * @return the {@link Pair.Weak} side of the pair of peers.
+         */
+        abstract Pair.Weak<?, ?> weakPair();
+    }
+}
--- a/jdk/src/java.base/share/classes/java/math/BigDecimal.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/math/BigDecimal.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1536,7 +1536,7 @@
      * be performed to generate a result with the specified scale, the
      * specified rounding mode is applied.
      *
-     * <p>The new {@link #divide(BigDecimal, int, RoundingMode)} method
+     * @deprecated The method {@link #divide(BigDecimal, int, RoundingMode)}
      * should be used in preference to this legacy method.
      *
      * @param  divisor value by which this {@code BigDecimal} is to be divided.
@@ -1558,6 +1558,7 @@
      * @see    #ROUND_HALF_EVEN
      * @see    #ROUND_UNNECESSARY
      */
+    @Deprecated(since="9")
     public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
         if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
             throw new IllegalArgumentException("Invalid rounding mode");
@@ -1602,7 +1603,7 @@
      * rounding must be performed to generate a result with the given
      * scale, the specified rounding mode is applied.
      *
-     * <p>The new {@link #divide(BigDecimal, RoundingMode)} method
+     * @deprecated The method {@link #divide(BigDecimal, RoundingMode)}
      * should be used in preference to this legacy method.
      *
      * @param  divisor value by which this {@code BigDecimal} is to be divided.
@@ -1623,6 +1624,7 @@
      * @see    #ROUND_HALF_EVEN
      * @see    #ROUND_UNNECESSARY
      */
+    @Deprecated(since="9")
     public BigDecimal divide(BigDecimal divisor, int roundingMode) {
         return this.divide(divisor, scale, roundingMode);
     }
@@ -2267,14 +2269,20 @@
      * Rounding mode to round away from zero.  Always increments the
      * digit prior to a nonzero discarded fraction.  Note that this rounding
      * mode never decreases the magnitude of the calculated value.
+     *
+     * @deprecated Use {@link RoundingMode#UP} instead.
      */
+    @Deprecated(since="9")
     public static final int ROUND_UP =           0;
 
     /**
      * Rounding mode to round towards zero.  Never increments the digit
      * prior to a discarded fraction (i.e., truncates).  Note that this
      * rounding mode never increases the magnitude of the calculated value.
+     *
+     * @deprecated Use {@link RoundingMode#DOWN} instead.
      */
+    @Deprecated(since="9")
     public static final int ROUND_DOWN =         1;
 
     /**
@@ -2283,7 +2291,10 @@
      * {@code ROUND_UP}; if negative, behaves as for
      * {@code ROUND_DOWN}.  Note that this rounding mode never
      * decreases the calculated value.
+     *
+     * @deprecated Use {@link RoundingMode#CEILING} instead.
      */
+    @Deprecated(since="9")
     public static final int ROUND_CEILING =      2;
 
     /**
@@ -2292,7 +2303,10 @@
      * {@code ROUND_DOWN}; if negative, behave as for
      * {@code ROUND_UP}.  Note that this rounding mode never
      * increases the calculated value.
+     *
+     * @deprecated Use {@link RoundingMode#FLOOR} instead.
      */
+    @Deprecated(since="9")
     public static final int ROUND_FLOOR =        3;
 
     /**
@@ -2302,7 +2316,10 @@
      * &ge; 0.5; otherwise, behaves as for {@code ROUND_DOWN}.  Note
      * that this is the rounding mode that most of us were taught in
      * grade school.
+     *
+     * @deprecated Use {@link RoundingMode#HALF_UP} instead.
      */
+    @Deprecated(since="9")
     public static final int ROUND_HALF_UP =      4;
 
     /**
@@ -2311,7 +2328,10 @@
      * down.  Behaves as for {@code ROUND_UP} if the discarded
      * fraction is {@literal >} 0.5; otherwise, behaves as for
      * {@code ROUND_DOWN}.
+     *
+     * @deprecated Use {@link RoundingMode#HALF_DOWN} instead.
      */
+    @Deprecated(since="9")
     public static final int ROUND_HALF_DOWN =    5;
 
     /**
@@ -2323,7 +2343,10 @@
      * {@code ROUND_HALF_DOWN} if it's even.  Note that this is the
      * rounding mode that minimizes cumulative error when applied
      * repeatedly over a sequence of calculations.
+     *
+     * @deprecated Use {@link RoundingMode#HALF_EVEN} instead.
      */
+    @Deprecated(since="9")
     public static final int ROUND_HALF_EVEN =    6;
 
     /**
@@ -2331,7 +2354,10 @@
      * result, hence no rounding is necessary.  If this rounding mode is
      * specified on an operation that yields an inexact result, an
      * {@code ArithmeticException} is thrown.
+     *
+     * @deprecated Use {@link RoundingMode#UNNECESSARY} instead.
      */
+    @Deprecated(since="9")
     public static final int ROUND_UNNECESSARY =  7;
 
 
@@ -2408,7 +2434,7 @@
      * Instead, {@code setScale} returns an object with the proper
      * scale; the returned object may or may not be newly allocated.
      *
-     * <p>The new {@link #setScale(int, RoundingMode)} method should
+     * @deprecated The method {@link #setScale(int, RoundingMode)} should
      * be used in preference to this legacy method.
      *
      * @param  newScale scale of the {@code BigDecimal} value to be returned.
@@ -2431,6 +2457,7 @@
      * @see    #ROUND_HALF_EVEN
      * @see    #ROUND_UNNECESSARY
      */
+    @Deprecated(since="9")
     public BigDecimal setScale(int newScale, int roundingMode) {
         if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
             throw new IllegalArgumentException("Invalid rounding mode");
--- a/jdk/src/java.base/share/classes/java/math/RoundingMode.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/math/RoundingMode.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, 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
@@ -90,6 +90,7 @@
  * @author  Joseph D. Darcy
  * @since 1.5
  */
+@SuppressWarnings("deprecation") // Legacy rounding mode constants in BigDecimal
 public enum RoundingMode {
 
         /**
--- a/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -52,7 +52,8 @@
     protected InetAddress connectedAddress = null;
     private int connectedPort = -1;
 
-    private static final String os = GetPropertyAction.getProperty("os.name");
+    private static final String os =
+            GetPropertyAction.privilegedGetProperty("os.name");
 
     /**
      * flag set if the native connect() call not to be used
--- a/jdk/src/java.base/share/classes/java/net/InetAddress.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/net/InetAddress.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1124,7 +1124,7 @@
     private static NameService createNameService() {
 
         String hostsFileName =
-                GetPropertyAction.getProperty("jdk.net.hosts.file");
+                GetPropertyAction.privilegedGetProperty("jdk.net.hosts.file");
         NameService theNameService;
         if (hostsFileName != null) {
             theNameService = new HostsFileNameService(hostsFileName);
@@ -1643,9 +1643,11 @@
          * property can vary across implementations of the java.
          * classes.  The default is an empty String "".
          */
-        String prefix = GetPropertyAction.getProperty("impl.prefix", "");
+        String prefix = GetPropertyAction.privilegedGetProperty("impl.prefix", "");
         try {
-            impl = Class.forName("java.net." + prefix + implName).newInstance();
+            @SuppressWarnings("deprecation")
+            Object tmp = Class.forName("java.net." + prefix + implName).newInstance();
+            impl = tmp;
         } catch (ClassNotFoundException e) {
             System.err.println("Class not found: java.net." + prefix +
                                implName + ":\ncheck impl.prefix property " +
@@ -1662,7 +1664,9 @@
 
         if (impl == null) {
             try {
-                impl = Class.forName(implName).newInstance();
+                @SuppressWarnings("deprecation")
+                Object tmp = Class.forName(implName).newInstance();
+                impl = tmp;
             } catch (Exception e) {
                 throw new Error("System property impl.prefix incorrect");
             }
--- a/jdk/src/java.base/share/classes/java/net/ProxySelector.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/net/ProxySelector.java	Wed Jul 05 21:40:37 2017 +0200
@@ -71,7 +71,9 @@
         try {
             Class<?> c = Class.forName("sun.net.spi.DefaultProxySelector");
             if (c != null && ProxySelector.class.isAssignableFrom(c)) {
-                theProxySelector = (ProxySelector) c.newInstance();
+                @SuppressWarnings("deprecation")
+                ProxySelector tmp = (ProxySelector) c.newInstance();
+                theProxySelector = tmp;
             }
         } catch (Exception e) {
             theProxySelector = null;
--- a/jdk/src/java.base/share/classes/java/net/SocksSocketImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/net/SocksSocketImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -178,7 +178,7 @@
                 userName = pw.getUserName();
                 password = new String(pw.getPassword());
             } else {
-                userName = GetPropertyAction.getProperty("user.name");
+                userName = GetPropertyAction.privilegedGetProperty("user.name");
             }
             if (userName == null)
                 return false;
@@ -1088,7 +1088,7 @@
                 userName = System.getProperty("user.name");
             } catch (SecurityException se) { /* swallow Exception */ }
         } else {
-            userName = GetPropertyAction.getProperty("user.name");
+            userName = GetPropertyAction.privilegedGetProperty("user.name");
         }
         return userName;
     }
--- a/jdk/src/java.base/share/classes/java/net/URL.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/net/URL.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1198,8 +1198,9 @@
         public URLStreamHandler createURLStreamHandler(String protocol) {
             String name = PREFIX + "." + protocol + ".Handler";
             try {
-                Class<?> c = Class.forName(name);
-                return (URLStreamHandler)c.newInstance();
+                @SuppressWarnings("deprecation")
+                Object o = Class.forName(name).newInstance();
+                return (URLStreamHandler)o;
             } catch (ClassNotFoundException x) {
                 // ignore
             } catch (Exception e) {
@@ -1212,7 +1213,7 @@
 
     private static URLStreamHandler lookupViaProperty(String protocol) {
         String packagePrefixList =
-                GetPropertyAction.getProperty(protocolPathProp);
+                GetPropertyAction.privilegedGetProperty(protocolPathProp);
         if (packagePrefixList == null) {
             // not set
             return null;
@@ -1234,7 +1235,9 @@
                     }
                 }
                 if (cls != null) {
-                    handler = (URLStreamHandler)cls.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object tmp = cls.newInstance();
+                    handler = (URLStreamHandler)tmp;
                 }
             } catch (Exception e) {
                 // any number of exceptions can get thrown here
--- a/jdk/src/java.base/share/classes/java/net/URLConnection.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/net/URLConnection.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1323,7 +1323,9 @@
                     }
                 }
                 if (cls != null) {
-                    return (ContentHandler) cls.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object tmp = cls.newInstance();
+                    return (ContentHandler) tmp;
                 }
             } catch(Exception ignored) { }
         }
@@ -1397,7 +1399,7 @@
      */
     private String getContentHandlerPkgPrefixes() {
         String packagePrefixList =
-                GetPropertyAction.getProperty(contentPathProp, "");
+                GetPropertyAction.privilegedGetProperty(contentPathProp, "");
 
         if (packagePrefixList != "") {
             packagePrefixList += "|";
--- a/jdk/src/java.base/share/classes/java/net/URLEncoder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/net/URLEncoder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -133,7 +133,7 @@
         dontNeedEncoding.set('.');
         dontNeedEncoding.set('*');
 
-        dfltEncName = GetPropertyAction.getProperty("file.encoding");
+        dfltEncName = GetPropertyAction.privilegedGetProperty("file.encoding");
     }
 
     /**
--- a/jdk/src/java.base/share/classes/java/nio/channels/spi/AsynchronousChannelProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/nio/channels/spi/AsynchronousChannelProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -94,9 +94,10 @@
             if (cn == null)
                 return null;
             try {
-                Class<?> c = Class.forName(cn, true,
-                                           ClassLoader.getSystemClassLoader());
-                return (AsynchronousChannelProvider)c.newInstance();
+                @SuppressWarnings("deprecation")
+                Object tmp = Class.forName(cn, true,
+                                           ClassLoader.getSystemClassLoader()).newInstance();
+                return (AsynchronousChannelProvider)tmp;
             } catch (ClassNotFoundException x) {
                 throw new ServiceConfigurationError(null, x);
             } catch (IllegalAccessException x) {
--- a/jdk/src/java.base/share/classes/java/nio/channels/spi/SelectorProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/nio/channels/spi/SelectorProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -95,9 +95,10 @@
         if (cn == null)
             return false;
         try {
-            Class<?> c = Class.forName(cn, true,
-                                       ClassLoader.getSystemClassLoader());
-            provider = (SelectorProvider)c.newInstance();
+            @SuppressWarnings("deprecation")
+            Object tmp = Class.forName(cn, true,
+                                       ClassLoader.getSystemClassLoader()).newInstance();
+            provider = (SelectorProvider)tmp;
             return true;
         } catch (ClassNotFoundException x) {
             throw new ServiceConfigurationError(null, x);
--- a/jdk/src/java.base/share/classes/java/nio/charset/Charset.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/nio/charset/Charset.java	Wed Jul 05 21:40:37 2017 +0200
@@ -283,8 +283,8 @@
         if (level == null) {
             if (!VM.isBooted())
                 return false;
-            bugLevel = level =
-                    GetPropertyAction.getProperty("sun.nio.cs.bugLevel", "");
+            bugLevel = level = GetPropertyAction
+                    .privilegedGetProperty("sun.nio.cs.bugLevel", "");
         }
         return level.equals(bl);
     }
@@ -609,7 +609,8 @@
     public static Charset defaultCharset() {
         if (defaultCharset == null) {
             synchronized (Charset.class) {
-                String csn = GetPropertyAction.getProperty("file.encoding");
+                String csn = GetPropertyAction
+                        .privilegedGetProperty("file.encoding");
                 Charset cs = lookup(csn);
                 if (cs != null)
                     defaultCharset = cs;
--- a/jdk/src/java.base/share/classes/java/nio/file/TempFileHelper.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/nio/file/TempFileHelper.java	Wed Jul 05 21:40:37 2017 +0200
@@ -46,7 +46,7 @@
 
     // temporary directory location
     private static final Path tmpdir =
-        Paths.get(GetPropertyAction.getProperty("java.io.tmpdir"));
+        Paths.get(GetPropertyAction.privilegedGetProperty("java.io.tmpdir"));
 
     private static final boolean isPosix =
         FileSystems.getDefault().supportedFileAttributeViews().contains("posix");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/java/security/DrbgParameters.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,543 @@
+/*
+ * Copyright (c) 2016, 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 java.security;
+
+import java.util.Locale;
+import java.util.Objects;
+
+/**
+ * This class specifies the parameters used by a DRBG (Deterministic
+ * Random Bit Generator).
+ * <p>
+ * According to
+ * <a href="http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf">
+ * NIST Special Publication 800-90A Revision 1, Recommendation for Random
+ * Number Generation Using Deterministic Random Bit Generators</a> (800-90Ar1),
+ * <blockquote>
+ * A DRBG is based on a DRBG mechanism as specified in this Recommendation
+ * and includes a source of randomness. A DRBG mechanism uses an algorithm
+ * (i.e., a DRBG algorithm) that produces a sequence of bits from an initial
+ * value that is determined by a seed that is determined from the output of
+ * the randomness source."
+ * </blockquote>
+ * <p>
+ * The 800-90Ar1 specification allows for a variety of DRBG implementation
+ * choices, such as:
+ * <ul>
+ * <li> an entropy source,
+ * <li> a DRBG mechanism (for example, Hash_DRBG),
+ * <li> a DRBG algorithm (for example, SHA-256 for Hash_DRBG and AES-256
+ * for CTR_DRBG. Please note that it is not the algorithm used in
+ * {@link SecureRandom#getInstance}, which we will call a
+ * <em>SecureRandom algorithm</em> below),
+ * <li> optionally features, including prediction resistance
+ * and reseeding supports.
+ * <li> highest security strength.
+ * </ul>
+ * <p>
+ * These choices are set in each implementation and are not directly
+ * managed by the {@code SecureRandom} API.  Check your DRBG provider's
+ * documentation to find an appropriate implementation for the situation.
+ * <p>
+ * On the other hand, the 800-90Ar1 specification does have some configurable
+ * options, such as:
+ * <ul>
+ * <li> required security strength,
+ * <li> if prediction resistance is required,
+ * <li> personalization string and additional input.
+ * </ul>
+ * <p>
+ * A DRBG instance can be instantiated with parameters from an
+ * {@link DrbgParameters.Instantiation} object and other information
+ * (for example, the nonce, which is not managed by this API). This maps
+ * to the {@code Instantiate_function} defined in NIST SP 800-90Ar1.
+ * <p>
+ * A DRBG instance can be reseeded with parameters from a
+ * {@link DrbgParameters.Reseed} object. This maps to the
+ * {@code Reseed_function} defined in NIST SP 800-90Ar1. Calling
+ * {@link SecureRandom#reseed()} is equivalent to calling
+ * {@link SecureRandom#reseed(SecureRandomParameters)} with the effective
+ * instantiated prediction resistance flag (as returned by
+ * {@link SecureRandom#getParameters()}) with no additional input.
+ * <p>
+ * A DRBG instance generates data with additional parameters from a
+ * {@link DrbgParameters.NextBytes} object. This maps to the
+ * {@code Generate_function} defined in NIST SP 800-90Ar1. Calling
+ * {@link SecureRandom#nextBytes(byte[])} is equivalent to calling
+ * {@link SecureRandom#nextBytes(byte[], SecureRandomParameters)}
+ * with the effective instantiated strength and prediction resistance flag
+ * (as returned by {@link SecureRandom#getParameters()}) with no
+ * additional input.
+ * <p>
+ * A DRBG should be implemented as a subclass of {@link SecureRandomSpi}.
+ * It is recommended that the implementation contain the 1-arg
+ * {@linkplain SecureRandomSpi#SecureRandomSpi(SecureRandomParameters) constructor}
+ * that takes a {@code DrbgParameters.Instantiation} argument. If implemented
+ * this way, this implementation can be chosen by any
+ * {@code SecureRandom.getInstance()} method. If it is chosen by a
+ * {@code SecureRandom.getInstance()} with a {@link SecureRandomParameters}
+ * parameter, the parameter is passed into this constructor. If it is chosen
+ * by a {@code SecureRandom.getInstance()} without a
+ * {@code SecureRandomParameters} parameter, the constructor is called with
+ * a {@code null} argument and the implementation should choose its own
+ * parameters. Its {@link SecureRandom#getParameters()} must always return a
+ * non-null effective {@code DrbgParameters.Instantiation} object that reflects
+ * how the DRBG is actually instantiated. A caller can use this information
+ * to determine whether a {@code SecureRandom} object is a DRBG and what
+ * features it supports. Please note that the returned value does not
+ * necessarily equal to the {@code DrbgParameters.Instantiation} object passed
+ * into the {@code SecureRandom.getInstance()} call. For example,
+ * the requested capability can be {@link DrbgParameters.Capability#NONE}
+ * but the effective value can be {@link DrbgParameters.Capability#RESEED_ONLY}
+ * if the implementation supports reseeding. The implementation must implement
+ * the {@link SecureRandomSpi#engineNextBytes(byte[], SecureRandomParameters)}
+ * method which takes a {@code DrbgParameters.NextBytes} parameter. Unless
+ * the result of {@link SecureRandom#getParameters()} has its
+ * {@linkplain DrbgParameters.Instantiation#getCapability() capability} being
+ * {@link Capability#NONE NONE}, it must implement
+ * {@link SecureRandomSpi#engineReseed(SecureRandomParameters)} which takes
+ * a {@code DrbgParameters.Reseed} parameter.
+ * <p>
+ * On the other hand, if a DRBG implementation does not contain a constructor
+ * that has an {@code DrbgParameters.Instantiation} argument (not recommended),
+ * it can only be chosen by a {@code SecureRandom.getInstance()} without
+ * a {@code SecureRandomParameters} parameter, but will not be chosen if
+ * a {@code getInstance} method with a {@code SecureRandomParameters} parameter
+ * is called. If implemented this way, its {@link SecureRandom#getParameters()}
+ * must return {@code null}, and it does not need to implement either
+ * {@link SecureRandomSpi#engineNextBytes(byte[], SecureRandomParameters)}
+ * or {@link SecureRandomSpi#engineReseed(SecureRandomParameters)}.
+ * <p>
+ * A DRBG might reseed itself automatically if the seed period is bigger
+ * than the maximum seed life defined by the DRBG mechanism.
+ * <p>
+ * A DRBG implementation should support serialization and deserialization
+ * by retaining the configuration and effective parameters, but the internal
+ * state must not be serialized and the deserialized object must be
+ * reinstantiated.
+ * <p>
+ * Examples:
+ * <blockquote><pre>
+ * SecureRandom drbg;
+ * byte[] buffer = new byte[32];
+ *
+ * // Any DRBG is OK
+ * drbg = SecureRandom.getInstance("DRBG");
+ * drbg.nextBytes(buffer);
+ *
+ * SecureRandomParameters params = drbg.getParameters();
+ * if (params instanceof DrbgParameters.Instantiation) {
+ *     DrbgParameters.Instantiation ins = (DrbgParameters.Instantiation) params;
+ *     if (ins.getCapability().supportsReseeding()) {
+ *         drbg.reseed();
+ *     }
+ * }
+ *
+ * // The following call requests a weak DRBG instance. It is only
+ * // guaranteed to support 112 bits of security strength.
+ * drbg = SecureRandom.getInstance("DRBG",
+ *         DrbgParameters.instantiation(112, NONE, null));
+ *
+ * // Both the next two calls will likely fail, because drbg could be
+ * // instantiated with a smaller strength with no prediction resistance
+ * // support.
+ * drbg.nextBytes(buffer,
+ *         DrbgParameters.nextBytes(256, false, "more".getBytes()));
+ * drbg.nextBytes(buffer,
+ *         DrbgParameters.nextBytes(112, true, "more".getBytes()));
+ *
+ * // The following call requests a strong DRBG instance, with a
+ * // personalization string. If it successfully returns an instance,
+ * // that instance is guaranteed to support 256 bits of security strength
+ * // with prediction resistance available.
+ * drbg = SecureRandom.getInstance("DRBG", DrbgParameters.instantiation(
+ *         256, PR_AND_RESEED, "hello".getBytes()));
+ *
+ * // Prediction resistance is not requested in this single call,
+ * // but an additional input is used.
+ * drbg.nextBytes(buffer,
+ *         DrbgParameters.nextBytes(-1, false, "more".getBytes()));
+ *
+ * // Same for this call.
+ * drbg.reseed(DrbgParameters.reseed(false, "extra".getBytes()));</pre>
+ * </blockquote>
+ *
+ * @implSpec
+ * By convention, a provider should name its primary DRBG implementation
+ * with the <a href=
+ * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
+ * standard {@code SecureRandom} algorithm name</a> "DRBG".
+ *
+ * @implNote
+ * The following notes apply to the "DRBG" implementation in the SUN provider
+ * of the JDK reference implementation.
+ * <p>
+ * This implementation supports the Hash_DRBG and HMAC_DRBG mechanisms with
+ * DRBG algorithm SHA-1, SHA-224, SHA-512/224, SHA-256, SHA-512/256,
+ * SHA-384 and SHA-512, and CTR_DRBG (both using derivation function and
+ * not using derivation function) with DRBG algorithm 3KeyTDEA
+ * (also known as DESede in JCE), AES-128, AES-192 and AES-256.
+ * <p>
+ * The mechanism name and DRBG algorithm name are determined by the
+ * {@linkplain Security#getProperty(String) security property}
+ * {@code securerandom.drbg.config}. The default choice is Hash_DRBG
+ * with SHA-256.
+ * <p>
+ * For each combination, the security strength can be requested from 112
+ * up to the highest strength it supports. Both reseeding and prediction
+ * resistance are supported.
+ * <p>
+ * Personalization string is supported through the
+ * {@link DrbgParameters.Instantiation} class and additional input is supported
+ * through the {@link DrbgParameters.NextBytes} and
+ * {@link DrbgParameters.Reseed} classes.
+ * <p>
+ * If a DRBG is not instantiated with a {@link DrbgParameters.Instantiation}
+ * object explicitly, this implementation instantiates it with a default
+ * requested strength of 128 bits (112 bits for CTR_DRBG with 3KeyTDEA),
+ * no prediction resistance request, and no personalization string.
+ * These default instantiation parameters can also be customized with
+ * the {@code securerandom.drbg.config} security property.
+ * <p>
+ * This implementation reads fresh entropy from the system default entropy
+ * source determined by the security property {@code securerandom.source}.
+ * <p>
+ * Calling {@link SecureRandom#generateSeed(int)} will directly read
+ * from this system default entropy source.
+ * <p>
+ * This implementation has passed all tests included in the 20151104 version of
+ * <a href="http://csrc.nist.gov/groups/STM/cavp/documents/drbg/drbgtestvectors.zip">
+ * The DRBG Test Vectors</a>.
+ *
+ * @since 9
+ */
+public class DrbgParameters {
+
+    private DrbgParameters() {
+        // This class should not be instantiated
+    }
+
+    /**
+     * The reseedable and prediction resistance capabilities of a DRBG.
+     * <p>
+     * When this object is passed to a {@code SecureRandom.getInstance()} call,
+     * it is the requested minimum capability. When it's returned from
+     * {@code SecureRandom.getParameters()}, it is the effective capability.
+     * <p>
+     * Please note that while the {@code Instantiate_function} defined in
+     * NIST SP 800-90Ar1 only includes a {@code prediction_resistance_flag}
+     * parameter, the {@code Capability} type includes an extra value
+     * {@link #RESEED_ONLY} because reseeding is an optional function.
+     * If {@code NONE} is used in an {@code Instantiation} object in calling the
+     * {@code SecureRandom.getInstance} method, the returned DRBG instance
+     * is not guaranteed to support reseeding. If {@code RESEED_ONLY} or
+     * {@code PR_AND_RESEED} is used, the instance must support reseeding.
+     * <p>
+     * The table below lists possible effective values if a certain
+     * capability is requested, i.e.
+     * <blockquote><pre>
+     * Capability requested = ...;
+     * SecureRandom s = SecureRandom.getInstance("DRBG",
+     *         DrbgParameters(-1, requested, null));
+     * Capability effective = ((DrbgParametes.Initiate) s.getParameters())
+     *         .getCapability();</pre>
+     * </blockquote>
+     * <table border=1 summary="requested and effective capabilities">
+     * <tr>
+     * <th>Requested Value</th>
+     * <th>Possible Effective Values</th>
+     * </tr>
+     * <tr><td>NONE</td><td>NONE, RESEED_ONLY, PR_AND_RESEED</td></tr>
+     * <tr><td>RESEED_ONLY</td><td>RESEED_ONLY, PR_AND_RESEED</td></tr>
+     * <tr><td>PR_AND_RESEED</td><td>PR_AND_RESEED</td></tr>
+     * </table>
+     * <p>
+     * A DRBG implementation supporting prediction resistance must also
+     * support reseeding.
+     *
+     * @since 9
+     */
+    public enum Capability {
+
+        /**
+         * Both prediction resistance and reseed.
+         */
+        PR_AND_RESEED,
+
+        /**
+         * Reseed but no prediction resistance.
+         */
+        RESEED_ONLY,
+
+        /**
+         * Neither prediction resistance nor reseed.
+         */
+        NONE;
+
+        @Override
+        public String toString() {
+            return name().toLowerCase(Locale.ROOT);
+        }
+
+        /**
+         * Returns whether this capability supports reseeding.
+         *
+         * @return {@code true} for {@link #PR_AND_RESEED} and
+         *      {@link #RESEED_ONLY}, and {@code false} for {@link #NONE}
+         */
+        public boolean supportsReseeding() {
+            return this != NONE;
+        }
+
+        /**
+         * Returns whether this capability supports prediction resistance.
+         *
+         * @return {@code true} for {@link #PR_AND_RESEED}, and {@code false}
+         *      for {@link #RESEED_ONLY} and {@link #NONE}
+         */
+        public boolean supportsPredictionResistance() {
+            return this == PR_AND_RESEED;
+        }
+    }
+
+    /**
+     * DRBG parameters for instantiation.
+     * <p>
+     * When used in
+     * {@link SecureRandom#getInstance(String, SecureRandomParameters)}
+     * or one of the other similar {@code getInstance} calls that take a
+     * {@code SecureRandomParameters} parameter, it means the
+     * requested instantiate parameters the newly created {@code SecureRandom}
+     * object must minimally support. When used as the return value of the
+     * {@link SecureRandom#getParameters()} method, it means the effective
+     * instantiate parameters of the {@code SecureRandom} object.
+     *
+     * @since 9
+     */
+    public static final class Instantiation
+            implements SecureRandomParameters {
+
+        private final int strength;
+        private final Capability capability;
+        private final byte[] personalizationString;
+
+        /**
+         * Returns the security strength in bits.
+         *
+         * @return If used in {@code getInstance}, returns the minimum strength
+         * requested, or -1 if there is no specific request on the strength.
+         * If used in {@code getParameters}, returns the effective strength.
+         * The effective strength must be greater than or equal to the minimum
+         * strength requested.
+         */
+        public int getStrength() {
+            return strength;
+        }
+
+        /**
+         * Returns the capability.
+         *
+         * @return If used in {@code getInstance}, returns the minimum
+         * capability requested. If used in {@code getParameters}, returns
+         * information on the effective prediction resistance flag and
+         * whether it supports reseeding.
+         */
+        public Capability getCapability() {
+            return capability;
+        }
+
+        /**
+         * Returns the personalization string as a byte array.
+         *
+         * @return If used in {@code getInstance}, returns the requested
+         * personalization string as a newly allocated array, or {@code null}
+         * if no personalization string is requested. The same string should
+         * be returned in {@code getParameters} as a new copy, or {@code null}
+         * if no personalization string is requested in {@code getInstance}.
+         */
+        public byte[] getPersonalizationString() {
+            return (personalizationString == null) ?
+                    null : personalizationString.clone();
+        }
+
+        private Instantiation(int strength, Capability capability,
+                              byte[] personalizationString) {
+            this.strength = strength;
+            this.capability = capability;
+            this.personalizationString = (personalizationString == null) ?
+                    null : personalizationString.clone();
+        }
+
+        /**
+         * Returns a Human-readable string representation of this
+         * {@code Instantiation}.
+         *
+         * @return the string representation
+         */
+        @Override
+        public String toString() {
+            // I don't care what personalizationString looks like
+            return strength + "," + capability + "," + personalizationString;
+        }
+    }
+
+    /**
+     * DRBG parameters for random bits generation. It is used in
+     * {@link SecureRandom#nextBytes(byte[], SecureRandomParameters)}.
+     *
+     * @since 9
+     */
+    public static final class NextBytes
+            implements SecureRandomParameters {
+        private final int strength;
+        private final boolean predictionResistance;
+        private final byte[] additionalInput;
+
+        /**
+         * Returns the security strength requested in bits.
+         *
+         * @return the strength requested, or -1 if the effective strength
+         *      should be used.
+         */
+        public int getStrength() {
+            return strength;
+        }
+
+        /**
+         * Returns whether prediction resistance is requested.
+         *
+         * @return whether prediction resistance is requested
+         */
+        public boolean getPredictionResistance() {
+            return predictionResistance;
+        }
+
+        /**
+         * Returns the requested additional input.
+         *
+         * @return the requested additional input, {@code null} if not
+         * requested. A new byte array is returned each time this method
+         * is called.
+         */
+        public byte[] getAdditionalInput() {
+            return additionalInput == null? null: additionalInput.clone();
+        }
+
+        private NextBytes(int strength, boolean predictionResistance,
+                          byte[] additionalInput) {
+            this.strength = strength;
+            this.predictionResistance = predictionResistance;
+            this.additionalInput = (additionalInput == null) ?
+                    null : additionalInput.clone();
+        }
+    }
+
+    /**
+     * DRBG parameters for reseed. It is used in
+     * {@link SecureRandom#reseed(SecureRandomParameters)}.
+     *
+     * @since 9
+     */
+    public static final class Reseed implements SecureRandomParameters {
+
+        private final byte[] additionalInput;
+        private final boolean predictionResistance;
+
+        /**
+         * Returns whether prediction resistance is requested.
+         *
+         * @return whether prediction resistance is requested
+         */
+        public boolean getPredictionResistance() {
+            return predictionResistance;
+        }
+
+        /**
+         * Returns the requested additional input.
+         *
+         * @return the requested additional input, or {@code null} if
+         * not requested. A new byte array is returned each time this method
+         * is called.
+         */
+        public byte[] getAdditionalInput() {
+            return additionalInput == null ? null : additionalInput.clone();
+        }
+
+        private Reseed(boolean predictionResistance, byte[] additionalInput) {
+            this.predictionResistance = predictionResistance;
+            this.additionalInput = (additionalInput == null) ?
+                    null : additionalInput.clone();
+        }
+    }
+
+    /**
+     * Generates a {@link DrbgParameters.Instantiation} object.
+     *
+     * @param strength security strength in bits, -1 for default strength
+     *                 if used in {@code getInstance}.
+     * @param capability capability
+     * @param personalizationString personalization string as a byte array,
+     *                              can be {@code null}. The content of this
+     *                              byte array will be copied.
+     * @return a new {@code Instantiation} object
+     * @throws NullPointerException if {@code capability} is {@code null}
+     */
+    public static Instantiation instantiation(int strength,
+                                              Capability capability,
+                                              byte[] personalizationString) {
+        return new Instantiation(strength, Objects.requireNonNull(capability),
+                personalizationString);
+    }
+
+    /**
+     * Generates a {@link NextBytes} object.
+     *
+     * @param strength requested security strength in bits. If set to -1, the
+     *                 effective strength will be used.
+     * @param predictionResistance prediction resistance requested
+     * @param additionalInput additional input, can be {@code null}.
+     *                        The content of this byte array will be copied.
+     * @return a new {@code NextBytes} object
+     */
+    public static NextBytes nextBytes(int strength,
+                                      boolean predictionResistance,
+                                      byte[] additionalInput) {
+        return new NextBytes(strength, predictionResistance, additionalInput);
+    }
+
+    /**
+     * Generates a {@link Reseed} object.
+     *
+     * @param predictionResistance prediction resistance requested
+     * @param additionalInput additional input, can be {@code null}.
+     *                        The content of this byte array will be copied.
+     * @return a new {@code Reseed} object
+     */
+    public static Reseed reseed(
+            boolean predictionResistance, byte[] additionalInput) {
+        return new Reseed(predictionResistance, additionalInput);
+    }
+}
--- a/jdk/src/java.base/share/classes/java/security/Policy.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/security/Policy.java	Wed Jul 05 21:40:37 2017 +0200
@@ -222,8 +222,9 @@
             public Policy run() {
                 try {
                     ClassLoader scl = ClassLoader.getSystemClassLoader();
-                    Class<?> c = Class.forName(policyProvider, true, scl);
-                    return (Policy)c.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object o = Class.forName(policyProvider, true, scl).newInstance();
+                    return (Policy)o;
                 } catch (Exception e) {
                     if (debug != null) {
                         debug.println("policy provider " + policyProvider +
--- a/jdk/src/java.base/share/classes/java/security/Provider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/security/Provider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved
+ * Copyright (c) 1996, 2016, 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
@@ -142,8 +142,35 @@
             Constructor<?> con = clazz.getConstructor();
             return con.newInstance();
         } else {
-            Constructor<?> con = clazz.getConstructor(ctrParamClz);
-            return con.newInstance(ctorParamObj);
+            // Looking for the constructor with a params first and fallback
+            // to one without if not found. This is to support the enhanced
+            // SecureRandom where both styles of constructors are supported.
+            // Before jdk9, there was no params support (only getInstance(alg))
+            // and an impl only had the params-less constructor. Since jdk9,
+            // there is getInstance(alg,params) and an impl can contain
+            // an Impl(params) constructor.
+            try {
+                Constructor<?> con = clazz.getConstructor(ctrParamClz);
+                return con.newInstance(ctorParamObj);
+            } catch (NoSuchMethodException nsme) {
+                // For pre-jdk9 SecureRandom implementations, they only
+                // have params-less constructors which still works when
+                // the input ctorParamObj is null.
+                //
+                // For other primitives using params, ctorParamObj should not
+                // be null and nsme is thrown, just like before.
+                if (ctorParamObj == null) {
+                    try {
+                        Constructor<?> con = clazz.getConstructor();
+                        return con.newInstance();
+                    } catch (NoSuchMethodException nsme2) {
+                        nsme.addSuppressed(nsme2);
+                        throw nsme;
+                    }
+                } else {
+                    throw nsme;
+                }
+            }
         }
     }
 
@@ -1384,7 +1411,8 @@
         addEngine("KeyPairGenerator",                   false, null);
         addEngine("KeyStore",                           false, null);
         addEngine("MessageDigest",                      false, null);
-        addEngine("SecureRandom",                       false, null);
+        addEngine("SecureRandom",                       false,
+                "java.security.SecureRandomParameters");
         addEngine("Signature",                          true,  null);
         addEngine("CertificateFactory",                 false, null);
         addEngine("CertPathBuilder",                    false, null);
@@ -1678,6 +1706,7 @@
                         }
                     }
                 }
+                // constructorParameter can be null if not provided
                 return newInstanceUtil(getImplClass(), ctrParamClz, constructorParameter);
             } catch (NoSuchAlgorithmException e) {
                 throw e;
--- a/jdk/src/java.base/share/classes/java/security/SecureRandom.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/security/SecureRandom.java	Wed Jul 05 21:40:37 2017 +0200
@@ -38,52 +38,87 @@
  * This class provides a cryptographically strong random number
  * generator (RNG).
  *
- * <p>A cryptographically strong random number
- * minimally complies with the statistical random number generator tests
- * specified in
+ * <p>A cryptographically strong random number minimally complies with the
+ * statistical random number generator tests specified in
  * <a href="http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf">
  * <i>FIPS 140-2, Security Requirements for Cryptographic Modules</i></a>,
  * section 4.9.1.
- * Additionally, SecureRandom must produce non-deterministic output.
- * Therefore any seed material passed to a SecureRandom object must be
- * unpredictable, and all SecureRandom output sequences must be
+ * Additionally, {@code SecureRandom} must produce non-deterministic output.
+ * Therefore any seed material passed to a {@code SecureRandom} object must be
+ * unpredictable, and all {@code SecureRandom} output sequences must be
  * cryptographically strong, as described in
  * <a href="http://tools.ietf.org/html/rfc4086">
  * <i>RFC 4086: Randomness Requirements for Security</i></a>.
  *
- * <p>A caller obtains a SecureRandom instance via the
- * no-argument constructor or one of the {@code getInstance} methods:
- *
- * <pre>
- *      SecureRandom random = new SecureRandom();
- * </pre>
- *
- * <p> Many SecureRandom implementations are in the form of a pseudo-random
- * number generator (PRNG), which means they use a deterministic algorithm
- * to produce a pseudo-random sequence from a true random seed.
+ * <p> Many {@code SecureRandom} implementations are in the form of a
+ * pseudo-random number generator (PRNG, also known as deterministic random
+ * bits generator or DRBG), which means they use a deterministic algorithm
+ * to produce a pseudo-random sequence from a random seed.
  * Other implementations may produce true random numbers,
  * and yet others may use a combination of both techniques.
  *
- * <p> Typical callers of SecureRandom invoke the following methods
+ * <p>A caller obtains a {@code SecureRandom} instance via the
+ * no-argument constructor or one of the {@code getInstance} methods.
+ * For example:
+ *
+ * <blockquote><pre>
+ * SecureRandom r1 = new SecureRandom();
+ * SecureRandom r2 = SecureRandom.getInstance("NativePRNG");
+ * SecureRandom r3 = SecureRandom("DRBG",
+ *         DrbgParameters.Instantiation(128, RESEED_ONLY, null));</pre>
+ * </blockquote>
+ *
+ * <p> The third statement above returns a {@code SecureRandom} object of the
+ * specific algorithm supporting the specific instantiate parameters. The
+ * implementation's effective instantiated parameters must match this minimum
+ * request but is not necessarily the same. For example, even if the request
+ * does not require a certain feature, the actual instantiation can provide
+ * the feature. An implementation may lazily instantiate a {@code SecureRandom}
+ * until it's actually used, but the effective instantiate parameters must be
+ * determined right after it's created and {@link #getParameters()} should
+ * always return the same result unchanged.
+ *
+ * <p> Typical callers of {@code SecureRandom} invoke the following methods
  * to retrieve random bytes:
  *
- * <pre>
- *      SecureRandom random = new SecureRandom();
- *      byte[] bytes = new byte[20];
- *      random.nextBytes(bytes);
- * </pre>
+ * <blockquote><pre>
+ * SecureRandom random = new SecureRandom();
+ * byte[] bytes = new byte[20];
+ * random.nextBytes(bytes);</pre>
+ * </blockquote>
  *
- * <p> Callers may also invoke the {@code generateSeed} method
+ * <p> Callers may also invoke the {@link #generateSeed} method
  * to generate a given number of seed bytes (to seed other random number
  * generators, for example):
- * <pre>
- *      byte[] seed = random.generateSeed(20);
- * </pre>
+ *
+ * <blockquote><pre>
+ * byte[] seed = random.generateSeed(20);</pre>
+ * </blockquote>
+ *
+ * <p> A newly created PRNG {@code SecureRandom} object is not seeded (except
+ * if it is created by {@link #SecureRandom(byte[])}). The first call to
+ * {@code nextBytes} will force it to seed itself from an implementation-
+ * specific entropy source. This self-seeding will not occur if {@code setSeed}
+ * was previously called.
  *
- * Note: Depending on the implementation, the {@code generateSeed} and
- * {@code nextBytes} methods may block as entropy is being gathered,
- * for example, if they need to read from /dev/random on various Unix-like
- * operating systems.
+ * <p> A {@code SecureRandom} can be reseeded at any time by calling the
+ * {@code reseed} or {@code setSeed} method. The {@code reseed} method
+ * reads entropy input from its entropy source to reseed itself.
+ * The {@code setSeed} method requires the caller to provide the seed.
+ *
+ * <p> Please note that {@code reseed} may not be supported by all
+ * {@code SecureRandom} implementations.
+ *
+ * <p> Some {@code SecureRandom} implementations may accept a
+ * {@link SecureRandomParameters} parameter in its
+ * {@link #nextBytes(byte[], SecureRandomParameters)} and
+ * {@link #reseed(SecureRandomParameters)} methods to further
+ * control the behavior of the methods.
+ *
+ * <p> Note: Depending on the implementation, the {@code generateSeed},
+ * {@code reseed} and {@code nextBytes} methods may block as entropy is being
+ * gathered, for example, if the entropy source is /dev/random on various
+ * Unix-like operating systems.
  *
  * @see java.security.SecureRandomSpi
  * @see java.util.Random
@@ -132,26 +167,19 @@
      *
      * <p> This constructor traverses the list of registered security Providers,
      * starting with the most preferred Provider.
-     * A new SecureRandom object encapsulating the
-     * SecureRandomSpi implementation from the first
-     * Provider that supports a SecureRandom (RNG) algorithm is returned.
+     * A new {@code SecureRandom} object encapsulating the
+     * {@code SecureRandomSpi} implementation from the first
+     * Provider that supports a {@code SecureRandom} (RNG) algorithm is returned.
      * If none of the Providers support a RNG algorithm,
      * then an implementation-specific default is returned.
      *
      * <p> Note that the list of registered providers may be retrieved via
      * the {@link Security#getProviders() Security.getProviders()} method.
      *
-     * <p> See the SecureRandom section in the <a href=
+     * <p> See the {@code SecureRandom} section in the <a href=
      * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
      * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
      * for information about standard RNG algorithm names.
-     *
-     * <p> The returned SecureRandom object has not been seeded.  To seed the
-     * returned object, call the {@code setSeed} method.
-     * If {@code setSeed} is not called, the first call to
-     * {@code nextBytes} will force the SecureRandom object to seed itself.
-     * This self-seeding will not occur if {@code setSeed} was
-     * previously called.
      */
     public SecureRandom() {
         /*
@@ -166,20 +194,20 @@
     /**
      * Constructs a secure random number generator (RNG) implementing the
      * default random number algorithm.
-     * The SecureRandom instance is seeded with the specified seed bytes.
+     * The {@code SecureRandom} instance is seeded with the specified seed bytes.
      *
      * <p> This constructor traverses the list of registered security Providers,
      * starting with the most preferred Provider.
-     * A new SecureRandom object encapsulating the
-     * SecureRandomSpi implementation from the first
-     * Provider that supports a SecureRandom (RNG) algorithm is returned.
+     * A new {@code SecureRandom} object encapsulating the
+     * {@code SecureRandomSpi} implementation from the first
+     * Provider that supports a {@code SecureRandom} (RNG) algorithm is returned.
      * If none of the Providers support a RNG algorithm,
      * then an implementation-specific default is returned.
      *
      * <p> Note that the list of registered providers may be retrieved via
      * the {@link Security#getProviders() Security.getProviders()} method.
      *
-     * <p> See the SecureRandom section in the <a href=
+     * <p> See the {@code SecureRandom} section in the <a href=
      * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
      * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
      * for information about standard RNG algorithm names.
@@ -225,9 +253,9 @@
     }
 
     /**
-     * Creates a SecureRandom object.
+     * Creates a {@code SecureRandom} object.
      *
-     * @param secureRandomSpi the SecureRandom implementation.
+     * @param secureRandomSpi the {@code SecureRandom} implementation.
      * @param provider the provider.
      */
     protected SecureRandom(SecureRandomSpi secureRandomSpi,
@@ -249,25 +277,18 @@
     }
 
     /**
-     * Returns a SecureRandom object that implements the specified
+     * Returns a {@code SecureRandom} object that implements the specified
      * Random Number Generator (RNG) algorithm.
      *
      * <p> This method traverses the list of registered security Providers,
      * starting with the most preferred Provider.
-     * A new SecureRandom object encapsulating the
-     * SecureRandomSpi implementation from the first
+     * A new {@code SecureRandom} object encapsulating the
+     * {@code SecureRandomSpi} implementation from the first
      * Provider that supports the specified algorithm is returned.
      *
      * <p> Note that the list of registered providers may be retrieved via
      * the {@link Security#getProviders() Security.getProviders()} method.
      *
-     * <p> The returned SecureRandom object has not been seeded.  To seed the
-     * returned object, call the {@code setSeed} method.
-     * If {@code setSeed} is not called, the first call to
-     * {@code nextBytes} will force the SecureRandom object to seed itself.
-     * This self-seeding will not occur if {@code setSeed} was
-     * previously called.
-     *
      * @implNote
      * The JDK Reference Implementation additionally uses the
      * {@code jdk.security.provider.preferred}
@@ -277,15 +298,15 @@
      * {@link Security#getProviders() Security.getProviders()}.
      *
      * @param algorithm the name of the RNG algorithm.
-     * See the SecureRandom section in the <a href=
+     * See the {@code SecureRandom} section in the <a href=
      * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
      * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
      * for information about standard RNG algorithm names.
      *
-     * @return the new SecureRandom object.
+     * @return the new {@code SecureRandom} object.
      *
      * @exception NoSuchAlgorithmException if no Provider supports a
-     *          SecureRandomSpi implementation for the
+     *          {@code SecureRandomSpi} implementation for the
      *          specified algorithm.
      *
      * @see Provider
@@ -295,49 +316,42 @@
     public static SecureRandom getInstance(String algorithm)
             throws NoSuchAlgorithmException {
         Instance instance = GetInstance.getInstance("SecureRandom",
-            SecureRandomSpi.class, algorithm);
+                SecureRandomSpi.class, algorithm);
         return new SecureRandom((SecureRandomSpi)instance.impl,
-            instance.provider, algorithm);
+                instance.provider, algorithm);
     }
 
     /**
-     * Returns a SecureRandom object that implements the specified
+     * Returns a {@code SecureRandom} object that implements the specified
      * Random Number Generator (RNG) algorithm.
      *
-     * <p> A new SecureRandom object encapsulating the
-     * SecureRandomSpi implementation from the specified provider
+     * <p> A new {@code SecureRandom} object encapsulating the
+     * {@code SecureRandomSpi} implementation from the specified provider
      * is returned.  The specified provider must be registered
      * in the security provider list.
      *
      * <p> Note that the list of registered providers may be retrieved via
      * the {@link Security#getProviders() Security.getProviders()} method.
      *
-     * <p> The returned SecureRandom object has not been seeded.  To seed the
-     * returned object, call the {@code setSeed} method.
-     * If {@code setSeed} is not called, the first call to
-     * {@code nextBytes} will force the SecureRandom object to seed itself.
-     * This self-seeding will not occur if {@code setSeed} was
-     * previously called.
-     *
      * @param algorithm the name of the RNG algorithm.
-     * See the SecureRandom section in the <a href=
+     * See the {@code SecureRandom} section in the <a href=
      * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
      * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
      * for information about standard RNG algorithm names.
      *
      * @param provider the name of the provider.
      *
-     * @return the new SecureRandom object.
+     * @return the new {@code SecureRandom} object.
      *
-     * @exception NoSuchAlgorithmException if a SecureRandomSpi
-     *          implementation for the specified algorithm is not
-     *          available from the specified provider.
+     * @throws NoSuchAlgorithmException if a {@code SecureRandomSpi}
+     *         implementation for the specified algorithm is not
+     *         available from the specified provider.
      *
-     * @exception NoSuchProviderException if the specified provider is not
-     *          registered in the security provider list.
+     * @throws NoSuchProviderException if the specified provider is not
+     *         registered in the security provider list.
      *
-     * @exception IllegalArgumentException if the provider name is null
-     *          or empty.
+     * @throws IllegalArgumentException if the provider name is null
+     *         or empty.
      *
      * @see Provider
      *
@@ -352,36 +366,29 @@
     }
 
     /**
-     * Returns a SecureRandom object that implements the specified
+     * Returns a {@code SecureRandom} object that implements the specified
      * Random Number Generator (RNG) algorithm.
      *
-     * <p> A new SecureRandom object encapsulating the
-     * SecureRandomSpi implementation from the specified Provider
-     * object is returned.  Note that the specified Provider object
+     * <p> A new {@code SecureRandom} object encapsulating the
+     * {@code SecureRandomSpi} implementation from the specified {@code Provider}
+     * object is returned.  Note that the specified {@code Provider} object
      * does not have to be registered in the provider list.
      *
-     * <p> The returned SecureRandom object has not been seeded.  To seed the
-     * returned object, call the {@code setSeed} method.
-     * If {@code setSeed} is not called, the first call to
-     * {@code nextBytes} will force the SecureRandom object to seed itself.
-     * This self-seeding will not occur if {@code setSeed} was
-     * previously called.
-     *
      * @param algorithm the name of the RNG algorithm.
-     * See the SecureRandom section in the <a href=
+     * See the {@code SecureRandom} section in the <a href=
      * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
      * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
      * for information about standard RNG algorithm names.
      *
      * @param provider the provider.
      *
-     * @return the new SecureRandom object.
+     * @return the new {@code SecureRandom} object.
      *
-     * @exception NoSuchAlgorithmException if a SecureRandomSpi
-     *          implementation for the specified algorithm is not available
-     *          from the specified Provider object.
+     * @throws NoSuchAlgorithmException if a {@code SecureRandomSpi}
+     *         implementation for the specified algorithm is not available
+     *         from the specified {@code Provider} object.
      *
-     * @exception IllegalArgumentException if the specified provider is null.
+     * @throws IllegalArgumentException if the specified provider is null.
      *
      * @see Provider
      *
@@ -396,24 +403,178 @@
     }
 
     /**
-     * Returns the SecureRandomSpi of this SecureRandom object.
+     * Returns a {@code SecureRandom} object that implements the specified
+     * Random Number Generator (RNG) algorithm and supports the specified
+     * {@code SecureRandomParameters} request.
+     *
+     * <p> This method traverses the list of registered security Providers,
+     * starting with the most preferred Provider.
+     * A new {@code SecureRandom} object encapsulating the
+     * {@code SecureRandomSpi} implementation from the first
+     * Provider that supports the specified algorithm and the specified
+     * {@code SecureRandomParameters} is returned.
+     *
+     * <p> Note that the list of registered providers may be retrieved via
+     * the {@link Security#getProviders() Security.getProviders()} method.
+     *
+     * @implNote
+     * The JDK Reference Implementation additionally uses the
+     * {@code jdk.security.provider.preferred} property to determine
+     * the preferred provider order for the specified algorithm. This
+     * may be different than the order of providers returned by
+     * {@link Security#getProviders() Security.getProviders()}.
+     *
+     * @param algorithm the name of the RNG algorithm.
+     * See the {@code SecureRandom} section in the <a href=
+     * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
+     * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
+     * for information about standard RNG algorithm names.
+     *
+     * @param params the {@code SecureRandomParameters}
+     *               the newly created {@code SecureRandom} object must support.
+     *
+     * @return the new {@code SecureRandom} object.
+     *
+     * @throws NoSuchAlgorithmException if no Provider supports a
+     *         {@code SecureRandomSpi} implementation for the specified
+     *         algorithm and parameters.
+     *
+     * @throws IllegalArgumentException if the specified params is null.
+     *
+     * @see Provider
+     *
+     * @since 9
+     */
+    public static SecureRandom getInstance(
+            String algorithm, SecureRandomParameters params)
+            throws NoSuchAlgorithmException {
+        if (params == null) {
+            throw new IllegalArgumentException("params cannot be null");
+        }
+        Instance instance = GetInstance.getInstance("SecureRandom",
+                SecureRandomSpi.class, algorithm, params);
+        return new SecureRandom((SecureRandomSpi)instance.impl,
+                instance.provider, algorithm);
+    }
+
+    /**
+     * Returns a {@code SecureRandom} object that implements the specified
+     * Random Number Generator (RNG) algorithm and supports the specified
+     * {@code SecureRandomParameters} request.
+     *
+     * <p> A new {@code SecureRandom} object encapsulating the
+     * {@code SecureRandomSpi} implementation from the specified provider
+     * is returned.  The specified provider must be registered
+     * in the security provider list.
+     *
+     * <p> Note that the list of registered providers may be retrieved via
+     * the {@link Security#getProviders() Security.getProviders()} method.
+     *
+     * @param algorithm the name of the RNG algorithm.
+     * See the {@code SecureRandom} section in the <a href=
+     * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
+     * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
+     * for information about standard RNG algorithm names.
+     *
+     * @param params the {@code SecureRandomParameters}
+     *               the newly created {@code SecureRandom} object must support.
+     *
+     * @param provider the name of the provider.
+     *
+     * @return the new {@code SecureRandom} object.
+     *
+     * @throws NoSuchAlgorithmException if the specified provider does not
+     *         support a {@code SecureRandomSpi} implementation for the
+     *         specified algorithm and parameters.
+     *
+     * @throws NoSuchProviderException if the specified provider is not
+     *         registered in the security provider list.
+     *
+     * @throws IllegalArgumentException if the provider name is null
+     *         or empty, or params is null.
+     *
+     * @see Provider
+     *
+     * @since 9
+     */
+    public static SecureRandom getInstance(String algorithm,
+            SecureRandomParameters params, String provider)
+            throws NoSuchAlgorithmException, NoSuchProviderException {
+        if (params == null) {
+            throw new IllegalArgumentException("params cannot be null");
+        }
+        Instance instance = GetInstance.getInstance("SecureRandom",
+                SecureRandomSpi.class, algorithm, params, provider);
+        return new SecureRandom((SecureRandomSpi)instance.impl,
+                instance.provider, algorithm);
+    }
+
+    /**
+     * Returns a {@code SecureRandom} object that implements the specified
+     * Random Number Generator (RNG) algorithm and supports the specified
+     * {@code SecureRandomParameters} request.
+     *
+     * <p> A new {@code SecureRandom} object encapsulating the
+     * {@code SecureRandomSpi} implementation from the specified
+     * {@code Provider} object is returned.  Note that the specified
+     * {@code Provider} object does not have to be registered in the
+     * provider list.
+     *
+     * @param algorithm the name of the RNG algorithm.
+     * See the {@code SecureRandom} section in the <a href=
+     * "{@docRoot}/../technotes/guides/security/StandardNames.html#SecureRandom">
+     * Java Cryptography Architecture Standard Algorithm Name Documentation</a>
+     * for information about standard RNG algorithm names.
+     *
+     * @param params the {@code SecureRandomParameters}
+     *               the newly created {@code SecureRandom} object must support.
+     *
+     * @param provider the provider.
+     *
+     * @return the new {@code SecureRandom} object.
+     *
+     * @throws NoSuchAlgorithmException if the specified provider does not
+     *         support a {@code SecureRandomSpi} implementation for the
+     *         specified algorithm and parameters.
+     *
+     * @throws IllegalArgumentException if the specified provider or params
+     *         is null.
+     *
+     * @see Provider
+     *
+     * @since 9
+     */
+    public static SecureRandom getInstance(String algorithm,
+            SecureRandomParameters params, Provider provider)
+            throws NoSuchAlgorithmException {
+        if (params == null) {
+            throw new IllegalArgumentException("params cannot be null");
+        }
+        Instance instance = GetInstance.getInstance("SecureRandom",
+                SecureRandomSpi.class, algorithm, params, provider);
+        return new SecureRandom((SecureRandomSpi)instance.impl,
+                instance.provider, algorithm);
+    }
+
+    /**
+     * Returns the {@code SecureRandomSpi} of this {@code SecureRandom} object.
      */
     SecureRandomSpi getSecureRandomSpi() {
         return secureRandomSpi;
     }
 
     /**
-     * Returns the provider of this SecureRandom object.
+     * Returns the provider of this {@code SecureRandom} object.
      *
-     * @return the provider of this SecureRandom object.
+     * @return the provider of this {@code SecureRandom} object.
      */
     public final Provider getProvider() {
         return provider;
     }
 
     /**
-     * Returns the name of the algorithm implemented by this SecureRandom
-     * object.
+     * Returns the name of the algorithm implemented by this
+     * {@code SecureRandom} object.
      *
      * @return the name of the algorithm or {@code unknown}
      *          if the algorithm name cannot be determined.
@@ -424,9 +585,49 @@
     }
 
     /**
-     * Reseeds this random object. The given seed supplements, rather than
-     * replaces, the existing seed. Thus, repeated calls are guaranteed
-     * never to reduce randomness.
+     * Returns a Human-readable string representation of this
+     * {@code SecureRandom}.
+     *
+     * @return the string representation
+     *
+     * @since 9
+     */
+    @Override
+    public String toString() {
+        return secureRandomSpi.toString();
+    }
+
+    /**
+     * Returns the effective {@link SecureRandomParameters} for this
+     * {@code SecureRandom} instance.
+     * <p>
+     * The returned value can be different from the
+     * {@code SecureRandomParameters} object passed into a {@code getInstance}
+     * method, but it cannot change during the lifetime of this
+     * {@code SecureRandom} object.
+     * <p>
+     * A caller can use the returned value to find out what features this
+     * {@code SecureRandom} supports.
+     *
+     * @return the effective {@link SecureRandomParameters} parameters,
+     * or {@code null} if no parameters were used.
+     *
+     * @since 9
+     * @see SecureRandomSpi
+     */
+    public SecureRandomParameters getParameters() {
+        return secureRandomSpi.engineGetParameters();
+    }
+
+    /**
+     * Reseeds this random object with the given seed. The seed supplements,
+     * rather than replaces, the existing seed. Thus, repeated calls are
+     * guaranteed never to reduce randomness.
+     * <p>
+     * A PRNG {@code SecureRandom} will not seed itself automatically if
+     * {@code setSeed} is called before any {@code nextBytes} or {@code reseed}
+     * calls. The caller should make sure that the {@code seed} argument
+     * contains enough entropy for the security of this {@code SecureRandom}.
      *
      * @param seed the seed.
      *
@@ -458,18 +659,13 @@
          * yet been initialized at that point.
          */
         if (seed != 0) {
-            secureRandomSpi.engineSetSeed(longToByteArray(seed));
+            this.secureRandomSpi.engineSetSeed(longToByteArray(seed));
         }
     }
 
     /**
      * Generates a user-specified number of random bytes.
      *
-     * <p> If a call to {@code setSeed} had not occurred previously,
-     * the first call to this method forces this SecureRandom object
-     * to seed itself.  This self-seeding will not occur if
-     * {@code setSeed} was previously called.
-     *
      * @param bytes the array to be filled in with random bytes.
      */
     @Override
@@ -478,6 +674,28 @@
     }
 
     /**
+     * Generates a user-specified number of random bytes with
+     * additional parameters.
+     *
+     * @param bytes the array to be filled in with random bytes
+     * @param params additional parameters
+     * @throws NullPointerException if {@code bytes} is null
+     * @throws UnsupportedOperationException if the underlying provider
+     *         implementation has not overridden this method
+     * @throws IllegalArgumentException if {@code params} is {@code null},
+     *         illegal or unsupported by this {@code SecureRandom}
+     *
+     * @since 9
+     */
+    public synchronized void nextBytes(
+            byte[] bytes, SecureRandomParameters params) {
+        if (params == null) {
+            throw new IllegalArgumentException("params cannot be null");
+        }
+        secureRandomSpi.engineNextBytes(Objects.requireNonNull(bytes), params);
+    }
+
+    /**
      * Generates an integer containing the user-specified number of
      * pseudo-random bits (right justified, with leading zeros).  This
      * method overrides a {@code java.util.Random} method, and serves
@@ -512,7 +730,7 @@
      *
      * <p>This method is only included for backwards compatibility.
      * The caller is encouraged to use one of the alternative
-     * {@code getInstance} methods to obtain a SecureRandom object, and
+     * {@code getInstance} methods to obtain a {@code SecureRandom} object, and
      * then call the {@code generateSeed} method to obtain seed bytes
      * from that object.
      *
@@ -537,10 +755,13 @@
      * call may be used to seed other random number generators.
      *
      * @param numBytes the number of seed bytes to generate.
-     *
+     * @throws IllegalArgumentException if {@code numBytes} is negative
      * @return the seed bytes.
      */
     public byte[] generateSeed(int numBytes) {
+        if (numBytes < 0) {
+            throw new IllegalArgumentException("numBytes cannot be negative");
+        }
         return secureRandomSpi.engineGenerateSeed(numBytes);
     }
 
@@ -562,8 +783,8 @@
     /**
      * Gets a default PRNG algorithm by looking through all registered
      * providers. Returns the first PRNG algorithm of the first provider that
-     * has registered a SecureRandom implementation, or null if none of the
-     * registered providers supplies a SecureRandom implementation.
+     * has registered a {@code SecureRandom} implementation, or null if none of
+     * the registered providers supplies a {@code SecureRandom} implementation.
      */
     private static String getPrngAlgorithm() {
         for (Provider p : Providers.getProviderList().providers()) {
@@ -667,6 +888,42 @@
             "No strong SecureRandom impls available: " + property);
     }
 
+    /**
+     * Reseeds this {@code SecureRandom} with entropy input read from its
+     * entropy source.
+     *
+     * @throws UnsupportedOperationException if the underlying provider
+     *         implementation has not overridden this method.
+     *
+     * @since 9
+     */
+    public synchronized void reseed() {
+        secureRandomSpi.engineReseed(null);
+    }
+
+    /**
+     * Reseeds this {@code SecureRandom} with entropy input read from its
+     * entropy source with additional parameters.
+     * <p>
+     * Note that entropy is obtained from an entropy source. While
+     * some data in {@code params} may contain entropy, its main usage is to
+     * provide diversity.
+     *
+     * @param params extra parameters
+     * @throws UnsupportedOperationException if the underlying provider
+     *         implementation has not overridden this method.
+     * @throws IllegalArgumentException if {@code params} is {@code null},
+     *         illegal or unsupported by this {@code SecureRandom}
+     *
+     * @since 9
+     */
+    public synchronized void reseed(SecureRandomParameters params) {
+        if (params == null) {
+            throw new IllegalArgumentException("params cannot be null");
+        }
+        secureRandomSpi.engineReseed(params);
+    }
+
     // Declare serialVersionUID to be compatible with JDK1.1
     static final long serialVersionUID = 4940670005562187L;
 
@@ -685,7 +942,7 @@
      * We know that the MessageDigest class does not implement
      * java.io.Serializable.  However, since this field is no longer
      * used, it will always be NULL and won't affect the serialization
-     * of the SecureRandom class itself.
+     * of the {@code SecureRandom} class itself.
      */
     private byte[] randomBytes;
     /**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/java/security/SecureRandomParameters.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2016, 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 java.security;
+
+/**
+ * A marker interface for parameters used in various {@code SecureRandom}
+ * methods.
+ * <p>
+ * Some {@code SecureRandom} implementations might require additional
+ * operational parameters. Objects of classes which implement this interface
+ * can be passed to those implementations that support them.
+ *
+ * @see DrbgParameters
+ */
+public interface SecureRandomParameters {
+}
--- a/jdk/src/java.base/share/classes/java/security/SecureRandomSpi.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/security/SecureRandomSpi.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, 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
@@ -27,13 +27,38 @@
 
 /**
  * This class defines the <i>Service Provider Interface</i> (<b>SPI</b>)
- * for the {@code SecureRandom} class.
+ * for the {@link SecureRandom} class.
+ * <p>
  * All the abstract methods in this class must be implemented by each
  * service provider who wishes to supply the implementation
  * of a cryptographically strong pseudo-random number generator.
  *
+ * @implSpec
+ * If the {@link #SecureRandomSpi(SecureRandomParameters)}
+ * constructor is overridden in an implementation, it will always be called
+ * whenever a {@code SecureRandom} is instantiated. Precisely, if an object is
+ * instantiated with one of {@code SecureRandom}'s {@code getInstance} methods
+ * <em>without</em> a {@link SecureRandomParameters} parameter,
+ * the constructor will be called with a {@code null} argument and the
+ * implementation is responsible for creating its own
+ * {@code SecureRandomParameters} parameter for use when
+ * {@link #engineGetParameters()} is called. If an object
+ * is instantiated with one of {@code SecureRandom}'s {@code getInstance}
+ * methods <em>with</em> a {@code SecureRandomParameters} argument,
+ * the constructor will be called with that argument. The
+ * {@link #engineGetParameters()} method must not return {@code null}.
+ * <p>
+ * Otherwise, if the {@code SecureRandomSpi(SecureRandomParameters)}
+ * constructor is not overridden in an implementation, the
+ * {@link #SecureRandomSpi()} constructor must be overridden and it will be
+ * called if an object is instantiated with one of {@code SecureRandom}'s
+ * {@code getInstance} methods <em>without</em> a
+ * {@code SecureRandomParameters} argument. Calling one of
+ * {@code SecureRandom}'s {@code getInstance} methods <em>with</em>
+ * a {@code SecureRandomParameters} argument will never
+ * return an instance of this implementation. The
+ * {@link #engineGetParameters()} method must return {@code null}.
  *
- * @see SecureRandom
  * @since 1.2
  */
 
@@ -42,9 +67,30 @@
     private static final long serialVersionUID = -2991854161009191830L;
 
     /**
-     * Reseeds this random object. The given seed supplements, rather than
-     * replaces, the existing seed. Thus, repeated calls are guaranteed
-     * never to reduce randomness.
+     * Constructor without a parameter.
+     */
+    public SecureRandomSpi() {
+        // ignored
+    }
+
+    /**
+     * Constructor with a parameter.
+     *
+     * @param params the {@link SecureRandomParameters} object.
+     *               This argument can be {@code null}.
+     * @throws IllegalArgumentException if {@code params} is
+     *         unrecognizable or unsupported by this {@code SecureRandom}
+     *
+     * @since 9
+     */
+    protected SecureRandomSpi(SecureRandomParameters params) {
+        // ignored
+    }
+
+    /**
+     * Reseeds this random object with the given seed. The seed supplements,
+     * rather than replaces, the existing seed. Thus, repeated calls
+     * are guaranteed never to reduce randomness.
      *
      * @param seed the seed.
      */
@@ -52,17 +98,45 @@
 
     /**
      * Generates a user-specified number of random bytes.
-     *
-     * <p> If a call to {@code engineSetSeed} had not occurred previously,
-     * the first call to this method forces this SecureRandom implementation
-     * to seed itself.  This self-seeding will not occur if
-     * {@code engineSetSeed} was previously called.
+     * <p>
+     * Some random number generators can only generate a limited amount
+     * of random bytes per invocation. If the size of {@code bytes}
+     * is greater than this limit, the implementation should invoke
+     * its generation process multiple times to completely fill the
+     * buffer before returning from this method.
      *
      * @param bytes the array to be filled in with random bytes.
      */
     protected abstract void engineNextBytes(byte[] bytes);
 
     /**
+     * Generates a user-specified number of random bytes with
+     * additional parameters.
+     * <p>
+     * Some random number generators can only generate a limited amount
+     * of random bytes per invocation. If the size of {@code bytes}
+     * is greater than this limit, the implementation should invoke
+     * its generation process multiple times to completely fill the
+     * buffer before returning from this method.
+     *
+     * @implSpec The default implementation throws
+     * an {@link UnsupportedOperationException}.
+     *
+     * @param bytes the array to be filled in with random bytes
+     * @param params additional parameters
+     * @throws UnsupportedOperationException if the implementation
+     *         has not overridden this method
+     * @throws IllegalArgumentException if {@code params} is {@code null},
+     *         illegal or unsupported by this {@code SecureRandom}
+     *
+     * @since 9
+     */
+    protected void engineNextBytes(
+            byte[] bytes, SecureRandomParameters params) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
      * Returns the given number of seed bytes.  This call may be used to
      * seed other random number generators.
      *
@@ -70,5 +144,58 @@
      *
      * @return the seed bytes.
      */
-     protected abstract byte[] engineGenerateSeed(int numBytes);
+    protected abstract byte[] engineGenerateSeed(int numBytes);
+
+    /**
+     * Reseeds this random object with entropy input read from its
+     * entropy source with additional parameters.
+     * <p>
+     * If this method is called by {@link SecureRandom#reseed()},
+     * {@code params} will be {@code null}.
+     * <p>
+     * Do not override this method if the implementation does not
+     * support reseeding.
+     *
+     * @implSpec The default implementation throws
+     *           an {@link UnsupportedOperationException}.
+     *
+     * @param params extra parameters, can be {@code null}.
+     * @throws UnsupportedOperationException if the implementation
+     *         has not overridden this method
+     * @throws IllegalArgumentException if {@code params} is
+     *         illegal or unsupported by this {@code SecureRandom}
+     *
+     * @since 9
+     */
+    protected void engineReseed(SecureRandomParameters params) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Returns the effective {@link SecureRandomParameters} for this
+     * {@code SecureRandom} instance.
+     *
+     * @implSpec The default implementation returns {@code null}.
+     *
+     * @return the effective {@link SecureRandomParameters} parameters,
+     * or {@code null} if no parameters were used.
+     *
+     * @since 9
+     */
+    protected SecureRandomParameters engineGetParameters() {
+        return null;
+    }
+
+    /**
+     * Returns a Human-readable string representation of this
+     * {@code SecureRandom}.
+     *
+     * @return the string representation
+     *
+     * @since 9
+     */
+    @Override
+    public String toString() {
+        return getClass().getSimpleName();
+    }
 }
--- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1488,7 +1488,7 @@
      *    d       1      appendValue(ChronoField.DAY_OF_MONTH)
      *    dd      2      appendValue(ChronoField.DAY_OF_MONTH, 2)
      *    D       1      appendValue(ChronoField.DAY_OF_YEAR)
-     *    DD      2      appendValue(ChronoField.DAY_OF_YEAR, 2)
+     *    DD      2      appendValue(ChronoField.DAY_OF_YEAR, 2, 3, SignStyle.NOT_NEGATIVE)
      *    DDD     3      appendValue(ChronoField.DAY_OF_YEAR, 3)
      *    F       1      appendValue(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH)
      *    g..g    1..n   appendValue(JulianFields.MODIFIED_JULIAN_DAY, n, 19, SignStyle.NORMAL)
@@ -1527,12 +1527,9 @@
      *    ss      2      appendValue(ChronoField.SECOND_OF_MINUTE, 2)
      *
      *    S..S    1..n   appendFraction(ChronoField.NANO_OF_SECOND, n, n, false)
-     *    A       1      appendValue(ChronoField.MILLI_OF_DAY)
-     *    A..A    2..n   appendValue(ChronoField.MILLI_OF_DAY, n)
-     *    n       1      appendValue(ChronoField.NANO_OF_SECOND)
-     *    n..n    2..n   appendValue(ChronoField.NANO_OF_SECOND, n)
-     *    N       1      appendValue(ChronoField.NANO_OF_DAY)
-     *    N..N    2..n   appendValue(ChronoField.NANO_OF_DAY, n)
+     *    A..A    1..n   appendValue(ChronoField.MILLI_OF_DAY, n, 19, SignStyle.NOT_NEGATIVE)
+     *    n..n    1..n   appendValue(ChronoField.NANO_OF_SECOND, n, 19, SignStyle.NOT_NEGATIVE)
+     *    N..N    1..n   appendValue(ChronoField.NANO_OF_DAY, n, 19, SignStyle.NOT_NEGATIVE)
      * </pre>
      * <p>
      * <b>Zone ID</b>: Pattern letters to output {@code ZoneId}.
@@ -1841,8 +1838,8 @@
             case 'D':
                 if (count == 1) {
                     appendValue(field);
-                } else if (count <= 3) {
-                    appendValue(field, count);
+                } else if (count == 2 || count == 3) {
+                    appendValue(field, count, 3, SignStyle.NOT_NEGATIVE);
                 } else {
                     throw new IllegalArgumentException("Too many pattern letters: " + cur);
                 }
@@ -1850,6 +1847,11 @@
             case 'g':
                 appendValue(field, count, 19, SignStyle.NORMAL);
                 break;
+            case 'A':
+            case 'n':
+            case 'N':
+                appendValue(field, count, 19, SignStyle.NOT_NEGATIVE);
+                break;
             default:
                 if (count == 1) {
                     appendValue(field);
--- a/jdk/src/java.base/share/classes/java/time/zone/ZoneRulesProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/time/zone/ZoneRulesProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -147,6 +147,7 @@
                 if (prop != null) {
                     try {
                         Class<?> c = Class.forName(prop, true, ClassLoader.getSystemClassLoader());
+                        @SuppressWarnings("deprecation")
                         ZoneRulesProvider provider = ZoneRulesProvider.class.cast(c.newInstance());
                         registerProvider(provider);
                         loaded.add(provider);
--- a/jdk/src/java.base/share/classes/java/util/Currency.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Currency.java	Wed Jul 05 21:40:37 2017 +0200
@@ -546,6 +546,33 @@
     }
 
     /**
+     * Returns the 3 digit ISO 4217 numeric code of this currency as a {@code String}.
+     * Unlike {@link getNumericCode()}, which returns the numeric code as {@code int},
+     * this method always returns the numeric code as a 3 digit string.
+     * e.g. a numeric value of 32 would be returned as "032",
+     * and a numeric value of 6 would be returned as "006".
+     *
+     * @return the 3 digit ISO 4217 numeric code of this currency as a {@code String}
+     * @since 9
+     */
+    public String getNumericCodeAsString() {
+        /* numeric code could be returned as a 3 digit string simply by using
+           String.format("%03d",numericCode); which uses regex to parse the format,
+           "%03d" in this case. Parsing a regex gives an extra performance overhead,
+           so String.format() approach is avoided in this scenario.
+        */
+        if (numericCode < 100) {
+            StringBuilder sb = new StringBuilder();
+            sb.append('0');
+            if (numericCode < 10) {
+                sb.append('0');
+            }
+            return sb.append(numericCode).toString();
+        }
+        return String.valueOf(numericCode);
+    }
+
+    /**
      * Gets the name that is suitable for displaying this currency for
      * the default {@link Locale.Category#DISPLAY DISPLAY} locale.
      * If there is no suitable display name found
@@ -788,3 +815,4 @@
         }
     }
 }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/java/util/ImmutableCollections.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,657 @@
+/*
+ * Copyright (c) 2016, 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 java.util;
+
+import java.io.IOException;
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+
+/**
+ * Container class for immutable collections. Not part of the public API.
+ * Mainly for namespace management and shared infrastructure.
+ *
+ * Serial warnings are suppressed throughout because all implementation
+ * classes use a serial proxy and thus have no need to declare serialVersionUID.
+ */
+@SuppressWarnings("serial")
+class ImmutableCollections {
+    /**
+     * A "salt" value used for randomizing iteration order. This is initialized once
+     * and stays constant for the lifetime of the JVM. It need not be truly random, but
+     * it needs to vary sufficiently from one run to the next so that iteration order
+     * will vary between JVM runs.
+     */
+    static final int SALT;
+    static {
+        SALT = new Random().nextInt();
+    }
+
+    /** No instances. */
+    private ImmutableCollections() { }
+
+    /**
+     * The reciprocal of load factor. Given a number of elements
+     * to store, multiply by this factor to get the table size.
+     */
+    static final double EXPAND_FACTOR = 2.0;
+
+    // ---------- List Implementations ----------
+
+    static final class List0<E> extends AbstractList<E> implements RandomAccess, Serializable {
+        List0() { }
+
+        @Override
+        public int size() {
+            return 0;
+        }
+
+        @Override
+        public E get(int index) {
+            Objects.checkIndex(index, 0); // always throws IndexOutOfBoundsException
+            return null;                  // but the compiler doesn't know this
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_LIST);
+        }
+    }
+
+    static final class List1<E> extends AbstractList<E> implements RandomAccess, Serializable {
+        private final E e0;
+
+        List1(E e0) {
+            this.e0 = Objects.requireNonNull(e0);
+        }
+
+        @Override
+        public int size() {
+            return 1;
+        }
+
+        @Override
+        public E get(int index) {
+            Objects.checkIndex(index, 1);
+            // assert index == 0
+            return e0;
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_LIST, e0);
+        }
+    }
+
+    static final class List2<E> extends AbstractList<E> implements RandomAccess, Serializable {
+        private final E e0;
+        private final E e1;
+
+        List2(E e0, E e1) {
+            this.e0 = Objects.requireNonNull(e0);
+            this.e1 = Objects.requireNonNull(e1);
+        }
+
+        @Override
+        public int size() {
+            return 2;
+        }
+
+        @Override
+        public E get(int index) {
+            Objects.checkIndex(index, 2);
+            if (index == 0) {
+                return e0;
+            } else { // index == 1
+                return e1;
+            }
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_LIST, e0, e1);
+        }
+    }
+
+    static final class ListN<E> extends AbstractList<E> implements RandomAccess, Serializable {
+        private final E[] elements;
+
+        @SafeVarargs
+        ListN(E... input) {
+            // copy and check manually to avoid TOCTOU
+            @SuppressWarnings("unchecked")
+            E[] tmp = (E[])new Object[input.length]; // implicit nullcheck of input
+            for (int i = 0; i < input.length; i++) {
+                tmp[i] = Objects.requireNonNull(input[i]);
+            }
+            this.elements = tmp;
+        }
+
+        @Override
+        public int size() {
+            return elements.length;
+        }
+
+        @Override
+        public E get(int index) {
+            Objects.checkIndex(index, elements.length);
+            return elements[index];
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_LIST, elements);
+        }
+    }
+
+    // ---------- Set Implementations ----------
+
+    static final class Set0<E> extends AbstractSet<E> implements Serializable {
+        Set0() { }
+
+        @Override
+        public int size() {
+            return 0;
+        }
+
+        @Override
+        public boolean contains(Object o) {
+            return super.contains(Objects.requireNonNull(o));
+        }
+
+        @Override
+        public Iterator<E> iterator() {
+            return Collections.emptyIterator();
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_SET);
+        }
+    }
+
+    static final class Set1<E> extends AbstractSet<E> implements Serializable {
+        private final E e0;
+
+        Set1(E e0) {
+            this.e0 = Objects.requireNonNull(e0);
+        }
+
+        @Override
+        public int size() {
+            return 1;
+        }
+
+        @Override
+        public boolean contains(Object o) {
+            return super.contains(Objects.requireNonNull(o));
+        }
+
+        @Override
+        public Iterator<E> iterator() {
+            return Collections.singletonIterator(e0);
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_SET, e0);
+        }
+    }
+
+    static final class Set2<E> extends AbstractSet<E> implements Serializable {
+        private final E e0;
+        private final E e1;
+
+        Set2(E e0, E e1) {
+            Objects.requireNonNull(e0);
+            Objects.requireNonNull(e1);
+
+            if (e0.equals(e1)) {
+                throw new IllegalArgumentException("duplicate element: " + e0);
+            }
+
+            if (SALT >= 0) {
+                this.e0 = e0;
+                this.e1 = e1;
+            } else {
+                this.e0 = e1;
+                this.e1 = e0;
+            }
+        }
+
+        @Override
+        public int size() {
+            return 2;
+        }
+
+        @Override
+        public boolean contains(Object o) {
+            return super.contains(Objects.requireNonNull(o));
+        }
+
+        @Override
+        public Iterator<E> iterator() {
+            return new Iterator<E>() {
+                private int idx = 0;
+
+                @Override
+                public boolean hasNext() {
+                    return idx < 2;
+                }
+
+                @Override
+                public E next() {
+                    if (idx == 0) {
+                        idx = 1;
+                        return e0;
+                    } else if (idx == 1) {
+                        idx = 2;
+                        return e1;
+                    } else {
+                        throw new NoSuchElementException();
+                    }
+                }
+            };
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_SET, e0, e1);
+        }
+    }
+
+    /**
+     * An array-based Set implementation. The element array must be strictly
+     * larger than the size (the number of contained elements) so that at
+     * least one null is always present.
+     * @param <E> the element type
+     */
+    static final class SetN<E> extends AbstractSet<E> implements Serializable {
+        private final E[] elements;
+        private final int size;
+
+        @SafeVarargs
+        @SuppressWarnings("unchecked")
+        SetN(E... input) {
+            size = input.length; // implicit nullcheck of input
+
+            elements = (E[])new Object[(int)Math.ceil(EXPAND_FACTOR * input.length)];
+            for (int i = 0; i < input.length; i++) {
+                E e = Objects.requireNonNull(input[i]);
+                int idx = probe(e);
+                if (idx >= 0) {
+                    throw new IllegalArgumentException("duplicate element: " + e);
+                } else {
+                    elements[-(idx + 1)] = e;
+                }
+            }
+        }
+
+        @Override
+        public int size() {
+            return size;
+        }
+
+        @Override
+        public boolean contains(Object o) {
+            Objects.requireNonNull(o);
+            return probe(o) >= 0;
+        }
+
+        @Override
+        public Iterator<E> iterator() {
+            return new Iterator<E>() {
+                private int idx = 0;
+
+                @Override
+                public boolean hasNext() {
+                    while (idx < elements.length) {
+                        if (elements[idx] != null)
+                            return true;
+                        idx++;
+                    }
+                    return false;
+                }
+
+                @Override
+                public E next() {
+                    if (! hasNext()) {
+                        throw new NoSuchElementException();
+                    }
+                    return elements[idx++];
+                }
+            };
+        }
+
+        // returns index at which element is present; or if absent,
+        // (-i - 1) where i is location where element should be inserted
+        private int probe(Object pe) {
+            int idx = Math.floorMod(pe.hashCode() ^ SALT, elements.length);
+            while (true) {
+                E ee = elements[idx];
+                if (ee == null) {
+                    return -idx - 1;
+                } else if (pe.equals(ee)) {
+                    return idx;
+                } else if (++idx == elements.length) {
+                    idx = 0;
+                }
+            }
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            Object[] array = new Object[size];
+            int dest = 0;
+            for (Object o : elements) {
+                if (o != null) {
+                    array[dest++] = o;
+                }
+            }
+            return new CollSer(CollSer.IMM_SET, array);
+        }
+    }
+
+    // ---------- Map Implementations ----------
+
+    static final class Map0<K,V> extends AbstractMap<K,V> implements Serializable {
+        Map0() { }
+
+        @Override
+        public Set<Map.Entry<K,V>> entrySet() {
+            return Set.of();
+        }
+
+        @Override
+        public boolean containsKey(Object o) {
+            return super.containsKey(Objects.requireNonNull(o));
+        }
+
+        @Override
+        public boolean containsValue(Object o) {
+            return super.containsValue(Objects.requireNonNull(o));
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_MAP);
+        }
+    }
+
+    static final class Map1<K,V> extends AbstractMap<K,V> implements Serializable {
+        private final K k0;
+        private final V v0;
+
+        Map1(K k0, V v0) {
+            this.k0 = Objects.requireNonNull(k0);
+            this.v0 = Objects.requireNonNull(v0);
+        }
+
+        @Override
+        public Set<Map.Entry<K,V>> entrySet() {
+            return Set.of(new KeyValueHolder<>(k0, v0));
+        }
+
+        @Override
+        public boolean containsKey(Object o) {
+            return super.containsKey(Objects.requireNonNull(o));
+        }
+
+        @Override
+        public boolean containsValue(Object o) {
+            return super.containsValue(Objects.requireNonNull(o));
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            return new CollSer(CollSer.IMM_MAP, k0, v0);
+        }
+    }
+
+    /**
+     * An array-based Map implementation. There is a single array "table" that
+     * contains keys and values interleaved: table[0] is kA, table[1] is vA,
+     * table[2] is kB, table[3] is vB, etc. The table size must be even. It must
+     * also be strictly larger than the size (the number of key-value pairs contained
+     * in the map) so that at least one null key is always present.
+     * @param <K> the key type
+     * @param <V> the value type
+     */
+    static final class MapN<K,V> extends AbstractMap<K,V> implements Serializable {
+        private final Object[] table; // pairs of key, value
+        private final int size; // number of pairs
+
+        MapN(Object... input) {
+            Objects.requireNonNull(input);
+            if ((input.length & 1) != 0) {
+                throw new InternalError("length is odd");
+            }
+            size = input.length >> 1;
+
+            int len = (int)Math.ceil(EXPAND_FACTOR * input.length);
+            len = (len + 1) & ~1; // ensure table is even length
+            table = new Object[len];
+
+            for (int i = 0; i < input.length; i += 2) {
+                @SuppressWarnings("unchecked")
+                    K k = Objects.requireNonNull((K)input[i]);
+                @SuppressWarnings("unchecked")
+                    V v = Objects.requireNonNull((V)input[i+1]);
+                int idx = probe(k);
+                if (idx >= 0) {
+                    throw new IllegalArgumentException("duplicate key: " + k);
+                } else {
+                    int dest = -(idx + 1);
+                    table[dest] = k;
+                    table[dest+1] = v;
+                }
+            }
+        }
+
+        @Override
+        public boolean containsKey(Object o) {
+            return probe(Objects.requireNonNull(o)) >= 0;
+        }
+
+        @Override
+        public boolean containsValue(Object o) {
+            return super.containsValue(Objects.requireNonNull(o));
+        }
+
+        @Override
+        @SuppressWarnings("unchecked")
+        public V get(Object o) {
+            int i = probe(o);
+            if (i >= 0) {
+                return (V)table[i+1];
+            } else {
+                return null;
+            }
+        }
+
+        @Override
+        public int size() {
+            return size;
+        }
+
+        @Override
+        public Set<Map.Entry<K,V>> entrySet() {
+            return new AbstractSet<Map.Entry<K,V>>() {
+                @Override
+                public int size() {
+                    return MapN.this.size;
+                }
+
+                @Override
+                public Iterator<Map.Entry<K,V>> iterator() {
+                    return new Iterator<Map.Entry<K,V>>() {
+                        int idx = 0;
+
+                        @Override
+                        public boolean hasNext() {
+                            while (idx < table.length) {
+                                if (table[idx] != null)
+                                    return true;
+                                idx += 2;
+                            }
+                            return false;
+                        }
+
+                        @Override
+                        public Map.Entry<K,V> next() {
+                            if (hasNext()) {
+                                @SuppressWarnings("unchecked")
+                                Map.Entry<K,V> e =
+                                    new KeyValueHolder<>((K)table[idx], (V)table[idx+1]);
+                                idx += 2;
+                                return e;
+                            } else {
+                                throw new NoSuchElementException();
+                            }
+                        }
+                    };
+                }
+            };
+        }
+
+        // returns index at which the probe key is present; or if absent,
+        // (-i - 1) where i is location where element should be inserted
+        private int probe(Object pk) {
+            int idx = Math.floorMod(pk.hashCode() ^ SALT, table.length >> 1) << 1;
+            while (true) {
+                @SuppressWarnings("unchecked")
+                K ek = (K)table[idx];
+                if (ek == null) {
+                    return -idx - 1;
+                } else if (pk.equals(ek)) {
+                    return idx;
+                } else if ((idx += 2) == table.length) {
+                    idx = 0;
+                }
+            }
+        }
+
+        private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+            throw new InvalidObjectException("not serial proxy");
+        }
+
+        private Object writeReplace() {
+            Object[] array = new Object[2 * size];
+            int len = table.length;
+            int dest = 0;
+            for (int i = 0; i < len; i += 2) {
+                if (table[i] != null) {
+                    array[dest++] = table[i];
+                    array[dest++] = table[i+1];
+                }
+            }
+            return new CollSer(CollSer.IMM_MAP, array);
+        }
+    }
+}
+
+// ---------- Serialization Proxy ----------
+
+/**
+ * Serialization proxy class for immutable collections.
+ */
+final class CollSer implements Serializable {
+    private static final long serialVersionUID = 6309168927139932177L;
+
+    static final int IMM_LIST = 1;
+    static final int IMM_SET = 2;
+    static final int IMM_MAP = 3;
+
+    private final int flags;
+    private final Object[] array;
+
+    CollSer(int f, Object... a) {
+        flags = f;
+        array = a;
+    }
+
+    private Object readResolve() throws ObjectStreamException {
+        try {
+            if (array == null) {
+                throw new InvalidObjectException("null array");
+            }
+
+            // use low order 8 bits to indicate "kind"
+            // ignore high order bits
+            switch (flags & 0xff) {
+                case IMM_LIST:
+                    return List.of(array);
+                case IMM_SET:
+                    return Set.of(array);
+                case IMM_MAP:
+                    if (array.length == 0) {
+                        return new ImmutableCollections.Map0<>();
+                    } else if (array.length == 2) {
+                        return new ImmutableCollections.Map1<>(array[0], array[1]);
+                    } else {
+                        return new ImmutableCollections.MapN<>(array);
+                    }
+                default:
+                    throw new InvalidObjectException(String.format("invalid flags 0x%x", flags));
+            }
+        } catch (NullPointerException|IllegalArgumentException ex) {
+            InvalidObjectException ioe = new InvalidObjectException("invalid object");
+            ioe.initCause(ex);
+            throw ioe;
+        }
+    }
+}
--- a/jdk/src/java.base/share/classes/java/util/List.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/List.java	Wed Jul 05 21:40:37 2017 +0200
@@ -765,7 +765,7 @@
      * @since 9
      */
     static <E> List<E> of() {
-        return Collections.emptyList();
+        return new ImmutableCollections.List0<>();
     }
 
     /**
@@ -781,7 +781,7 @@
      * @since 9
      */
     static <E> List<E> of(E e1) {
-        return Collections.singletonList(Objects.requireNonNull(e1));
+        return new ImmutableCollections.List1<>(e1);
     }
 
     /**
@@ -798,9 +798,7 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2)));
+        return new ImmutableCollections.List2<>(e1, e2);
     }
 
     /**
@@ -818,10 +816,7 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2, E e3) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2),
-                          Objects.requireNonNull(e3)));
+        return new ImmutableCollections.ListN<>(e1, e2, e3);
     }
 
     /**
@@ -840,11 +835,7 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2, E e3, E e4) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2),
-                          Objects.requireNonNull(e3),
-                          Objects.requireNonNull(e4)));
+        return new ImmutableCollections.ListN<>(e1, e2, e3, e4);
     }
 
     /**
@@ -864,12 +855,7 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2),
-                          Objects.requireNonNull(e3),
-                          Objects.requireNonNull(e4),
-                          Objects.requireNonNull(e5)));
+        return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5);
     }
 
     /**
@@ -890,13 +876,8 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2),
-                          Objects.requireNonNull(e3),
-                          Objects.requireNonNull(e4),
-                          Objects.requireNonNull(e5),
-                          Objects.requireNonNull(e6)));
+        return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5,
+                                                e6);
     }
 
     /**
@@ -918,14 +899,8 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2),
-                          Objects.requireNonNull(e3),
-                          Objects.requireNonNull(e4),
-                          Objects.requireNonNull(e5),
-                          Objects.requireNonNull(e6),
-                          Objects.requireNonNull(e7)));
+        return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5,
+                                                e6, e7);
     }
 
     /**
@@ -948,15 +923,8 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2),
-                          Objects.requireNonNull(e3),
-                          Objects.requireNonNull(e4),
-                          Objects.requireNonNull(e5),
-                          Objects.requireNonNull(e6),
-                          Objects.requireNonNull(e7),
-                          Objects.requireNonNull(e8)));
+        return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5,
+                                                e6, e7, e8);
     }
 
     /**
@@ -980,16 +948,8 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2),
-                          Objects.requireNonNull(e3),
-                          Objects.requireNonNull(e4),
-                          Objects.requireNonNull(e5),
-                          Objects.requireNonNull(e6),
-                          Objects.requireNonNull(e7),
-                          Objects.requireNonNull(e8),
-                          Objects.requireNonNull(e9)));
+        return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5,
+                                                e6, e7, e8, e9);
     }
 
     /**
@@ -1014,17 +974,8 @@
      * @since 9
      */
     static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
-        return Collections.unmodifiableList(
-            Arrays.asList(Objects.requireNonNull(e1),
-                          Objects.requireNonNull(e2),
-                          Objects.requireNonNull(e3),
-                          Objects.requireNonNull(e4),
-                          Objects.requireNonNull(e5),
-                          Objects.requireNonNull(e6),
-                          Objects.requireNonNull(e7),
-                          Objects.requireNonNull(e8),
-                          Objects.requireNonNull(e9),
-                          Objects.requireNonNull(e10)));
+        return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5,
+                                                e6, e7, e8, e9, e10);
     }
 
     /**
@@ -1055,10 +1006,16 @@
     @SafeVarargs
     @SuppressWarnings("varargs")
     static <E> List<E> of(E... elements) {
-        elements = elements.clone(); // throws NPE if es is null
-        for (E e : elements) {
-            Objects.requireNonNull(e);
+        Objects.requireNonNull(elements);
+        switch (elements.length) {
+            case 0:
+                return new ImmutableCollections.List0<>();
+            case 1:
+                return new ImmutableCollections.List1<>(elements[0]);
+            case 2:
+                return new ImmutableCollections.List2<>(elements[0], elements[1]);
+            default:
+                return new ImmutableCollections.ListN<>(elements);
         }
-        return Collections.unmodifiableList(Arrays.asList(elements));
     }
 }
--- a/jdk/src/java.base/share/classes/java/util/Locale.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Locale.java	Wed Jul 05 21:40:37 2017 +0200
@@ -858,7 +858,7 @@
 
     private static Locale initDefault() {
         String language, region, script, country, variant;
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         language = props.getProperty("user.language", "en");
         // for compatibility, check for old user.region property
         region = props.getProperty("user.region");
@@ -883,7 +883,7 @@
     }
 
     private static Locale initDefault(Locale.Category category) {
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         return getInstance(
             props.getProperty(category.languageKey,
                     defaultLocale.getLanguage()),
--- a/jdk/src/java.base/share/classes/java/util/Map.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Map.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1282,7 +1282,7 @@
      * @since 9
      */
     static <K, V> Map<K, V> of() {
-        return Collections.emptyMap();
+        return new ImmutableCollections.Map0<>();
     }
 
     /**
@@ -1299,7 +1299,7 @@
      * @since 9
      */
     static <K, V> Map<K, V> of(K k1, V v1) {
-        return Collections.singletonMap(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
+        return new ImmutableCollections.Map1<>(k1, v1);
     }
 
     /**
@@ -1319,13 +1319,7 @@
      * @since 9
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2) {
-        Map<K, V> map = new HashMap<>(3); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        if (map.size() != 2) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2);
     }
 
     /**
@@ -1347,14 +1341,7 @@
      * @since 9
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3) {
-        Map<K, V> map = new HashMap<>(5); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        map.put(Objects.requireNonNull(k3), Objects.requireNonNull(v3));
-        if (map.size() != 3) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3);
     }
 
     /**
@@ -1378,15 +1365,7 @@
      * @since 9
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
-        Map<K, V> map = new HashMap<>(6); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        map.put(Objects.requireNonNull(k3), Objects.requireNonNull(v3));
-        map.put(Objects.requireNonNull(k4), Objects.requireNonNull(v4));
-        if (map.size() != 4) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4);
     }
 
     /**
@@ -1412,16 +1391,7 @@
      * @since 9
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
-        Map<K, V> map = new HashMap<>(7); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        map.put(Objects.requireNonNull(k3), Objects.requireNonNull(v3));
-        map.put(Objects.requireNonNull(k4), Objects.requireNonNull(v4));
-        map.put(Objects.requireNonNull(k5), Objects.requireNonNull(v5));
-        if (map.size() != 5) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5);
     }
 
     /**
@@ -1450,17 +1420,8 @@
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
                                K k6, V v6) {
-        Map<K, V> map = new HashMap<>(9); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        map.put(Objects.requireNonNull(k3), Objects.requireNonNull(v3));
-        map.put(Objects.requireNonNull(k4), Objects.requireNonNull(v4));
-        map.put(Objects.requireNonNull(k5), Objects.requireNonNull(v5));
-        map.put(Objects.requireNonNull(k6), Objects.requireNonNull(v6));
-        if (map.size() != 6) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
+                                               k6, v6);
     }
 
     /**
@@ -1491,18 +1452,8 @@
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
                                K k6, V v6, K k7, V v7) {
-        Map<K, V> map = new HashMap<>(10); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        map.put(Objects.requireNonNull(k3), Objects.requireNonNull(v3));
-        map.put(Objects.requireNonNull(k4), Objects.requireNonNull(v4));
-        map.put(Objects.requireNonNull(k5), Objects.requireNonNull(v5));
-        map.put(Objects.requireNonNull(k6), Objects.requireNonNull(v6));
-        map.put(Objects.requireNonNull(k7), Objects.requireNonNull(v7));
-        if (map.size() != 7) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
+                                               k6, v6, k7, v7);
     }
 
     /**
@@ -1535,19 +1486,8 @@
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
                                K k6, V v6, K k7, V v7, K k8, V v8) {
-        Map<K, V> map = new HashMap<>(11); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        map.put(Objects.requireNonNull(k3), Objects.requireNonNull(v3));
-        map.put(Objects.requireNonNull(k4), Objects.requireNonNull(v4));
-        map.put(Objects.requireNonNull(k5), Objects.requireNonNull(v5));
-        map.put(Objects.requireNonNull(k6), Objects.requireNonNull(v6));
-        map.put(Objects.requireNonNull(k7), Objects.requireNonNull(v7));
-        map.put(Objects.requireNonNull(k8), Objects.requireNonNull(v8));
-        if (map.size() != 8) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
+                                               k6, v6, k7, v7, k8, v8);
     }
 
     /**
@@ -1582,20 +1522,8 @@
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
                                K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) {
-        Map<K, V> map = new HashMap<>(13); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        map.put(Objects.requireNonNull(k3), Objects.requireNonNull(v3));
-        map.put(Objects.requireNonNull(k4), Objects.requireNonNull(v4));
-        map.put(Objects.requireNonNull(k5), Objects.requireNonNull(v5));
-        map.put(Objects.requireNonNull(k6), Objects.requireNonNull(v6));
-        map.put(Objects.requireNonNull(k7), Objects.requireNonNull(v7));
-        map.put(Objects.requireNonNull(k8), Objects.requireNonNull(v8));
-        map.put(Objects.requireNonNull(k9), Objects.requireNonNull(v9));
-        if (map.size() != 9) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
+                                               k6, v6, k7, v7, k8, v8, k9, v9);
     }
 
     /**
@@ -1632,21 +1560,8 @@
      */
     static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
                                K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {
-        Map<K, V> map = new HashMap<>(14); // specify number of buckets to avoid resizing
-        map.put(Objects.requireNonNull(k1), Objects.requireNonNull(v1));
-        map.put(Objects.requireNonNull(k2), Objects.requireNonNull(v2));
-        map.put(Objects.requireNonNull(k3), Objects.requireNonNull(v3));
-        map.put(Objects.requireNonNull(k4), Objects.requireNonNull(v4));
-        map.put(Objects.requireNonNull(k5), Objects.requireNonNull(v5));
-        map.put(Objects.requireNonNull(k6), Objects.requireNonNull(v6));
-        map.put(Objects.requireNonNull(k7), Objects.requireNonNull(v7));
-        map.put(Objects.requireNonNull(k8), Objects.requireNonNull(v8));
-        map.put(Objects.requireNonNull(k9), Objects.requireNonNull(v9));
-        map.put(Objects.requireNonNull(k10), Objects.requireNonNull(v10));
-        if (map.size() != 10) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
+        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
+                                               k6, v6, k7, v7, k8, v8, k9, v9, k10, v10);
     }
 
     /**
@@ -1683,15 +1598,21 @@
     @SafeVarargs
     @SuppressWarnings("varargs")
     static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
-        Map<K, V> map = new HashMap<>(entries.length * 4 / 3 + 1); // throws NPE if entries is null
-        for (Entry<? extends K, ? extends V> e : entries) {
-            // next line throws NPE if e is null
-            map.put(Objects.requireNonNull(e.getKey()), Objects.requireNonNull(e.getValue()));
+        Objects.requireNonNull(entries);
+        if (entries.length == 0) {
+            return new ImmutableCollections.Map0<>();
+        } else if (entries.length == 1) {
+            return new ImmutableCollections.Map1<>(entries[0].getKey(),
+                                                   entries[0].getValue());
+        } else {
+            Object[] kva = new Object[entries.length << 1];
+            int a = 0;
+            for (Entry<? extends K, ? extends V> entry : entries) {
+                kva[a++] = entry.getKey();
+                kva[a++] = entry.getValue();
+            }
+            return new ImmutableCollections.MapN<>(kva);
         }
-        if (map.size() != entries.length) {
-            throw new IllegalArgumentException("duplicate keys");
-        }
-        return Collections.unmodifiableMap(map);
     }
 
     /**
--- a/jdk/src/java.base/share/classes/java/util/PropertyResourceBundle.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/PropertyResourceBundle.java	Wed Jul 05 21:40:37 2017 +0200
@@ -140,9 +140,8 @@
 
     // Check whether the strict encoding is specified.
     // The possible encoding is either "ISO-8859-1" or "UTF-8".
-    private static final String encoding =
-        GetPropertyAction
-                .getProperty("java.util.PropertyResourceBundle.encoding", "")
+    private static final String encoding = GetPropertyAction
+        .privilegedGetProperty("java.util.PropertyResourceBundle.encoding", "")
         .toUpperCase(Locale.ROOT);
 
     /**
--- a/jdk/src/java.base/share/classes/java/util/ServiceLoader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/ServiceLoader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -29,8 +29,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.lang.module.ModuleDescriptor;
-import java.lang.module.ModuleDescriptor.Provides;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Layer;
@@ -85,7 +83,7 @@
  * and deployed as a named module must have an appropriate <i>uses</i> clause
  * in its <i>module descriptor</i> to declare that the module uses
  * implementations of the service. A corresponding requirement is that a
- * provider deployed as a named modules must have an appropriate
+ * provider deployed as a named module must have an appropriate
  * <i>provides</i> clause in its module descriptor to declare that the module
  * provides an implementation of the service. The <i>uses</i> and
  * <i>provides</i> allow consumers of a service to be <i>linked</i> to
@@ -550,35 +548,29 @@
     /**
      * Implements lazy service provider lookup of service providers that
      * are provided by modules in a module Layer.
-     *
-     * For now, this iterator examines all modules in each Layer. This will
-     * be replaced once we decide on how the service-use graph is exposed
-     * in the module API.
      */
     private class LayerLookupIterator
         extends RestrictedIterator<S>
     {
         final String serviceName;
         Layer currentLayer;
-        Iterator<ModuleDescriptor> descriptorIterator;
-        Iterator<String> providersIterator;
-
-        Module nextModule;
-        String nextProvider;
+        Iterator<ServiceProvider> iterator;
+        ServiceProvider nextProvider;
 
         LayerLookupIterator() {
             serviceName = service.getName();
             currentLayer = layer;
 
             // need to get us started
-            descriptorIterator = descriptors(layer, serviceName);
+            iterator = providers(currentLayer, serviceName);
         }
 
-        Iterator<ModuleDescriptor> descriptors(Layer layer, String service) {
-            return layer.modules().stream()
-                    .map(Module::getDescriptor)
-                    .filter(d -> d.provides().get(service) != null)
-                    .iterator();
+        Iterator<ServiceProvider> providers(Layer layer, String service) {
+            ServicesCatalog catalog = SharedSecrets
+                    .getJavaLangReflectModuleAccess()
+                    .getServicesCatalog(layer);
+
+            return catalog.findServices(serviceName).iterator();
         }
 
         @Override
@@ -591,30 +583,18 @@
             while (true) {
 
                 // next provider
-                if (providersIterator != null && providersIterator.hasNext()) {
-                    nextProvider = providersIterator.next();
+                if (iterator != null && iterator.hasNext()) {
+                    nextProvider = iterator.next();
                     return true;
                 }
 
-                // next descriptor
-                if (descriptorIterator.hasNext()) {
-                    ModuleDescriptor descriptor = descriptorIterator.next();
-
-                    nextModule = currentLayer.findModule(descriptor.name()).get();
-
-                    Provides provides = descriptor.provides().get(serviceName);
-                    providersIterator = provides.providers().iterator();
-
-                    continue;
-                }
-
                 // next layer
                 Layer parent = currentLayer.parent().orElse(null);
                 if (parent == null)
                     return false;
 
                 currentLayer = parent;
-                descriptorIterator = descriptors(currentLayer, serviceName);
+                iterator = providers(currentLayer, serviceName);
             }
         }
 
@@ -623,13 +603,14 @@
             if (!hasNextService())
                 throw new NoSuchElementException();
 
-            assert nextModule != null && nextProvider != null;
-
-            String cn = nextProvider;
+            ServiceProvider provider = nextProvider;
             nextProvider = null;
 
+            Module module = provider.module();
+            String cn = provider.providerName();
+
             // attempt to load the provider
-            Class<?> c = loadClassInModule(nextModule, cn);
+            Class<?> c = loadClassInModule(module, cn);
             if (c == null)
                 fail(service, "Provider " + cn  + " not found");
             if (!service.isAssignableFrom(c))
@@ -830,7 +811,9 @@
             }
             S p = null;
             try {
-                p = service.cast(c.newInstance());
+                @SuppressWarnings("deprecation")
+                Object tmp = c.newInstance();
+                p = service.cast(tmp);
             } catch (Throwable x) {
                 fail(service,
                      "Provider " + cn + " could not be instantiated",
--- a/jdk/src/java.base/share/classes/java/util/Set.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/Set.java	Wed Jul 05 21:40:37 2017 +0200
@@ -444,7 +444,7 @@
      * @since 9
      */
     static <E> Set<E> of() {
-        return Collections.emptySet();
+        return new ImmutableCollections.Set0<>();
     }
 
     /**
@@ -459,7 +459,7 @@
      * @since 9
      */
     static <E> Set<E> of(E e1) {
-        return Collections.singleton(Objects.requireNonNull(e1));
+        return new ImmutableCollections.Set1<>(e1);
     }
 
     /**
@@ -476,12 +476,7 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2)));
-        if (set.size() != 2) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.Set2<>(e1, e2);
     }
 
     /**
@@ -499,13 +494,7 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2, E e3) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2),
-                                                 Objects.requireNonNull(e3)));
-        if (set.size() != 3) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.SetN<>(e1, e2, e3);
     }
 
     /**
@@ -524,14 +513,7 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2, E e3, E e4) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2),
-                                                 Objects.requireNonNull(e3),
-                                                 Objects.requireNonNull(e4)));
-        if (set.size() != 4) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.SetN<>(e1, e2, e3, e4);
     }
 
     /**
@@ -551,15 +533,7 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2),
-                                                 Objects.requireNonNull(e3),
-                                                 Objects.requireNonNull(e4),
-                                                 Objects.requireNonNull(e5)));
-        if (set.size() != 5) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5);
     }
 
     /**
@@ -580,16 +554,8 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2),
-                                                 Objects.requireNonNull(e3),
-                                                 Objects.requireNonNull(e4),
-                                                 Objects.requireNonNull(e5),
-                                                 Objects.requireNonNull(e6)));
-        if (set.size() != 6) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5,
+                                               e6);
     }
 
     /**
@@ -611,17 +577,8 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2),
-                                                 Objects.requireNonNull(e3),
-                                                 Objects.requireNonNull(e4),
-                                                 Objects.requireNonNull(e5),
-                                                 Objects.requireNonNull(e6),
-                                                 Objects.requireNonNull(e7)));
-        if (set.size() != 7) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5,
+                                               e6, e7);
     }
 
     /**
@@ -644,18 +601,8 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2),
-                                                 Objects.requireNonNull(e3),
-                                                 Objects.requireNonNull(e4),
-                                                 Objects.requireNonNull(e5),
-                                                 Objects.requireNonNull(e6),
-                                                 Objects.requireNonNull(e7),
-                                                 Objects.requireNonNull(e8)));
-        if (set.size() != 8) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5,
+                                               e6, e7, e8);
     }
 
     /**
@@ -679,19 +626,8 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2),
-                                                 Objects.requireNonNull(e3),
-                                                 Objects.requireNonNull(e4),
-                                                 Objects.requireNonNull(e5),
-                                                 Objects.requireNonNull(e6),
-                                                 Objects.requireNonNull(e7),
-                                                 Objects.requireNonNull(e8),
-                                                 Objects.requireNonNull(e9)));
-        if (set.size() != 9) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5,
+                                               e6, e7, e8, e9);
     }
 
     /**
@@ -716,20 +652,8 @@
      * @since 9
      */
     static <E> Set<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
-        Set<E> set = new HashSet<>(Arrays.asList(Objects.requireNonNull(e1),
-                                                 Objects.requireNonNull(e2),
-                                                 Objects.requireNonNull(e3),
-                                                 Objects.requireNonNull(e4),
-                                                 Objects.requireNonNull(e5),
-                                                 Objects.requireNonNull(e6),
-                                                 Objects.requireNonNull(e7),
-                                                 Objects.requireNonNull(e8),
-                                                 Objects.requireNonNull(e9),
-                                                 Objects.requireNonNull(e10)));
-        if (set.size() != 10) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
+        return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5,
+                                               e6, e7, e8, e9, e10);
     }
 
     /**
@@ -759,15 +683,18 @@
      * @since 9
      */
     @SafeVarargs
+    @SuppressWarnings("varargs")
     static <E> Set<E> of(E... elements) {
-        for (E e : elements) { // throws NPE if es is null
-            Objects.requireNonNull(e);
+        Objects.requireNonNull(elements);
+        switch (elements.length) {
+            case 0:
+                return new ImmutableCollections.Set0<>();
+            case 1:
+                return new ImmutableCollections.Set1<>(elements[0]);
+            case 2:
+                return new ImmutableCollections.Set2<>(elements[0], elements[1]);
+            default:
+                return new ImmutableCollections.SetN<>(elements);
         }
-        @SuppressWarnings("varargs")
-        Set<E> set = new HashSet<>(Arrays.asList(elements));
-        if (set.size() != elements.length) {
-            throw new IllegalArgumentException("duplicate elements");
-        }
-        return Collections.unmodifiableSet(set);
     }
 }
--- a/jdk/src/java.base/share/classes/java/util/TimeZone.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/TimeZone.java	Wed Jul 05 21:40:37 2017 +0200
@@ -42,6 +42,7 @@
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.time.ZoneId;
+import java.util.Properties;
 import sun.security.action.GetPropertyAction;
 import sun.util.calendar.ZoneInfo;
 import sun.util.calendar.ZoneInfoFile;
@@ -660,12 +661,13 @@
     private static synchronized TimeZone setDefaultZone() {
         TimeZone tz;
         // get the time zone ID from the system properties
-        String zoneID = GetPropertyAction.getProperty("user.timezone");
+        Properties props = GetPropertyAction.privilegedGetProperties();
+        String zoneID = props.getProperty("user.timezone");
 
         // if the time zone ID is not set (yet), perform the
         // platform to Java time zone ID mapping.
         if (zoneID == null || zoneID.isEmpty()) {
-            String javaHome = GetPropertyAction.getProperty("java.home");
+            String javaHome = props.getProperty("java.home");
             try {
                 zoneID = getSystemTimeZoneID(javaHome);
                 if (zoneID == null) {
@@ -693,13 +695,7 @@
         assert tz != null;
 
         final String id = zoneID;
-        AccessController.doPrivileged(new PrivilegedAction<>() {
-            @Override
-                public Void run() {
-                    System.setProperty("user.timezone", id);
-                    return null;
-                }
-            });
+        props.setProperty("user.timezone", id);
 
         defaultTimeZone = tz;
         return tz;
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java	Wed Jul 05 21:40:37 2017 +0200
@@ -3507,6 +3507,7 @@
      * Creates and returns the common pool, respecting user settings
      * specified via system properties.
      */
+    @SuppressWarnings("deprecation") // Class.newInstance
     static ForkJoinPool makeCommonPool() {
         int parallelism = -1;
         ForkJoinWorkerThreadFactory factory = null;
--- a/jdk/src/java.base/share/classes/java/util/jar/JarFile.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java	Wed Jul 05 21:40:37 2017 +0200
@@ -155,7 +155,7 @@
         BASE_VERSION = 8;  // one less than lowest version for versioned entries
         int runtimeVersion = jdk.Version.current().major();
         String jarVersion =
-                GetPropertyAction.getProperty("jdk.util.jar.version");
+                GetPropertyAction.privilegedGetProperty("jdk.util.jar.version");
         if (jarVersion != null) {
             int jarVer = Integer.parseInt(jarVersion);
             runtimeVersion = (jarVer > runtimeVersion)
@@ -163,7 +163,7 @@
         }
         RUNTIME_VERSION = runtimeVersion;
         String enableMultiRelease = GetPropertyAction
-                .getProperty("jdk.util.jar.enableMultiRelease", "true");
+                .privilegedGetProperty("jdk.util.jar.enableMultiRelease", "true");
         switch (enableMultiRelease) {
             case "true":
             default:
@@ -658,6 +658,28 @@
         return vze == null ? ze : vze;
     }
 
+    /**
+     * Returns the real name of a {@code JarEntry}.  If this {@code JarFile} is
+     * a multi-release jar file and is configured to be processed as such, the
+     * name returned by this method is the path name of the versioned entry
+     * that the {@code JarEntry} represents, rather than the path name of the
+     * base entry that {@link JarEntry#getName()} returns.  If the
+     * {@code JarEntry} does not represent a versioned entry, or the
+     * jar file is not a multi-release jar file or {@code JarFile} is not
+     * configured for processing a multi-release jar file, this method returns
+     * the same name that {@link JarEntry#getName()} returns.
+     *
+     * @param entry the JarEntry
+     * @return the real name of the JarEntry
+     * @since 9
+     */
+    String getRealName(JarEntry entry) {
+        if (entry instanceof JarFileEntry) {
+            return ((JarFileEntry)entry).realName();
+        }
+        return entry.getName();
+    }
+
     private class JarFileEntry extends JarEntry {
         final private String name;
 
@@ -684,7 +706,7 @@
                 throw new RuntimeException(e);
             }
             if (certs == null && jv != null) {
-                certs = jv.getCerts(JarFile.this, reifiedEntry());
+                certs = jv.getCerts(JarFile.this, realEntry());
             }
             return certs == null ? null : certs.clone();
         }
@@ -695,17 +717,20 @@
                 throw new RuntimeException(e);
             }
             if (signers == null && jv != null) {
-                signers = jv.getCodeSigners(JarFile.this, reifiedEntry());
+                signers = jv.getCodeSigners(JarFile.this, realEntry());
             }
             return signers == null ? null : signers.clone();
         }
-        JarFileEntry reifiedEntry() {
+        JarFileEntry realEntry() {
             if (isMultiRelease()) {
                 String entryName = super.getName();
                 return entryName.equals(this.name) ? this : new JarFileEntry(entryName, this);
             }
             return this;
         }
+        String realName() {
+            return super.getName();
+        }
 
         @Override
         public String getName() {
@@ -876,11 +901,11 @@
     private JarEntry verifiableEntry(ZipEntry ze) {
         if (ze instanceof JarFileEntry) {
             // assure the name and entry match for verification
-            return ((JarFileEntry)ze).reifiedEntry();
+            return ((JarFileEntry)ze).realEntry();
         }
         ze = getJarEntry(ze.getName());
         if (ze instanceof JarFileEntry) {
-            return ((JarFileEntry)ze).reifiedEntry();
+            return ((JarFileEntry)ze).realEntry();
         }
         return (JarEntry)ze;
     }
--- a/jdk/src/java.base/share/classes/java/util/jar/JavaUtilJarAccessImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/jar/JavaUtilJarAccessImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -60,4 +60,8 @@
     public List<Object> getManifestDigests(JarFile jar) {
         return jar.getManifestDigests();
     }
+
+    public String getRealName(JarFile jar, JarEntry entry) {
+        return jar.getRealName(entry);
+    }
 }
--- a/jdk/src/java.base/share/classes/java/util/jar/Pack200.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/jar/Pack200.java	Wed Jul 05 21:40:37 2017 +0200
@@ -695,7 +695,7 @@
             Class<?> impl = (PACK_PROVIDER.equals(prop))? packerImpl: unpackerImpl;
             if (impl == null) {
                 // The first time, we must decide which class to use.
-                implName = GetPropertyAction.getProperty(prop,"");
+                implName = GetPropertyAction.privilegedGetProperty(prop,"");
                 if (implName != null && !implName.equals(""))
                     impl = Class.forName(implName);
                 else if (PACK_PROVIDER.equals(prop))
@@ -704,7 +704,9 @@
                     impl = com.sun.java.util.jar.pack.UnpackerImpl.class;
             }
             // We have a class.  Now instantiate it.
-            return impl.newInstance();
+            @SuppressWarnings("deprecation")
+            Object result = impl.newInstance();
+            return result;
         } catch (ClassNotFoundException e) {
             throw new Error("Class not found: " + implName +
                                 ":\ncheck property " + prop +
--- a/jdk/src/java.base/share/classes/java/util/regex/PatternSyntaxException.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/regex/PatternSyntaxException.java	Wed Jul 05 21:40:37 2017 +0200
@@ -94,7 +94,7 @@
     }
 
     private static final String nl =
-            GetPropertyAction.getProperty("line.separator");
+            GetPropertyAction.privilegedGetProperty("line.separator");
 
     /**
      * Returns a multi-line string containing the description of the syntax
--- a/jdk/src/java.base/share/classes/java/util/zip/ZipOutputStream.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/java/util/zip/ZipOutputStream.java	Wed Jul 05 21:40:37 2017 +0200
@@ -55,7 +55,7 @@
      */
     private static final boolean inhibitZip64 =
         Boolean.parseBoolean(
-            GetPropertyAction.getProperty("jdk.util.zip.inhibitZip64"));
+            GetPropertyAction.privilegedGetProperty("jdk.util.zip.inhibitZip64"));
 
     private static class XEntry {
         final ZipEntry entry;
--- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocketFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocketFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -97,6 +97,7 @@
                         }
                     }
                     log("class " + clsName + " is loaded");
+                    @SuppressWarnings("deprecation")
                     SSLServerSocketFactory fac = (SSLServerSocketFactory)cls.newInstance();
                     log("instantiated an instance of class " + clsName);
                     theFactory = fac;
--- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocketFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocketFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -51,7 +51,7 @@
     static final boolean DEBUG;
 
     static {
-        String s = GetPropertyAction.getProperty("javax.net.debug", "")
+        String s = GetPropertyAction.privilegedGetProperty("javax.net.debug", "")
                 .toLowerCase(Locale.ENGLISH);
 
         DEBUG = s.contains("all") || s.contains("ssl");
@@ -106,6 +106,7 @@
                         }
                     }
                     log("class " + clsName + " is loaded");
+                    @SuppressWarnings("deprecation")
                     SSLSocketFactory fac = (SSLSocketFactory)cls.newInstance();
                     log("instantiated an instance of class " + clsName);
                     theFactory = fac;
--- a/jdk/src/java.base/share/classes/javax/security/auth/login/Configuration.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/javax/security/auth/login/Configuration.java	Wed Jul 05 21:40:37 2017 +0200
@@ -250,7 +250,9 @@
                                             finalClass, false,
                                             Thread.currentThread().getContextClassLoader()
                                     ).asSubclass(Configuration.class);
-                                    return implClass.newInstance();
+                                    @SuppressWarnings("deprecation")
+                                    Configuration result = implClass.newInstance();
+                                    return result;
                                 }
                             });
                     AccessController.doPrivileged(
--- a/jdk/src/java.base/share/classes/javax/security/auth/login/LoginContext.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/javax/security/auth/login/LoginContext.java	Wed Jul 05 21:40:37 2017 +0200
@@ -304,7 +304,9 @@
                     Class<? extends CallbackHandler> c = Class.forName(
                             defaultHandler, true,
                             finalLoader).asSubclass(CallbackHandler.class);
-                    return c.newInstance();
+                    @SuppressWarnings("deprecation")
+                    CallbackHandler result = c.newInstance();
+                    return result;
                 }
             });
         } catch (java.security.PrivilegedActionException pae) {
@@ -697,8 +699,9 @@
 
                     if (moduleStack[i].module == null) {
                         try {
-                            moduleStack[i].module = (LoginModule) Class.forName(
-                                    name, false, contextClassLoader).newInstance();
+                            @SuppressWarnings("deprecation")
+                            Object tmp = Class.forName(name, false, contextClassLoader).newInstance();
+                            moduleStack[i].module = (LoginModule) tmp;
                             if (debug != null) {
                                 debug.println(name + " loaded via reflection");
                             }
--- a/jdk/src/java.base/share/classes/jdk/Version.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/Version.java	Wed Jul 05 21:40:37 2017 +0200
@@ -273,7 +273,8 @@
      */
     public static Version current() {
         if (current == null) {
-            current = parse(GetPropertyAction.getProperty("java.version"));
+            current = parse(
+                    GetPropertyAction.privilegedGetProperty("java.version"));
         }
         return current;
     }
--- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystemProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystemProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -124,7 +124,9 @@
         ClassLoader cl = newJrtFsLoader(jrtfs);
         try {
             Class<?> c = Class.forName(JrtFileSystemProvider.class.getName(), false, cl);
-            return ((FileSystemProvider)c.newInstance()).newFileSystem(uri, newEnv);
+            @SuppressWarnings("deprecation")
+            Object tmp = c.newInstance();
+            return ((FileSystemProvider)tmp).newFileSystem(uri, newEnv);
         } catch (ClassNotFoundException |
                  IllegalAccessException |
                  InstantiationException e) {
--- a/jdk/src/java.base/share/classes/jdk/internal/loader/BootLoader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BootLoader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -68,7 +68,7 @@
     }
 
     // ServiceCatalog for the boot class loader
-    private static final ServicesCatalog SERVICES_CATALOG = new ServicesCatalog();
+    private static final ServicesCatalog SERVICES_CATALOG = ServicesCatalog.create();
 
     // ClassLoaderValue map for boot class loader
     private static final ConcurrentHashMap<?, ?> CLASS_LOADER_VALUE_MAP =
--- a/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -104,7 +104,7 @@
      * A module defined/loaded by a built-in class loader.
      *
      * A LoadedModule encapsulates a ModuleReference along with its CodeSource
-     * URL to avoid needing to create this URL when define classes.
+     * URL to avoid needing to create this URL when defining classes.
      */
     private static class LoadedModule {
         private final BuiltinClassLoader loader;
--- a/jdk/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java	Wed Jul 05 21:40:37 2017 +0200
@@ -85,7 +85,7 @@
     private static final boolean DISABLE_JAR_CHECKING;
 
     static {
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         JAVA_VERSION = props.getProperty("java.version");
         DEBUG = (props.getProperty("sun.misc.URLClassPath.debug") != null);
         String p = props.getProperty("sun.misc.URLClassPath.disableJarChecking");
@@ -372,9 +372,15 @@
             return java.security.AccessController.doPrivileged(
                 new java.security.PrivilegedExceptionAction<>() {
                 public Loader run() throws IOException {
+                    String protocol = url.getProtocol();  // lower cased in URL
                     String file = url.getFile();
-                    if (file != null && file.endsWith("/")) {
-                        if ("file".equals(url.getProtocol())) {
+                    if ("jar".equals(protocol)
+                            && file != null && (file.indexOf("!/") == file.length() - 2)) {
+                        // extract the nested URL
+                        URL nestedUrl = new URL(file.substring(0, file.length() - 2));
+                        return new JarLoader(nestedUrl, jarHandler, lmap);
+                    } else if (file != null && file.endsWith("/")) {
+                        if ("file".equals(protocol)) {
                             return new FileLoader(url);
                         } else {
                             return new Loader(url);
@@ -718,13 +724,13 @@
 
             final URL url;
             try {
+                String nm;
                 if (jar.isMultiRelease()) {
-                    // add #runtime fragment to tell JarURLConnection to use
-                    // runtime versioning if the underlying jar file is multi-release
-                    url = new URL(getBaseURL(), ParseUtil.encodePath(name, false) + "#runtime");
+                    nm = SharedSecrets.javaUtilJarAccess().getRealName(jar, entry);
                 } else {
-                    url = new URL(getBaseURL(), ParseUtil.encodePath(name, false));
+                    nm = name;
                 }
+                url = new URL(getBaseURL(), ParseUtil.encodePath(nm, false));
                 if (check) {
                     URLClassPath.check(url);
                 }
@@ -940,7 +946,8 @@
 
             ensureOpen();
 
-            if (SharedSecrets.javaUtilJarAccess().jarFileHasClassPathAttribute(jar)) { // Only get manifest when necessary
+            // Only get manifest when necessary
+            if (SharedSecrets.javaUtilJarAccess().jarFileHasClassPathAttribute(jar)) {
                 Manifest man = jar.getManifest();
                 if (man != null) {
                     Attributes attr = man.getMainAttributes();
--- a/jdk/src/java.base/share/classes/jdk/internal/logger/LoggerFinderLoader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/logger/LoggerFinderLoader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -81,7 +81,7 @@
     // Get configuration error policy
     private static ErrorPolicy configurationErrorPolicy() {
         String errorPolicy =
-                GetPropertyAction.getProperty("jdk.logger.finder.error");
+                GetPropertyAction.privilegedGetProperty("jdk.logger.finder.error");
         if (errorPolicy == null || errorPolicy.isEmpty()) {
             return ErrorPolicy.WARNING;
         }
@@ -96,7 +96,7 @@
     // This is further submitted to the configuration error policy.
     private static boolean ensureSingletonProvider() {
         return Boolean.parseBoolean(
-                GetPropertyAction.getProperty("jdk.logger.finder.singleton"));
+                GetPropertyAction.privilegedGetProperty("jdk.logger.finder.singleton"));
     }
 
     private static Iterator<System.LoggerFinder> findLoggerFinderProviders() {
--- a/jdk/src/java.base/share/classes/jdk/internal/logger/SimpleConsoleLogger.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/logger/SimpleConsoleLogger.java	Wed Jul 05 21:40:37 2017 +0200
@@ -56,7 +56,7 @@
 
     static Level getDefaultLevel() {
         String levelName = GetPropertyAction
-                .getProperty("jdk.system.logger.level", "INFO");
+                .privilegedGetProperty("jdk.system.logger.level", "INFO");
         try {
             return Level.valueOf(levelName);
         } catch (IllegalArgumentException iae) {
@@ -426,7 +426,7 @@
         static private final String[] skips;
         static {
             String additionalPkgs =
-                    GetPropertyAction.getProperty("jdk.logger.packages");
+                    GetPropertyAction.privilegedGetProperty("jdk.logger.packages");
             skips = additionalPkgs == null ? new String[0] : additionalPkgs.split(",");
         }
 
@@ -485,7 +485,7 @@
             //    jdk/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java
             // to fail - because that test has a testcase which somehow references
             // PlatformLogger and counts the number of generated lambda classes.
-            String format = GetPropertyAction.getProperty(key);
+            String format = GetPropertyAction.privilegedGetProperty(key);
 
             if (format == null && defaultPropertyGetter != null) {
                 format = defaultPropertyGetter.apply(key);
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java	Wed Jul 05 21:40:37 2017 +0200
@@ -35,4 +35,9 @@
      * Returns the name for the given MemberName
      */
     String getName(Object mname);
+
+    /**
+     * Returns {@code true} if the given MemberName is a native method
+     */
+    boolean isNative(Object mname);
 }
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -25,13 +25,24 @@
 
 package jdk.internal.misc;
 
+import java.io.PrintStream;
+import java.lang.module.Configuration;
+import jdk.internal.module.ModuleHashes;
+
 import java.lang.module.ModuleDescriptor;
 import java.lang.module.ModuleDescriptor.Exports;
 import java.lang.module.ModuleDescriptor.Requires;
 import java.lang.module.ModuleDescriptor.Provides;
 import java.lang.module.ModuleDescriptor.Version;
+import java.lang.module.ModuleFinder;
+import java.util.Collection;
+import java.lang.module.ModuleReader;
+import java.lang.module.ModuleReference;
+import java.net.URI;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.function.Supplier;
 
 /**
  * Provides access to non-public methods in java.lang.module.
@@ -89,5 +100,29 @@
                                          String osArch,
                                          String osVersion,
                                          Set<String> conceals,
-                                         Set<String> packages);
+                                         Set<String> packages,
+                                         ModuleHashes hashes);
+
+    /**
+     * Resolves a collection of root modules, with service binding
+     * and the empty configuration as the parent. The post resolution
+     * checks are optionally run.
+     */
+    Configuration resolveRequiresAndUses(ModuleFinder finder,
+                                         Collection<String> roots,
+                                         boolean check,
+                                         PrintStream traceOutput);
+
+    /**
+     * Creates a ModuleReference to a "patched" module.
+     */
+    ModuleReference newPatchedModule(ModuleDescriptor descriptor,
+                                     URI location,
+                                     Supplier<ModuleReader> readerSupplier);
+
+    /**
+     * Returns the object with the hashes of other modules
+     */
+    Optional<ModuleHashes> hashes(ModuleDescriptor descriptor);
+
 }
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangReflectModuleAccess.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangReflectModuleAccess.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -26,9 +26,12 @@
 package jdk.internal.misc;
 
 import java.lang.module.ModuleDescriptor;
+import java.lang.reflect.Layer;
 import java.lang.reflect.Module;
 import java.net.URI;
 
+import jdk.internal.module.ServicesCatalog;
+
 /**
  * Provides access to non-public methods in java.lang.reflect.Module
  */
@@ -57,6 +60,11 @@
     void addReads(Module m1, Module m2);
 
     /**
+     * Updates module m to read all unnamed modules.
+     */
+    void addReadsAllUnnamed(Module m);
+
+    /**
      * Updates module m1 to export a package to module m2. The export does
      * not result in a strong reference to m2 (m2 can be GC'ed).
      */
@@ -76,4 +84,10 @@
      * Add a package to the given module.
      */
     void addPackage(Module m, String pkg);
-}
+
+    /**
+     * Returns the ServicesCatalog for the given Layer.
+     */
+    ServicesCatalog getServicesCatalog(Layer layer);
+
+}
\ No newline at end of file
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaUtilJarAccess.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaUtilJarAccess.java	Wed Jul 05 21:40:37 2017 +0200
@@ -41,4 +41,5 @@
     public Enumeration<JarEntry> entries2(JarFile jar);
     public void setEagerValidation(JarFile jar, boolean eager);
     public List<Object> getManifestDigests(JarFile jar);
+    public String getRealName(JarFile jar, JarEntry entry);
 }
--- a/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -74,6 +74,8 @@
     String osName;
     String osArch;
     String osVersion;
+    String algorithm;
+    Map<String, String> hashes;
 
     Builder(String name, int reqs, int exports,
             int provides, int conceals, int packages) {
@@ -252,6 +254,25 @@
     }
 
     /**
+     * Sets the algorithm of the module hashes
+     */
+    public Builder algorithm(String algorithm) {
+        this.algorithm = algorithm;
+        return this;
+    }
+
+    /**
+     * Sets the module hash for the given module name
+     */
+    public Builder moduleHash(String mn, String hash) {
+        if (hashes == null)
+            hashes = new HashMap<>();
+
+        hashes.put(mn, hash);
+        return this;
+    }
+
+    /**
      * Returns the set of packages that is the union of the exported and
      * concealed packages.
      */
@@ -273,6 +294,9 @@
     public ModuleDescriptor build() {
         assert name != null;
 
+        ModuleHashes moduleHashes =
+            hashes != null ? new ModuleHashes(algorithm, hashes) : null;
+
         return jlma.newModuleDescriptor(name,
                                         false,    // automatic
                                         false,    // assume not synthetic for now
@@ -286,6 +310,7 @@
                                         osArch,
                                         osVersion,
                                         conceals,
-                                        computePackages(exports, conceals));
+                                        computePackages(exports, conceals),
+                                        moduleHashes);
     }
 }
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java	Wed Jul 05 21:40:37 2017 +0200
@@ -34,6 +34,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 
@@ -42,7 +43,6 @@
 import jdk.internal.org.objectweb.asm.ClassReader;
 import jdk.internal.org.objectweb.asm.ClassWriter;
 import jdk.internal.org.objectweb.asm.Label;
-import jdk.internal.module.Hasher.DependencyHashes;
 import static jdk.internal.module.ClassFileConstants.*;
 
 
@@ -148,7 +148,7 @@
                 for (int i=0; i<provides_count; i++) {
                     String sn = cr.readClass(off, buf).replace('/', '.');
                     String cn = cr.readClass(off + 2, buf).replace('/', '.');
-                    provides.computeIfAbsent(sn, k -> new HashSet<>()).add(cn);
+                    provides.computeIfAbsent(sn, k -> new LinkedHashSet<>()).add(cn);
                     off += 4;
                 }
                 provides.entrySet().forEach(e -> builder.provides(e.getKey(),
@@ -281,10 +281,10 @@
      *   u4 attribute_length;
      *
      *   // the number of entries in the packages table
-     *   u2 package_count;
+     *   u2 packages_count;
      *   { // index to CONSTANT_CONSTANT_utf8_info structure with the package name
      *     u2 package_index
-     *   } package[package_count];
+     *   } packages[package_count];
      *
      * }</pre>
      */
@@ -579,9 +579,9 @@
      * alternative is to store it as an array of u1.
      */
     static class HashesAttribute extends Attribute {
-        private final DependencyHashes hashes;
+        private final ModuleHashes hashes;
 
-        HashesAttribute(DependencyHashes hashes) {
+        HashesAttribute(ModuleHashes hashes) {
             super(HASHES);
             this.hashes = hashes;
         }
@@ -613,7 +613,7 @@
                 map.put(dn, hash);
             }
 
-            DependencyHashes hashes = new DependencyHashes(algorithm, map);
+            ModuleHashes hashes = new ModuleHashes(algorithm, map);
 
             return new HashesAttribute(hashes);
         }
--- a/jdk/src/java.base/share/classes/jdk/internal/module/Hasher.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-/*
- * 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.  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 jdk.internal.module;
-
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.file.Path;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Supporting class for computing, encoding and decoding hashes (message
- * digests).
- */
-
-public class Hasher {
-    private Hasher() { }
-
-    /**
-     * A supplier of an encoded message digest.
-     */
-    public static interface HashSupplier {
-        String generate(String algorithm);
-    }
-
-    /**
-     * Encapsulates the result of hashing the contents of a number of module
-     * artifacts.
-     */
-    public static class DependencyHashes {
-        private final String algorithm;
-        private final Map<String, String> nameToHash;
-
-        public DependencyHashes(String algorithm, Map<String, String> nameToHash) {
-            this.algorithm = algorithm;
-            this.nameToHash = nameToHash;
-        }
-
-        /**
-         * Returns the algorithm used to hash the dependences ("SHA-256" or
-         * "MD5" for example).
-         */
-        public String algorithm() {
-            return algorithm;
-        }
-
-        /**
-         * Returns the set of module names for which hashes are recorded.
-         */
-        public Set<String> names() {
-            return nameToHash.keySet();
-        }
-
-        /**
-         * Retruns the hash string for the given module name, {@code null}
-         * if there is no hash recorded for the module.
-         */
-        public String hashFor(String dn) {
-            return nameToHash.get(dn);
-        }
-    }
-
-
-    /**
-     * Computes the hash for the given file with the given message digest
-     * algorithm. Returns the results a base64-encoded String.
-     *
-     * @throws UncheckedIOException if an I/O error occurs
-     * @throws RuntimeException if the algorithm is not available
-     */
-    public static String generate(Path file, String algorithm) {
-        try {
-            MessageDigest md = MessageDigest.getInstance(algorithm);
-
-            // Ideally we would just mmap the file but this consumes too much
-            // memory when jlink is running concurrently on very large jmods
-            try (FileChannel fc = FileChannel.open(file)) {
-                ByteBuffer bb = ByteBuffer.allocate(32*1024);
-                int nread;
-                while ((nread = fc.read(bb)) > 0) {
-                    bb.flip();
-                    md.update(bb);
-                    assert bb.remaining() == 0;
-                    bb.clear();
-                }
-            }
-
-            byte[] bytes = md.digest();
-            return Base64.getEncoder().encodeToString(bytes);
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException(e);
-        } catch (IOException ioe) {
-            throw new UncheckedIOException(ioe);
-        }
-    }
-
-    /**
-     * Computes the hash for every entry in the given map, returning a
-     * {@code DependencyHashes} to encapsulate the result. The map key is
-     * the entry name, typically the module name. The map value is the file
-     * path to the entry (module artifact).
-     *
-     * @return DependencyHashes encapsulate the hashes
-     */
-    public static DependencyHashes generate(Map<String, Path> map, String algorithm) {
-        Map<String, String> nameToHash = new HashMap<>();
-        for (Map.Entry<String, Path> entry: map.entrySet()) {
-            String name = entry.getKey();
-            Path path = entry.getValue();
-            nameToHash.put(name, generate(path, algorithm));
-        }
-        return new DependencyHashes(algorithm, nameToHash);
-    }
-}
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,12 +26,15 @@
 package jdk.internal.module;
 
 import java.io.File;
+import java.io.PrintStream;
 import java.lang.module.Configuration;
+import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleFinder;
 import java.lang.module.ModuleReference;
-import java.lang.module.ModuleFinder;
 import java.lang.module.ResolvedModule;
 import java.lang.reflect.Layer;
 import java.lang.reflect.Module;
+import java.net.URI;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Collections;
@@ -41,10 +44,10 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Function;
-import java.util.stream.Collectors;
 
 import jdk.internal.loader.BootLoader;
 import jdk.internal.loader.BuiltinClassLoader;
+import jdk.internal.misc.SharedSecrets;
 import jdk.internal.perf.PerfCounter;
 
 /**
@@ -54,10 +57,9 @@
  * the module system. In summary, the boot method creates a Configuration by
  * resolving a set of module names specified via the launcher (or equivalent)
  * -m and -addmods options. The modules are located on a module path that is
- * constructed from the upgrade, system and application module paths. The
- * Configuration is reified by creating the boot Layer with each module in the
- * the configuration defined to one of the built-in class loaders. The mapping
- * of modules to class loaders is statically mapped in a helper class.
+ * constructed from the upgrade module path, system modules, and application
+ * module path. The Configuration is instantiated as the boot Layer with each
+ * module in the the configuration defined to one of the built-in class loaders.
  */
 
 public final class ModuleBootstrap {
@@ -65,6 +67,11 @@
 
     private static final String JAVA_BASE = "java.base";
 
+    private static final String JAVA_SE = "java.se";
+
+    // the token for "all default modules"
+    private static final String ALL_DEFAULT = "ALL-DEFAULT";
+
     // the token for "all unnamed modules"
     private static final String ALL_UNNAMED = "ALL-UNNAMED";
 
@@ -94,47 +101,65 @@
 
         long t0 = System.nanoTime();
 
-        // system module path
-        ModuleFinder systemModulePath = ModuleFinder.ofSystem();
+        // system modules
+        ModuleFinder systemModules = ModuleFinder.ofSystem();
+
+        PerfCounters.systemModulesTime.addElapsedTimeFrom(t0);
 
-        // Once we have the system module path then we define the base module.
-        // We do this here so that java.base is defined to the VM as early as
+
+        long t1 = System.nanoTime();
+
+        // Once we have the system modules then we define the base module to
+        // the VM. We do this here so that java.base is defined as early as
         // possible and also that resources in the base module can be located
         // for error messages that may happen from here on.
-        Optional<ModuleReference> obase = systemModulePath.find(JAVA_BASE);
-        if (!obase.isPresent())
+        ModuleReference base = systemModules.find(JAVA_BASE).orElse(null);
+        if (base == null)
             throw new InternalError(JAVA_BASE + " not found");
-        ModuleReference base = obase.get();
+        URI baseUri = base.location().orElse(null);
+        if (baseUri == null)
+            throw new InternalError(JAVA_BASE + " does not have a location");
         BootLoader.loadModule(base);
-        Modules.defineModule(null, base.descriptor(), base.location().orElse(null));
+        Modules.defineModule(null, base.descriptor(), baseUri);
 
+        PerfCounters.defineBaseTime.addElapsedTimeFrom(t1);
+
+
+        long t2 = System.nanoTime();
 
         // -upgrademodulepath option specified to launcher
         ModuleFinder upgradeModulePath
             = createModulePathFinder("jdk.upgrade.module.path");
+        if (upgradeModulePath != null)
+            systemModules = ModuleFinder.compose(upgradeModulePath, systemModules);
 
         // -modulepath option specified to the launcher
         ModuleFinder appModulePath = createModulePathFinder("jdk.module.path");
 
-        // The module finder: [-upgrademodulepath] system-module-path [-modulepath]
-        ModuleFinder finder = systemModulePath;
-        if (upgradeModulePath != null)
-            finder = ModuleFinder.compose(upgradeModulePath, finder);
+        // The module finder: [-upgrademodulepath] system [-modulepath]
+        ModuleFinder finder = systemModules;
         if (appModulePath != null)
             finder = ModuleFinder.compose(finder, appModulePath);
 
-        // launcher -m option to specify the initial module
+        // The root modules to resolve
+        Set<String> roots = new HashSet<>();
+
+        // launcher -m option to specify the main/initial module
         String mainModule = System.getProperty("jdk.module.main");
+        if (mainModule != null)
+            roots.add(mainModule);
 
         // additional module(s) specified by -addmods
+        boolean addAllDefaultModules = false;
         boolean addAllSystemModules = false;
         boolean addAllApplicationModules = false;
-        Set<String> addModules = null;
         String propValue = System.getProperty("jdk.launcher.addmods");
         if (propValue != null) {
-            addModules = new HashSet<>();
             for (String mod: propValue.split(",")) {
                 switch (mod) {
+                    case ALL_DEFAULT:
+                        addAllDefaultModules = true;
+                        break;
                     case ALL_SYSTEM:
                         addAllSystemModules = true;
                         break;
@@ -142,28 +167,12 @@
                         addAllApplicationModules = true;
                         break;
                     default :
-                        addModules.add(mod);
+                        roots.add(mod);
                 }
             }
         }
 
-        // The root modules to resolve
-        Set<String> roots = new HashSet<>();
-
-        // main/initial module
-        if (mainModule != null) {
-            roots.add(mainModule);
-            if (addAllApplicationModules)
-                fail(ALL_MODULE_PATH + " not allowed with initial module");
-        }
-
-        // If -addmods is specified then those modules need to be resolved
-        if (addModules != null)
-            roots.addAll(addModules);
-
-
         // -limitmods
-        boolean limitmods = false;
         propValue = System.getProperty("jdk.launcher.limitmods");
         if (propValue != null) {
             Set<String> mods = new HashSet<>();
@@ -171,62 +180,101 @@
                 mods.add(mod);
             }
             finder = limitFinder(finder, mods, roots);
-            limitmods = true;
         }
 
-
-        // If there is no initial module specified then assume that the
-        // initial module is the unnamed module of the application class
-        // loader. By convention, and for compatibility, this is
-        // implemented by putting the names of all modules on the system
-        // module path into the set of modules to resolve.
-        //
-        // If `-addmods ALL-SYSTEM` is used then all modules on the system
-        // module path will be resolved, irrespective of whether an initial
-        // module is specified.
-        //
-        // If `-addmods ALL-MODULE-PATH` is used, and no initial module is
-        // specified, then all modules on the application module path will
-        // be resolved.
-        //
-        if (mainModule == null || addAllSystemModules) {
-            Set<ModuleReference> mrefs;
-            if (addAllApplicationModules) {
-                assert mainModule == null;
-                mrefs = finder.findAll();
-            } else {
-                mrefs = systemModulePath.findAll();
-                if (limitmods) {
-                    ModuleFinder f = finder;
-                    mrefs = mrefs.stream()
-                        .filter(m -> f.find(m.descriptor().name()).isPresent())
-                        .collect(Collectors.toSet());
+        // If there is no initial module specified then assume that the initial
+        // module is the unnamed module of the application class loader. This
+        // is implemented by resolving "java.se" and all (non-java.*) modules
+        // that export an API. If "java.se" is not observable then all java.*
+        // modules are resolved.
+        if (mainModule == null || addAllDefaultModules) {
+            boolean hasJava = false;
+            if (systemModules.find(JAVA_SE).isPresent()) {
+                // java.se is a system module
+                if (finder == systemModules || finder.find(JAVA_SE).isPresent()) {
+                    // java.se is observable
+                    hasJava = true;
+                    roots.add(JAVA_SE);
                 }
             }
-            // map to module names
-            for (ModuleReference mref : mrefs) {
-                roots.add(mref.descriptor().name());
+
+            for (ModuleReference mref : systemModules.findAll()) {
+                String mn = mref.descriptor().name();
+                if (hasJava && mn.startsWith("java."))
+                    continue;
+
+                // add as root if observable and exports at least one package
+                if ((finder == systemModules || finder.find(mn).isPresent())) {
+                    ModuleDescriptor descriptor = mref.descriptor();
+                    for (ModuleDescriptor.Exports e : descriptor.exports()) {
+                        if (!e.isQualified()) {
+                            roots.add(mn);
+                            break;
+                        }
+                    }
+                }
             }
         }
 
-        long t1 = System.nanoTime();
+        // If `-addmods ALL-SYSTEM` is specified then all observable system
+        // modules will be resolved.
+        if (addAllSystemModules) {
+            ModuleFinder f = finder;  // observable modules
+            systemModules.findAll()
+                .stream()
+                .map(ModuleReference::descriptor)
+                .map(ModuleDescriptor::name)
+                .filter(mn -> f.find(mn).isPresent())  // observable
+                .forEach(mn -> roots.add(mn));
+        }
+
+        // If `-addmods ALL-MODULE-PATH` is specified then all observable
+        // modules on the application module path will be resolved.
+        if  (appModulePath != null && addAllApplicationModules) {
+            ModuleFinder f = finder;  // observable modules
+            appModulePath.findAll()
+                .stream()
+                .map(ModuleReference::descriptor)
+                .map(ModuleDescriptor::name)
+                .filter(mn -> f.find(mn).isPresent())  // observable
+                .forEach(mn -> roots.add(mn));
+        }
+
+        PerfCounters.optionsAndRootsTime.addElapsedTimeFrom(t2);
+
+
+        long t3 = System.nanoTime();
+
+        // determine if post resolution checks are needed
+        boolean needPostResolutionChecks = true;
+        if (baseUri.getScheme().equals("jrt")   // toLowerCase not needed here
+                && (upgradeModulePath == null)
+                && (appModulePath == null)
+                && (System.getProperty("jdk.launcher.patch.0") == null)) {
+            needPostResolutionChecks = false;
+        }
+
+        PrintStream traceOutput = null;
+        if (Boolean.getBoolean("jdk.launcher.traceResolver"))
+            traceOutput = System.out;
 
         // run the resolver to create the configuration
-
-        Configuration cf = Configuration.empty()
+        Configuration cf = SharedSecrets.getJavaLangModuleAccess()
                 .resolveRequiresAndUses(finder,
-                                        ModuleFinder.empty(),
-                                        roots);
+                                        roots,
+                                        needPostResolutionChecks,
+                                        traceOutput);
 
         // time to create configuration
-        PerfCounters.resolveTime.addElapsedTimeFrom(t1);
+        PerfCounters.resolveTime.addElapsedTimeFrom(t3);
+
 
         // mapping of modules to class loaders
         Function<String, ClassLoader> clf = ModuleLoaderMap.mappingFunction(cf);
 
         // check that all modules to be mapped to the boot loader will be
-        // loaded from the system module path
-        if (finder != systemModulePath) {
+        // loaded from the runtime image
+        if (needPostResolutionChecks) {
             for (ResolvedModule resolvedModule : cf.modules()) {
                 ModuleReference mref = resolvedModule.reference();
                 String name = mref.descriptor().name();
@@ -237,20 +285,22 @@
                             && upgradeModulePath.find(name).isPresent())
                         fail(name + ": cannot be loaded from upgrade module path");
 
-                    if (!systemModulePath.find(name).isPresent())
+                    if (!systemModules.find(name).isPresent())
                         fail(name + ": cannot be loaded from application module path");
                 }
             }
         }
 
-        long t2 = System.nanoTime();
+
+        long t4 = System.nanoTime();
 
         // define modules to VM/runtime
         Layer bootLayer = Layer.empty().defineModules(cf, clf);
 
-        PerfCounters.layerCreateTime.addElapsedTimeFrom(t2);
+        PerfCounters.layerCreateTime.addElapsedTimeFrom(t4);
 
-        long t3 = System.nanoTime();
+
+        long t5 = System.nanoTime();
 
         // define the module to its class loader, except java.base
         for (ResolvedModule resolvedModule : cf.modules()) {
@@ -264,7 +314,8 @@
             }
         }
 
-        PerfCounters.loadModulesTime.addElapsedTimeFrom(t3);
+        PerfCounters.loadModulesTime.addElapsedTimeFrom(t5);
+
 
         // -XaddReads and -XaddExports
         addExtraReads(bootLayer);
@@ -295,25 +346,21 @@
 
         // module name -> reference
         Map<String, ModuleReference> map = new HashMap<>();
+
+        // root modules and their transitive dependences
         cf.modules().stream()
             .map(ResolvedModule::reference)
             .forEach(mref -> map.put(mref.descriptor().name(), mref));
 
+        // additional modules
+        otherMods.stream()
+            .map(finder::find)
+            .flatMap(Optional::stream)
+            .forEach(mref -> map.putIfAbsent(mref.descriptor().name(), mref));
+
         // set of modules that are observable
         Set<ModuleReference> mrefs = new HashSet<>(map.values());
 
-        // add the other modules
-        for (String mod : otherMods) {
-            Optional<ModuleReference> omref = finder.find(mod);
-            if (omref.isPresent()) {
-                ModuleReference mref = omref.get();
-                map.putIfAbsent(mod, mref);
-                mrefs.add(mref);
-            } else {
-                // no need to fail
-            }
-        }
-
         return new ModuleFinder() {
             @Override
             public Optional<ModuleReference> find(String name) {
@@ -369,15 +416,15 @@
 
                 Module other;
                 if (ALL_UNNAMED.equals(name)) {
-                    other = null;  // loose
+                    Modules.addReadsAllUnnamed(m);
                 } else {
                     om = bootLayer.findModule(name);
                     if (!om.isPresent())
                         fail("Unknown module: " + name);
                     other = om.get();
+                    Modules.addReads(m, other);
                 }
 
-                Modules.addReads(m, other);
             }
         }
     }
@@ -439,10 +486,6 @@
      * Decodes the values of -XaddReads or -XaddExports options
      *
      * The format of the options is: $KEY=$MODULE(,$MODULE)*
-     *
-     * For transition purposes, this method allows the first usage to be
-     *     $KEY=$MODULE(,$KEY=$MODULE)
-     * This format will eventually be removed.
      */
     private static Map<String, Set<String>> decode(String prefix) {
         int index = 0;
@@ -467,42 +510,15 @@
             if (rhs.isEmpty())
                 fail("Unable to parse: " + value);
 
-            // new format $MODULE(,$MODULE)* or old format $(MODULE)=...
-            pos = rhs.indexOf('=');
 
-            // old format only allowed in first -X option
-            if (pos >= 0 && index > 0)
-                fail("Unable to parse: " + value);
-
-            if (pos == -1) {
-
-                // new format: $KEY=$MODULE(,$MODULE)*
-
-                Set<String> values = map.get(key);
-                if (values != null)
-                    fail(key + " specified more than once");
+            // value is <module>(,<module>)*
+            if (map.containsKey(key))
+                fail(key + " specified more than once");
 
-                values = new HashSet<>();
-                map.put(key, values);
-                for (String s : rhs.split(",")) {
-                    if (s.length() > 0) values.add(s);
-                }
-
-            } else {
-
-                // old format: $KEY=$MODULE(,$KEY=$MODULE)*
-
-                assert index == 0;  // old format only allowed in first usage
-
-                for (String expr : value.split(",")) {
-                    if (expr.length() > 0) {
-                        String[] s = expr.split("=");
-                        if (s.length != 2)
-                            fail("Unable to parse: " + expr);
-
-                        map.computeIfAbsent(s[0], k -> new HashSet<>()).add(s[1]);
-                    }
-                }
+            Set<String> values = new HashSet<>();
+            map.put(key, values);
+            for (String s : rhs.split(",")) {
+                if (s.length() > 0) values.add(s);
             }
 
             index++;
@@ -521,6 +537,13 @@
     }
 
     static class PerfCounters {
+
+        static PerfCounter systemModulesTime
+            = PerfCounter.newPerfCounter("jdk.module.bootstrap.systemModulesTime");
+        static PerfCounter defineBaseTime
+            = PerfCounter.newPerfCounter("jdk.module.bootstrap.defineBaseTime");
+        static PerfCounter optionsAndRootsTime
+            = PerfCounter.newPerfCounter("jdk.module.bootstrap.optionsAndRootsTime");
         static PerfCounter resolveTime
             = PerfCounter.newPerfCounter("jdk.module.bootstrap.resolveTime");
         static PerfCounter layerCreateTime
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleHashes.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2015, 2016, 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 jdk.internal.module;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.file.Path;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * The result of hashing the contents of a number of module artifacts.
+ */
+
+public final class ModuleHashes {
+
+    /**
+     * A supplier of an encoded message digest.
+     */
+    public static interface HashSupplier {
+        String generate(String algorithm);
+    }
+
+
+    private final String algorithm;
+    private final Map<String, String> nameToHash;
+
+    /**
+     * Creates a {@code ModuleHashes}.
+     *
+     * @param algorithm   the algorithm used to create the hashes
+     * @param nameToHash  the map of module name to hash value (in string form)
+     */
+    public ModuleHashes(String algorithm, Map<String, String> nameToHash) {
+        this.algorithm = algorithm;
+        this.nameToHash = Collections.unmodifiableMap(nameToHash);
+    }
+
+    /**
+     * Returns the algorithm used to hash the modules ("SHA-256" for example).
+     */
+    public String algorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Returns the set of module names for which hashes are recorded.
+     */
+    public Set<String> names() {
+        return nameToHash.keySet();
+    }
+
+    /**
+     * Returns the hash string for the given module name, {@code null}
+     * if there is no hash recorded for the module.
+     */
+    public String hashFor(String mn) {
+        return nameToHash.get(mn);
+    }
+
+    /**
+     * Returns unmodifiable map of module name to hash string.
+     */
+    public Map<String, String> hashes() {
+        return nameToHash;
+    }
+
+    /**
+     * Computes the hash for the given file with the given message digest
+     * algorithm. Returns the results a base64-encoded String.
+     *
+     * @throws UncheckedIOException if an I/O error occurs
+     * @throws RuntimeException if the algorithm is not available
+     */
+    public static String computeHashAsString(Path file, String algorithm) {
+        try {
+            MessageDigest md = MessageDigest.getInstance(algorithm);
+
+            // Ideally we would just mmap the file but this consumes too much
+            // memory when jlink is running concurrently on very large jmods
+            try (FileChannel fc = FileChannel.open(file)) {
+                ByteBuffer bb = ByteBuffer.allocate(32*1024);
+                while (fc.read(bb) > 0) {
+                    bb.flip();
+                    md.update(bb);
+                    assert bb.remaining() == 0;
+                    bb.clear();
+                }
+            }
+
+            byte[] bytes = md.digest();
+            return Base64.getEncoder().encodeToString(bytes);
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        } catch (IOException ioe) {
+            throw new UncheckedIOException(ioe);
+        }
+    }
+
+    /**
+     * Computes the hash for every entry in the given map, returning a
+     * {@code ModuleHashes} to encapsulate the result. The map key is
+     * the entry name, typically the module name. The map value is the file
+     * path to the entry (module artifact).
+     *
+     * @return ModuleHashes encapsulate the hashes
+     */
+    public static ModuleHashes generate(Map<String, Path> map, String algorithm) {
+        Map<String, String> nameToHash = new HashMap<>();
+        for (Map.Entry<String, Path> entry: map.entrySet()) {
+            String name = entry.getKey();
+            Path path = entry.getValue();
+            nameToHash.put(name, computeHashAsString(path, algorithm));
+        }
+        return new ModuleHashes(algorithm, nameToHash);
+    }
+}
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -41,7 +41,6 @@
 import jdk.internal.org.objectweb.asm.ClassVisitor;
 import jdk.internal.org.objectweb.asm.ClassWriter;
 import jdk.internal.org.objectweb.asm.Opcodes;
-import jdk.internal.module.Hasher.DependencyHashes;
 
 import static jdk.internal.module.ClassFileAttributes.*;
 
@@ -69,7 +68,7 @@
     private String osVersion;
 
     // the hashes for the Hashes attribute
-    private DependencyHashes hashes;
+    private ModuleHashes hashes;
 
     private ModuleInfoExtender(InputStream in) {
         this.in = in;
@@ -113,10 +112,10 @@
 
     /**
      * The Hashes attribute will be emitted to the module-info with
-     * the hashes encapsulated in the given {@code DependencyHashes}
+     * the hashes encapsulated in the given {@code ModuleHashes}
      * object.
      */
-    public ModuleInfoExtender hashes(DependencyHashes hashes) {
+    public ModuleInfoExtender hashes(ModuleHashes hashes) {
         this.hashes = hashes;
         return this;
     }
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -49,28 +49,22 @@
      * Writes the given module descriptor to a module-info.class file,
      * returning it in a byte array.
      */
-    private static byte[] toModuleInfo(ModuleDescriptor descriptor) {
+    private static byte[] toModuleInfo(ModuleDescriptor md) {
 
         ClassWriter cw = new ClassWriter(0);
 
-        String name = descriptor.name().replace('.', '/') + "/module-info";
+        String name = md.name().replace('.', '/') + "/module-info";
         cw.visit(Opcodes.V1_8, ACC_MODULE, name, null, null, null);
 
-        cw.visitAttribute(new ModuleAttribute(descriptor));
-        cw.visitAttribute(new ConcealedPackagesAttribute(descriptor.conceals()));
-
-        Optional<Version> oversion = descriptor.version();
-        if (oversion.isPresent())
-            cw.visitAttribute(new VersionAttribute(oversion.get()));
-
-        Optional<String> omain = descriptor.mainClass();
-        if (omain.isPresent())
-            cw.visitAttribute(new MainClassAttribute(omain.get()));
+        cw.visitAttribute(new ModuleAttribute(md));
+        cw.visitAttribute(new ConcealedPackagesAttribute(md.conceals()));
+        md.version().ifPresent(v -> cw.visitAttribute(new VersionAttribute(v)));
+        md.mainClass().ifPresent(mc -> cw.visitAttribute(new MainClassAttribute(mc)));
 
         // write the TargetPlatform attribute if have any of OS name/arch/version
-        String osName = descriptor.osName().orElse(null);
-        String osArch = descriptor.osArch().orElse(null);
-        String osVersion = descriptor.osVersion().orElse(null);
+        String osName = md.osName().orElse(null);
+        String osArch = md.osArch().orElse(null);
+        String osVersion = md.osVersion().orElse(null);
         if (osName != null || osArch != null || osVersion != null) {
             cw.visitAttribute(new TargetPlatformAttribute(osName,
                                                           osArch,
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java	Wed Jul 05 21:40:37 2017 +0200
@@ -91,56 +91,29 @@
 
         Map<String, List<Path>> map = new HashMap<>();
         while (value != null) {
-            int pos = value.indexOf('=');
+
+            // <module>=<file>(:<file>)*
 
-            if (pos == -1 && index > 0)
+            int pos = value.indexOf('=');
+            if (pos == -1)
                 throwIAE("Unable to parse: " + value);
-
             if (pos == 0)
                 throwIAE("Missing module name: " + value);
 
-            if (pos > 0) {
-
-                // new format: <module>=<file>(:<file>)*
-
-                String mn = value.substring(0, pos);
-                List<Path> list = map.get(mn);
-                if (list != null)
-                    throwIAE("Module " + mn + " specified more than once");
-                list = new ArrayList<>();
-                map.put(mn, list);
-
-                String paths = value.substring(pos+1);
-                for (String path : paths.split(File.pathSeparator)) {
-                    if (!path.isEmpty()) {
-                        list.add(Paths.get(path));
-                    }
-                }
-
-            } else {
+            String mn = value.substring(0, pos);
+            List<Path> list = map.get(mn);
+            if (list != null)
+                throwIAE("Module " + mn + " specified more than once");
+            list = new ArrayList<>();
+            map.put(mn, list);
 
-                // old format: <dir>(:<dir>)*
-
-                assert index == 0; // old format only allowed in first -Xpatch
-
-                String[] dirs = value.split(File.pathSeparator);
-                for (String d : dirs) {
-                    if (d.length() > 0) {
-                        Path top = Paths.get(d);
-                        try {
-                            Files.list(top).forEach(e -> {
-                                String mn = e.getFileName().toString();
-                                Path dir = top.resolve(mn);
-                                map.computeIfAbsent(mn, k -> new ArrayList<>())
-                                    .add(dir);
-                            });
-                        } catch (IOException ignore) { }
-                    }
+            String paths = value.substring(pos+1);
+            for (String path : paths.split(File.pathSeparator)) {
+                if (!path.isEmpty()) {
+                    list.add(Paths.get(path));
                 }
-
             }
 
-
             index++;
             value = System.getProperty(PATCH_PROPERTY_PREFIX + index);
         }
@@ -175,7 +148,8 @@
             for (Path file : paths) {
                 if (Files.isRegularFile(file)) {
 
-                    // JAR file
+                    // JAR file - do not open as a multi-release JAR as this
+                    // is not supported by the boot class loader
                     try (JarFile jf = new JarFile(file.toFile())) {
                         jf.stream()
                           .filter(e -> e.getName().endsWith(".class"))
@@ -209,10 +183,11 @@
             descriptor = JLMA.newModuleDescriptor(descriptor, packages);
         }
 
-        // return a new module reference
+        // return a module reference to the patched module
         URI location = mref.location().orElse(null);
-        return new ModuleReference(descriptor, location,
-                                   () -> new PatchedModuleReader(paths, mref));
+        return JLMA.newPatchedModule(descriptor,
+                                     location,
+                                     () -> new PatchedModuleReader(paths, mref));
 
     }
 
--- a/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, 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
@@ -58,7 +58,7 @@
      * Creates a new Module. The module has the given ModuleDescriptor and
      * is defined to the given class loader.
      *
-     * The resulting Module is in a larva state in that it does not not read
+     * The resulting Module is in a larval state in that it does not not read
      * any other module and does not have any exports.
      *
      * The URI is for information purposes only.
@@ -74,7 +74,7 @@
      * Define a new module to the VM. The module has the given set of
      * concealed packages and is defined to the given class loader.
      *
-     * The resulting Module is in a larva state in that it does not not read
+     * The resulting Module is in a larval state in that it does not not read
      * any other module and does not have any exports.
      */
     public static Module defineModule(ClassLoader loader,
@@ -96,6 +96,13 @@
     }
 
     /**
+     * Update module {@code m} to read all unnamed modules.
+     */
+    public static void addReadsAllUnnamed(Module m) {
+        JLRMA.addReadsAllUnnamed(m);
+    }
+
+    /**
      * Updates module m1 to export a package to module m2.
      * Same as m1.addExports(pkg, m2) but without a caller check.
      */
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ServicesCatalog.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ServicesCatalog.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -29,94 +29,105 @@
 import java.lang.module.ModuleDescriptor;
 import java.lang.module.ModuleDescriptor.Provides;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * A services catalog. Each {@code ClassLoader} has an optional {@code
- * ServicesCatalog} for modules that provide services. This is to support
- * ClassLoader centric ServiceLoader.load methods.
+ * A <em>services catalog</em>. Each {@code ClassLoader} and {@code Layer} has
+ * an optional {@code ServicesCatalog} for modules that provide services.
+ *
+ * @see java.util.ServiceLoader
  */
-public class ServicesCatalog {
-
-    // use RW locks as register is rare
-    private final ReadWriteLock lock = new ReentrantReadWriteLock();
-    private final Lock readLock = lock.readLock();
-    private final Lock writeLock = lock.writeLock();
+public interface ServicesCatalog {
 
     /**
      * Represents a service provider in the services catalog.
      */
-    public class ServiceProvider {
+    public final class ServiceProvider {
         private final Module module;
         private final String providerName;
-        ServiceProvider(Module module, String providerName) {
+
+        public ServiceProvider(Module module, String providerName) {
             this.module = module;
             this.providerName = providerName;
         }
+
         public Module module() {
             return module;
         }
+
         public String providerName() {
             return providerName;
         }
-    }
 
-    // service providers
-    private final Map<String, Set<ServiceProvider>> loaderServices = new HashMap<>();
-
-    /**
-     * Creates a new module catalog.
-     */
-    public ServicesCatalog() { }
-
-    /**
-     * Registers the module in this module catalog.
-     */
-    public void register(Module m) {
-        ModuleDescriptor descriptor = m.getDescriptor();
+        @Override
+        public int hashCode() {
+            return Objects.hash(module, providerName);
+        }
 
-        writeLock.lock();
-        try {
-            // extend the services map
-            for (Provides ps : descriptor.provides().values()) {
-                String service = ps.service();
-                Set<String> providerNames = ps.providers();
-
-                // create a new set to replace the existing
-                Set<ServiceProvider> result = new HashSet<>();
-                Set<ServiceProvider> providers = loaderServices.get(service);
-                if (providers != null) {
-                    result.addAll(providers);
-                }
-                for (String pn : providerNames) {
-                    result.add(new ServiceProvider(m, pn));
-                }
-                loaderServices.put(service, Collections.unmodifiableSet(result));
-            }
-
-        } finally {
-            writeLock.unlock();
+        @Override
+        public boolean equals(Object ob) {
+            if (!(ob instanceof ServiceProvider))
+                return false;
+            ServiceProvider that = (ServiceProvider)ob;
+            return Objects.equals(this.module, that.module)
+                    && Objects.equals(this.providerName, that.providerName);
         }
     }
 
     /**
+     * Registers the providers in the given module in this services catalog.
+     *
+     * @throws UnsupportedOperationException
+     *         If this services catalog is immutable
+     */
+    void register(Module module);
+
+    /**
      * Returns the (possibly empty) set of service providers that implement the
      * given service type.
-     *
-     * @see java.util.ServiceLoader
+     */
+    Set<ServiceProvider> findServices(String service);
+
+    /**
+     * Creates a ServicesCatalog that supports concurrent registration and
+     * and lookup.
      */
-    public Set<ServiceProvider> findServices(String service) {
-        readLock.lock();
-        try {
-            return loaderServices.getOrDefault(service, Collections.emptySet());
-        } finally {
-            readLock.unlock();
-        }
+    static ServicesCatalog create() {
+        return new ServicesCatalog() {
+
+            private Map<String, Set<ServiceProvider>> map = new ConcurrentHashMap<>();
+
+            @Override
+            public void register(Module m) {
+                ModuleDescriptor descriptor = m.getDescriptor();
+
+                for (Provides provides : descriptor.provides().values()) {
+                    String service = provides.service();
+                    Set<String> providerNames = provides.providers();
+
+                    // create a new set to replace the existing
+                    Set<ServiceProvider> result = new HashSet<>();
+                    Set<ServiceProvider> providers = map.get(service);
+                    if (providers != null) {
+                        result.addAll(providers);
+                    }
+                    for (String pn : providerNames) {
+                        result.add(new ServiceProvider(m, pn));
+                    }
+                    map.put(service, Collections.unmodifiableSet(result));
+                }
+
+            }
+
+            @Override
+            public Set<ServiceProvider> findServices(String service) {
+                return map.getOrDefault(service, Collections.emptySet());
+            }
+
+        };
     }
-}
+}
\ No newline at end of file
--- a/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java	Wed Jul 05 21:40:37 2017 +0200
@@ -40,21 +40,26 @@
  */
 public final class SystemModules {
     /**
-     * Name of the installed modules.
+     * Name of the system modules.
      *
-     * This array provides a way for InstalledModuleFinder to fallback
+     * This array provides a way for SystemModuleFinder to fallback
      * and read module-info.class from the run-time image instead of
      * the fastpath.
      */
     public static final String[] MODULE_NAMES = new String[1];
 
     /**
+     * Hash of system modules.
+     */
+    public static String[] MODULES_TO_HASH = new String[1];
+
+    /**
      * Number of packages in the boot layer from the installed modules.
      *
      * Don't make it final to avoid inlining during compile time as
      * the value will be changed at jlink time.
      */
-    public static final int PACKAGES_IN_BOOT_LAYER = 1024;
+    public static int PACKAGES_IN_BOOT_LAYER = 1024;
 
     /**
      * Returns a non-empty array of ModuleDescriptors in the run-time image.
@@ -64,4 +69,5 @@
     public static ModuleDescriptor[] modules() {
         return new ModuleDescriptor[0];
     }
-}
\ No newline at end of file
+
+}
--- a/jdk/src/java.base/share/classes/jdk/internal/reflect/MethodAccessorGenerator.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/MethodAccessorGenerator.java	Wed Jul 05 21:40:37 2017 +0200
@@ -392,6 +392,7 @@
         // matter.
         return AccessController.doPrivileged(
             new PrivilegedAction<MagicAccessorImpl>() {
+                @SuppressWarnings("deprecation") // Class.newInstance
                 public MagicAccessorImpl run() {
                         try {
                         return (MagicAccessorImpl)
--- a/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java	Wed Jul 05 21:40:37 2017 +0200
@@ -343,8 +343,8 @@
 
     private static void printStackTraceIfNeeded(Throwable e) {
         if (!printStackWhenAccessFailsSet && VM.initLevel() >= 1) {
-            String s = GetPropertyAction
-                    .getProperty("sun.reflect.debugModuleAccessChecks");
+            String s = GetPropertyAction.privilegedGetProperty(
+                    "sun.reflect.debugModuleAccessChecks");
             printStackWhenAccessFails =
                     (s != null && !s.equalsIgnoreCase("false"));
             printStackWhenAccessFailsSet = true;
--- a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -398,7 +398,7 @@
             return;
         }
 
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         String val = props.getProperty("sun.reflect.noInflation");
         if (val != null && val.equals("true")) {
             noInflation = true;
--- a/jdk/src/java.base/share/classes/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -145,6 +145,8 @@
         jdk.scripting.nashorn;
     exports jdk.internal.org.objectweb.asm.signature to
         jdk.scripting.nashorn;
+    exports jdk.internal.loader to
+        java.instrument;
     exports jdk.internal.math to
         java.desktop;
     exports jdk.internal.module to
@@ -166,6 +168,8 @@
         java.sql,
         java.xml,
         jdk.charsets,
+        jdk.jartool,
+        jdk.jlink,
         jdk.net,
         jdk.scripting.nashorn,
         jdk.unsupported,
--- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java	Wed Jul 05 21:40:37 2017 +0200
@@ -84,8 +84,10 @@
 import jdk.internal.misc.VM;
 
 
-public enum LauncherHelper {
-    INSTANCE;
+public final class LauncherHelper {
+
+    // No instantiation
+    private LauncherHelper() {}
 
     // used to identify JavaFX applications
     private static final String JAVAFX_APPLICATION_MARKER =
--- a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties	Wed Jul 05 21:40:37 2017 +0200
@@ -27,7 +27,7 @@
 java.launcher.opt.header  =   Usage: {0} [options] class [args...]\n\
 \           (to execute a class)\n   or  {0} [options] -jar jarfile [args...]\n\
 \           (to execute a jar file)\n\
-\   or  {0} [-options] -mp <modulepath> -m <modulename> | <modulename>/<mainclass>\n\
+\   or  {0} [options] -mp <modulepath> -m <modulename>[/<mainclass>] [args...]\n\
 \           (to execute the main class in a module)\n\
 where options include:\n
 
@@ -51,8 +51,9 @@
 \                  A {0} separated list of directories, each directory\n\
 \                  is a directory of modules that replace upgradeable\n\
 \                  modules in the runtime image\n\
-\    -m <modulename> | <modulename>/<mainclass>\n\
-\                  the initial or main module to resolve\n\
+\    -m <modulename>[/<mainclass>]\n\
+\                  the initial module to resolve, and the name of the main class\n\
+\                  to execute if not specified by the module\n\
 \    -addmods <modulename>[,<modulename>...]\n\
 \                  root modules to resolve in addition to the initial module\n\
 \    -limitmods <modulename>[,<modulename>...]\n\
--- a/jdk/src/java.base/share/classes/sun/net/ResourceManager.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/ResourceManager.java	Wed Jul 05 21:40:37 2017 +0200
@@ -53,8 +53,8 @@
     private static final AtomicInteger numSockets;
 
     static {
-        String prop =
-                GetPropertyAction.getProperty("sun.net.maxDatagramSockets");
+        String prop = GetPropertyAction
+                .privilegedGetProperty("sun.net.maxDatagramSockets");
         int defmax = DEFAULT_MAX_SOCKETS;
         try {
             if (prop != null) {
--- a/jdk/src/java.base/share/classes/sun/net/ftp/FtpClientProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/ftp/FtpClientProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -67,8 +67,9 @@
             return false;
         }
         try {
-            Class<?> c = Class.forName(cm, true, null);
-            provider = (FtpClientProvider) c.newInstance();
+            @SuppressWarnings("deprecation")
+            Object o = Class.forName(cm, true, null).newInstance();
+            provider = (FtpClientProvider)o;
             return true;
         } catch (ClassNotFoundException |
                  IllegalAccessException |
--- a/jdk/src/java.base/share/classes/sun/net/sdp/SdpSupport.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/sdp/SdpSupport.java	Wed Jul 05 21:40:37 2017 +0200
@@ -40,7 +40,7 @@
  */
 
 public final class SdpSupport {
-    private static final String os = GetPropertyAction.getProperty("os.name");
+    private static final String os = GetPropertyAction.privilegedGetProperty("os.name");
     private static final boolean isSupported = (os.equals("SunOS") || (os.equals("Linux")));
     private static final JavaIOFileDescriptorAccess fdAccess =
         SharedSecrets.getJavaIOFileDescriptorAccess();
--- a/jdk/src/java.base/share/classes/sun/net/smtp/SmtpClient.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/smtp/SmtpClient.java	Wed Jul 05 21:40:37 2017 +0200
@@ -157,7 +157,7 @@
         }
         try {
             String s;
-            mailhost = GetPropertyAction.getProperty("mail.host");
+            mailhost = GetPropertyAction.privilegedGetProperty("mail.host");
             if (mailhost != null) {
                 openServer(mailhost);
                 return;
@@ -183,7 +183,7 @@
         setConnectTimeout(to);
         try {
             String s;
-            mailhost = GetPropertyAction.getProperty("mail.host");
+            mailhost = GetPropertyAction.privilegedGetProperty("mail.host");
             if (mailhost != null) {
                 openServer(mailhost);
                 return;
--- a/jdk/src/java.base/share/classes/sun/net/www/MimeLauncher.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/MimeLauncher.java	Wed Jul 05 21:40:37 2017 +0200
@@ -183,7 +183,7 @@
         }
 
         String execPathList;
-        execPathList = GetPropertyAction.getProperty("exec.path");
+        execPathList = GetPropertyAction.privilegedGetProperty("exec.path");
         if (execPathList == null) {
             // exec.path property not set
             return false;
--- a/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java	Wed Jul 05 21:40:37 2017 +0200
@@ -145,7 +145,7 @@
     }
 
     static {
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         String keepAlive = props.getProperty("http.keepAlive");
         String retryPost = props.getProperty("sun.net.http.retryPost");
 
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java	Wed Jul 05 21:40:37 2017 +0200
@@ -278,7 +278,7 @@
 
         if (user == null) {
             user = "anonymous";
-            Properties props = GetPropertyAction.getProperties();
+            Properties props = GetPropertyAction.privilegedGetProperties();
             String vers = props.getProperty("java.version");
             password = props.getProperty("ftp.protocol.user",
                     "Java" + vers + "@");
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/AuthenticationHeader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/AuthenticationHeader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -94,7 +94,7 @@
     }
 
     static {
-        authPref = GetPropertyAction.getProperty("http.auth.preference");
+        authPref = GetPropertyAction.privilegedGetProperty("http.auth.preference");
 
         // http.auth.preference can be set to SPNEGO or Kerberos.
         // In fact they means "Negotiate with SPNEGO" and "Negotiate with
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Wed Jul 05 21:40:37 2017 +0200
@@ -207,9 +207,9 @@
     };
 
     static {
-        Properties props = GetPropertyAction.getProperties();
-        maxRedirects = GetIntegerAction.getProperty("http.maxRedirects",
-                        defaultmaxRedirects);
+        Properties props = GetPropertyAction.privilegedGetProperties();
+        maxRedirects = GetIntegerAction.privilegedGetProperty(
+                "http.maxRedirects", defaultmaxRedirects);
         version = props.getProperty("java.version");
         String agent = props.getProperty("http.agent");
         if (agent == null) {
@@ -225,14 +225,14 @@
 
         enableESBuffer = Boolean.parseBoolean(
                 props.getProperty("sun.net.http.errorstream.enableBuffering"));
-        timeout4ESBuffer = GetIntegerAction
-                .getProperty("sun.net.http.errorstream.timeout", 300);
+        timeout4ESBuffer = GetIntegerAction.privilegedGetProperty(
+                "sun.net.http.errorstream.timeout", 300);
         if (timeout4ESBuffer <= 0) {
             timeout4ESBuffer = 300; // use the default
         }
 
-        bufSize4ES = GetIntegerAction
-                .getProperty("sun.net.http.errorstream.bufferSize", 4096);
+        bufSize4ES = GetIntegerAction.privilegedGetProperty(
+                "sun.net.http.errorstream.bufferSize", 4096);
         if (bufSize4ES <= 0) {
             bufSize4ES = 4096; // use the default
         }
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/https/HttpsClient.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/https/HttpsClient.java	Wed Jul 05 21:40:37 2017 +0200
@@ -139,7 +139,7 @@
         //
         String ciphers [];
         String cipherString =
-                GetPropertyAction.getProperty("https.cipherSuites");
+                GetPropertyAction.privilegedGetProperty("https.cipherSuites");
 
         if (cipherString == null || "".equals(cipherString)) {
             ciphers = null;
@@ -163,7 +163,7 @@
         //
         String protocols [];
         String protocolString =
-                GetPropertyAction.getProperty("https.protocols");
+                GetPropertyAction.privilegedGetProperty("https.protocols");
 
         if (protocolString == null || "".equals(protocolString)) {
             protocols = null;
@@ -183,7 +183,8 @@
     }
 
     private String getUserAgent() {
-        String userAgent = GetPropertyAction.getProperty("https.agent");
+        String userAgent =
+                GetPropertyAction.privilegedGetProperty("https.agent");
         if (userAgent == null || userAgent.length() == 0) {
             userAgent = "JSSE";
         }
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java	Wed Jul 05 21:40:37 2017 +0200
@@ -161,7 +161,7 @@
     public Permission getPermission() throws IOException {
         Permission p = permission;
         if (p == null) {
-            String home = GetPropertyAction.getProperty("java.home");
+            String home = GetPropertyAction.privilegedGetProperty("java.home");
             p = new FilePermission(home + File.separator + "-", "read");
             permission = p;
         }
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/netdoc/Handler.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/netdoc/Handler.java	Wed Jul 05 21:40:37 2017 +0200
@@ -56,9 +56,9 @@
         URL ru;
 
         boolean localonly = Boolean.parseBoolean(
-                GetPropertyAction.getProperty("newdoc.localonly"));
+                GetPropertyAction.privilegedGetProperty("newdoc.localonly"));
 
-        String docurl = GetPropertyAction.getProperty("doc.url");
+        String docurl = GetPropertyAction.privilegedGetProperty("doc.url");
 
         String file = u.getFile();
         if (!localonly) {
--- a/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1019,7 +1019,7 @@
         if (!propertyChecked) {
             synchronized (FileChannelImpl.class) {
                 if (!propertyChecked) {
-                    String value = GetPropertyAction.getProperty(
+                    String value = GetPropertyAction.privilegedGetProperty(
                             "sun.nio.ch.disableSystemWideOverlappingFileLockCheck");
                     isSharedFileLockTable = ((value == null) || value.equals("false"));
                     propertyChecked = true;
--- a/jdk/src/java.base/share/classes/sun/nio/ch/Net.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/Net.java	Wed Jul 05 21:40:37 2017 +0200
@@ -374,8 +374,8 @@
     }
 
     public static boolean isFastTcpLoopbackRequested() {
-        String loopbackProp =
-                GetPropertyAction.getProperty("jdk.net.useFastTcpLoopback");
+        String loopbackProp = GetPropertyAction
+                .privilegedGetProperty("jdk.net.useFastTcpLoopback");
         boolean enable;
         if ("".equals(loopbackProp)) {
             enable = true;
@@ -633,8 +633,8 @@
     static {
         int availLevel = isExclusiveBindAvailable();
         if (availLevel >= 0) {
-            String exclBindProp =
-                    GetPropertyAction.getProperty("sun.net.useExclusiveBind");
+            String exclBindProp = GetPropertyAction
+                    .privilegedGetProperty("sun.net.useExclusiveBind");
             if (exclBindProp != null) {
                 exclusiveBind = exclBindProp.isEmpty() ?
                         true : Boolean.parseBoolean(exclBindProp);
--- a/jdk/src/java.base/share/classes/sun/nio/ch/ThreadPool.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/ThreadPool.java	Wed Jul 05 21:40:37 2017 +0200
@@ -165,14 +165,11 @@
             GetPropertyAction(DEFAULT_THREAD_POOL_THREAD_FACTORY));
         if (propValue != null) {
             try {
-                Class<?> c = Class
-                    .forName(propValue, true, ClassLoader.getSystemClassLoader());
-                return ((ThreadFactory)c.newInstance());
-            } catch (ClassNotFoundException x) {
-                throw new Error(x);
-            } catch (InstantiationException x) {
-                throw new Error(x);
-            } catch (IllegalAccessException x) {
+                @SuppressWarnings("deprecation")
+                Object tmp = Class
+                    .forName(propValue, true, ClassLoader.getSystemClassLoader()).newInstance();
+                return (ThreadFactory)tmp;
+            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException x) {
                 throw new Error(x);
             }
         }
--- a/jdk/src/java.base/share/classes/sun/nio/ch/Util.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/Util.java	Wed Jul 05 21:40:37 2017 +0200
@@ -64,7 +64,8 @@
      * for potential future-proofing.
      */
     private static long getMaxCachedBufferSize() {
-        String s = GetPropertyAction.getProperty("jdk.nio.maxCachedBufferSize");
+        String s = GetPropertyAction
+                .privilegedGetProperty("jdk.nio.maxCachedBufferSize");
         if (s != null) {
             try {
                 long m = Long.parseLong(s);
@@ -465,7 +466,8 @@
         if (bugLevel == null) {
             if (!jdk.internal.misc.VM.isBooted())
                 return false;
-            String value = GetPropertyAction.getProperty("sun.nio.ch.bugLevel");
+            String value = GetPropertyAction
+                    .privilegedGetProperty("sun.nio.ch.bugLevel");
             bugLevel = (value != null) ? value : "";
         }
         return bugLevel.equals(bl);
--- a/jdk/src/java.base/share/classes/sun/nio/cs/FastCharsetProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/FastCharsetProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -115,10 +115,11 @@
 
         // Instantiate the charset and cache it
         try {
-            Class<?> c = Class.forName(packagePrefix + "." + cln,
+            @SuppressWarnings("deprecation")
+            Object o= Class.forName(packagePrefix + "." + cln,
                                     true,
-                                    this.getClass().getClassLoader());
-            cs = (Charset)c.newInstance();
+                                    this.getClass().getClassLoader()).newInstance();
+            cs = (Charset)o;
             cache.put(csn, cs);
             return cs;
         } catch (ClassNotFoundException |
--- a/jdk/src/java.base/share/classes/sun/nio/cs/StandardCharsets.java.template	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/StandardCharsets.java.template	Wed Jul 05 21:40:37 2017 +0200
@@ -110,10 +110,11 @@
 
         // Instantiate the charset and cache it
         try {
-            Class<?> c = Class.forName(packagePrefix + "." + cln,
-                                    true,
-                                    this.getClass().getClassLoader());
-            cs = (Charset)c.newInstance();
+            @SuppressWarnings("deprecation")
+            Object o = Class.forName(packagePrefix + "." + cln,
+                                     true,
+                                     this.getClass().getClassLoader()).newInstance();
+            cs = (Charset)o;
             cache.put(csn, cs);
             return cs;
         } catch (ClassNotFoundException |
@@ -164,7 +165,7 @@
             return;
         initialized = true;
 
-        String map = getProperty("sun.nio.cs.map");
+        String map = GetPropertyAction.privilegedGetProperty("sun.nio.cs.map");
         if (map != null) {
             String[] maps = map.split(",");
             for (int i = 0; i < maps.length; i++) {
@@ -199,9 +200,4 @@
         }
     }
 
-    private static String getProperty(String key) {
-        return GetPropertyAction.getProperty(key);
-    }
-
-
 }
--- a/jdk/src/java.base/share/classes/sun/nio/fs/Util.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/nio/fs/Util.java	Wed Jul 05 21:40:37 2017 +0200
@@ -38,7 +38,7 @@
     private Util() { }
 
     private static final Charset jnuEncoding = Charset.forName(
-        GetPropertyAction.getProperty("sun.jnu.encoding"));
+        GetPropertyAction.privilegedGetProperty("sun.jnu.encoding"));
 
     /**
      * Returns {@code Charset} corresponding to the sun.jnu.encoding property
--- a/jdk/src/java.base/share/classes/sun/security/action/GetIntegerAction.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/action/GetIntegerAction.java	Wed Jul 05 21:40:37 2017 +0200
@@ -118,9 +118,14 @@
      * if no security manager is present. This is unsafe for inclusion in a
      * public API but allowable here since this class is now encapsulated.
      *
+     * Note that this method performs a privileged action using caller-provided
+     * inputs. The caller of this method should take care to ensure that the
+     * inputs are not tainted and the returned property is not made accessible
+     * to untrusted code if it contains sensitive information.
+     *
      * @param theProp the name of the system property.
      */
-    public static Integer getProperty(String theProp) {
+    public static Integer privilegedGetProperty(String theProp) {
         if (System.getSecurityManager() == null) {
             return Integer.getInteger(theProp);
         } else {
@@ -134,10 +139,16 @@
      * if no security manager is present. This is unsafe for inclusion in a
      * public API but allowable here since this class is now encapsulated.
      *
+     * Note that this method performs a privileged action using caller-provided
+     * inputs. The caller of this method should take care to ensure that the
+     * inputs are not tainted and the returned property is not made accessible
+     * to untrusted code if it contains sensitive information.
+     *
      * @param theProp the name of the system property.
      * @param defaultVal the default value.
      */
-    public static Integer getProperty(String theProp, int defaultVal) {
+    public static Integer privilegedGetProperty(String theProp,
+            int defaultVal) {
         Integer value;
         if (System.getSecurityManager() == null) {
             value = Integer.getInteger(theProp);
--- a/jdk/src/java.base/share/classes/sun/security/action/GetPropertyAction.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/action/GetPropertyAction.java	Wed Jul 05 21:40:37 2017 +0200
@@ -93,9 +93,14 @@
      * if no security manager is present. This is unsafe for inclusion in a
      * public API but allowable here since this class is now encapsulated.
      *
+     * Note that this method performs a privileged action using caller-provided
+     * inputs. The caller of this method should take care to ensure that the
+     * inputs are not tainted and the returned property is not made accessible
+     * to untrusted code if it contains sensitive information.
+     *
      * @param theProp the name of the system property.
      */
-    public static String getProperty(String theProp) {
+    public static String privilegedGetProperty(String theProp) {
         if (System.getSecurityManager() == null) {
             return System.getProperty(theProp);
         } else {
@@ -109,10 +114,16 @@
      * if no security manager is present. This is unsafe for inclusion in a
      * public API but allowable here since this class is now encapsulated.
      *
+     * Note that this method performs a privileged action using caller-provided
+     * inputs. The caller of this method should take care to ensure that the
+     * inputs are not tainted and the returned property is not made accessible
+     * to untrusted code if it contains sensitive information.
+     *
      * @param theProp the name of the system property.
      * @param defaultVal the default value.
      */
-    public static String getProperty(String theProp, String defaultVal) {
+    public static String privilegedGetProperty(String theProp,
+            String defaultVal) {
         if (System.getSecurityManager() == null) {
             return System.getProperty(theProp, defaultVal);
         } else {
@@ -126,8 +137,13 @@
      * having to go through doPrivileged if no security manager is present.
      * This is unsafe for inclusion in a public API but allowable here since
      * this class is now encapsulated.
+     *
+     * Note that this method performs a privileged action, and callers of
+     * this method should take care to ensure that the returned properties
+     * are not made accessible to untrusted code since it may contain
+     * sensitive information.
      */
-    public static Properties getProperties() {
+    public static Properties privilegedGetProperties() {
         if (System.getSecurityManager() == null) {
             return System.getProperties();
         } else {
--- a/jdk/src/java.base/share/classes/sun/security/jca/ProviderConfig.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/jca/ProviderConfig.java	Wed Jul 05 21:40:37 2017 +0200
@@ -185,7 +185,9 @@
                     try {
                         Class<?> c = Class.forName("apple.security.AppleProvider");
                         if (Provider.class.isAssignableFrom(c)) {
-                            return (Provider) c.newInstance();
+                            @SuppressWarnings("deprecation")
+                            Object tmp = c.newInstance();
+                            return (Provider) tmp;
                         } else {
                             return null;
                         }
@@ -386,6 +388,7 @@
 
                 Provider p = AccessController.doPrivileged
                     (new PrivilegedExceptionAction<Provider>() {
+                    @SuppressWarnings("deprecation") // Class.newInstance
                     public Provider run() throws Exception {
                         return (Provider) provClass.newInstance();
                     }
--- a/jdk/src/java.base/share/classes/sun/security/pkcs/PKCS8Key.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/pkcs/PKCS8Key.java	Wed Jul 05 21:40:37 2017 +0200
@@ -218,11 +218,10 @@
                 }
             }
 
-            Object      inst = null;
+            @SuppressWarnings("deprecation")
+            Object      inst = (keyClass != null) ? keyClass.newInstance() : null;
             PKCS8Key    result;
 
-            if (keyClass != null)
-                inst = keyClass.newInstance();
             if (inst instanceof PKCS8Key) {
                 result = (PKCS8Key) inst;
                 result.algid = algid;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/AbstractDrbg.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,771 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider;
+
+import sun.security.util.Debug;
+
+import java.security.*;
+import java.util.Arrays;
+import java.util.Objects;
+import static java.security.DrbgParameters.Capability.*;
+
+/**
+ * The abstract base class for all DRBGs.
+ * <p>
+ * This class creates 5 new abstract methods. 3 are defined by the SP800-90A:
+ * <ol>
+ *  <li>{@link #generateAlgorithm(byte[], byte[])}
+ *  <li>{@link #reseedAlgorithm(byte[], byte[])} (might not be supported)
+ *  <li>{@link #instantiateAlgorithm(byte[])}
+ * </ol>
+ * and 2 for implementation purpose:
+ * <ol>
+ *  <li>{@link #initEngine()}
+ *  <li>{@link #chooseAlgorithmAndStrength}
+ * </ol>
+ * All existing {@link SecureRandomSpi} methods are implemented based on the
+ * methods above as final. The initialization process is divided into 2 phases:
+ * configuration is eagerly called to set up parameters, and instantiation
+ * is lazily called only when nextBytes or reseed is called.
+ * <p>
+ * Synchronized keyword should be added to all externally callable engine
+ * methods including {@link #engineReseed}, {@link #engineSetSeed}, and
+ * {@link #engineNextBytes} (but not {@link #engineGenerateSeed}).
+ * Internal methods like {@link #configure} and {@link #instantiateAlgorithm}
+ * are not synchronized. They will either be called in a constructor or
+ * in another synchronized method.
+ */
+public abstract class AbstractDrbg extends SecureRandomSpi {
+
+    private static final long serialVersionUID = 9L;
+
+    /**
+     * This field is not null if {@code -Djava.security.debug=securerandom} is
+     * specified on the command line. An implementation can print useful
+     * debug info.
+     */
+    protected static final Debug debug = Debug.getInstance(
+            "securerandom", "drbg");
+
+    // Common working status
+
+    private transient boolean instantiated = false;
+
+    /**
+     * Reseed counter of a DRBG instance. A mechanism should increment it
+     * after each random bits generation and reset it in reseed. A mechanism
+     * does <em>not</em> need to compare it to {@link #reseedInterval}.
+     */
+    protected transient int reseedCounter = 0;
+
+    // Mech features. If not same as below, must be redefined in constructor.
+
+    /**
+     * Default strength of a DRBG instance if it is not configured.
+     * 128 is considered secure enough now. A mechanism
+     * can change it in a constructor.
+     *
+     * Remember to sync with "securerandom.drbg.config" in java.security.
+     */
+    protected static final int DEFAULT_STRENGTH = 128;
+
+    /**
+     * Mechanism name, say, {@code HashDRBG}. Must be set in constructor.
+     * This value will be used in {@code toString}.
+     */
+    protected String mechName = "DRBG";
+
+    /**
+     * highest_supported_security_strength of this mechanism for all algorithms
+     * it supports. A mechanism should update the value in its constructor
+     * if the value is not 256.
+     */
+    protected int highestSupportedSecurityStrength = 256;
+
+    /**
+     * Whether prediction resistance is supported. A mechanism should update
+     * the value in its constructor if it is <em>not</em> supported.
+     */
+    protected boolean supportPredictionResistance = true;
+
+    /**
+     * Whether reseed is supported. A mechanism should update
+     * the value in its constructor if it is <em>not</em> supported.
+     */
+    protected boolean supportReseeding = true;
+
+    // Strength features. If not same as below, must be redefined in
+    // chooseAlgorithmAndStrength. Among these, minLength and seedLen have no
+    // default value and must be redefined. If personalization string or
+    // additional input is not supported, set maxPersonalizationStringLength
+    // or maxAdditionalInputLength to -1.
+
+    /**
+     * Minimum entropy input length in bytes for this DRBG instance.
+     * Must be assigned in {@link #chooseAlgorithmAndStrength}.
+     */
+    protected int minLength;
+
+    /**
+     * Maximum entropy input length in bytes for this DRBG instance.
+     * Should be assigned in {@link #chooseAlgorithmAndStrength} if it is not
+     * {@link Integer#MAX_VALUE}.
+     * <p>
+     * In theory this value (and the values below) can be bigger than
+     * {@code Integer.MAX_VALUE} but a Java array can only have an int32 index.
+     */
+    protected int maxLength = Integer.MAX_VALUE;
+
+    /**
+     * Maximum personalization string length in bytes for this DRBG instance.
+     * Should be assigned in {@link #chooseAlgorithmAndStrength} if it is not
+     * {@link Integer#MAX_VALUE}.
+     */
+    protected int maxPersonalizationStringLength = Integer.MAX_VALUE;
+
+    /**
+     * Maximum additional input length in bytes for this DRBG instance.
+     * Should be assigned in {@link #chooseAlgorithmAndStrength} if it is not
+     * {@link Integer#MAX_VALUE}.
+     */
+    protected int maxAdditionalInputLength = Integer.MAX_VALUE;
+
+    /**
+     * max_number_of_bits_per_request in bytes for this DRBG instance.
+     * Should be assigned in {@link #chooseAlgorithmAndStrength} if it is not
+     * {@link Integer#MAX_VALUE}.
+     */
+    protected int maxNumberOfBytesPerRequest = Integer.MAX_VALUE;
+
+    /**
+     * Maximum number of requests between reseeds for this DRBG instance.
+     * Should be assigned in {@link #chooseAlgorithmAndStrength} if it is not
+     * {@link Integer#MAX_VALUE}.
+     */
+    protected int reseedInterval = Integer.MAX_VALUE;
+
+
+    /**
+     * Algorithm used by this instance (SHA-512 or AES-256). Must be assigned
+     * in {@link #chooseAlgorithmAndStrength}. This field is used in
+     * {@link #toString()} and {@link DRBG#algorithmName}.
+     */
+    protected String algorithm;
+
+    // Configurable parameters
+
+    /**
+     * Security strength for this instance. Must be assigned in
+     * {@link #chooseAlgorithmAndStrength}. Should be at least the requested
+     * strength. Might be smaller than the highest strength
+     * {@link #algorithm} supports. Must not be -1.
+     */
+    protected int securityStrength;     // in bits
+
+    /**
+     * Strength requested in {@link DrbgParameters.Instantiation}.
+     * The real strength is based on it. Do not modify it in a mechanism.
+     */
+    protected int requestedInstantiationSecurityStrength = -1;
+
+    /**
+     * The personalization string used by this instance. Set inside
+     * {@link #configure(SecureRandomParameters)} and
+     * can be used in a mechanism. Do not modify it in a mechanism.
+     */
+    protected byte[] personalizationString;
+
+    /**
+     * The prediction resistance flag used by this instance. Set inside
+     * {@link #configure(SecureRandomParameters)}.
+     */
+    private boolean predictionResistanceFlag;
+
+    // Non-standard configurable parameters
+
+    /**
+     * Whether a derivation function is used. Requested in
+     * {@link MoreDrbgParameters}. Only CtrDRBG uses it.
+     * Do not modify it in a mechanism.
+     */
+    protected boolean usedf;
+
+    /**
+     * The nonce for this instance. Set in {@link #instantiateIfNecessary}.
+     * After instantiation, this field is not null. Do not modify it
+     * in a mechanism.
+     */
+    protected transient byte[] nonce;
+
+    /**
+     * Requested nonce in {@link MoreDrbgParameters}. If set to null,
+     * nonce will be chosen by system, and a reinstantiated DRBG will get a
+     * new system-provided nonce.
+     */
+    private byte[] requestedNonce;
+
+    /**
+     * Requested algorithm in {@link MoreDrbgParameters}.
+     * Do not modify it in a mechanism.
+     */
+    protected String requestedAlgorithm;
+
+    /**
+     * The entropy source used by this instance. Set inside
+     * {@link #configure(SecureRandomParameters)}. This field
+     * can be null. {@link #getEntropyInput} will take care of null check.
+     */
+    private transient EntropySource es;
+
+    // Five abstract methods for SP 800-90A DRBG
+
+    /**
+     * Decides what algorithm and strength to use (SHA-256 or AES-256,
+     * 128 or 256). Strength related fields must also be defined or redefined
+     * here. Called in {@link #configure}. A mechanism uses
+     * {@link #requestedAlgorithm},
+     * {@link #requestedInstantiationSecurityStrength}, and
+     * {@link #DEFAULT_STRENGTH} to decide which algorithm and strength to use.
+     * <p>
+     * If {@code requestedAlgorithm} is provided, it will always be used.
+     * If {@code requestedInstantiationSecurityStrength} is also provided,
+     * the algorithm will use the strength (an exception will be thrown if
+     * the strength is not supported), otherwise, the smaller one of
+     * the highest supported strength of the algorithm and the default strength
+     * will be used.
+     * <p>
+     * If {@code requestedAlgorithm} is not provided, an algorithm will be
+     * chosen that supports {@code requestedInstantiationSecurityStrength}
+     * (or {@code DEFAULT_STRENGTH} if there is no request).
+     * <p>
+     * Since every call to {@link #configure} will call this method,
+     * make sure to the calls do not contradict with each other.
+     * <p>
+     * Here are some examples of the algorithm and strength chosen (suppose
+     * {@code DEFAULT_STRENGTH} is 128) for HashDRBG:
+     * <pre>
+     * requested             effective
+     * (SHA-1, -1)           (SHA-1,128)
+     * (SHA-1, 112)          (SHA-1,112)
+     * (SHA-1, 192)          IAE
+     * (SHA-256, -1)         (SHA-256,128)
+     * (SHA-256, 128)        (SHA-256,128)
+     * (SHA-3, -1)           IAE
+     * (null, -1)            (SHA-256,128)
+     * (null, 112)           (SHA-256,112)
+     * (null, 192)           (SHA-256,192)
+     * (null, 256)           (SHA-256,256)
+     * (null, 384)           IAE
+     * </pre>
+     *
+     * @throws IllegalArgumentException if the requested parameters
+     *      can not be supported or contradict with each other.
+     */
+    protected abstract void chooseAlgorithmAndStrength();
+
+    /**
+     * Initiates security engines ({@code MessageDigest}, {@code Mac},
+     * or {@code Cipher}). Must be called in deserialization. Please note
+     * that before instantiation the algorithm might not be available yet.
+     * In this case, just return and this method will be called
+     * automatically at instantiation.
+     */
+    protected abstract void initEngine();
+
+    /**
+     * Instantiates a DRBG. Called automatically before the first
+     * {@code nextBytes} call.
+     * <p>
+     * Note that the other parameters (nonce, strength, ps) are already
+     * stored inside at configuration.
+     *
+     * @param ei the entropy input, its length is already conditioned to be
+     *           between {@link #minLength} and {@link #maxLength}.
+     */
+    protected abstract void instantiateAlgorithm(byte[] ei);
+
+    /**
+     * The generate function.
+     *
+     * @param result fill result here, not null
+     * @param additionalInput additional input, can be null. If not null,
+     *          its length is smaller than {@link #maxAdditionalInputLength}
+     */
+    protected abstract void generateAlgorithm(
+            byte[] result, byte[] additionalInput);
+
+    /**
+     * The reseed function.
+     *
+     * @param ei the entropy input, its length is already conditioned to be
+     *           between {@link #minLength} and {@link #maxLength}.
+     * @param additionalInput additional input, can be null. If not null,
+     *          its length is smaller than {@link #maxAdditionalInputLength}
+     * @throws UnsupportedOperationException if reseed is not supported
+     */
+    protected void reseedAlgorithm(
+            byte[] ei, byte[] additionalInput) {
+        throw new UnsupportedOperationException("No reseed function");
+    }
+
+    // SecureRandomSpi methods taken care of here. All final.
+
+    @Override
+    protected final void engineNextBytes(byte[] result) {
+        engineNextBytes(result, DrbgParameters.nextBytes(
+                -1, predictionResistanceFlag, null));
+    }
+
+    @Override
+    protected final void engineNextBytes(
+            byte[] result, SecureRandomParameters params) {
+
+        Objects.requireNonNull(result);
+
+        if (debug != null) {
+            debug.println(this, "nextBytes");
+        }
+        if (params instanceof DrbgParameters.NextBytes) {
+
+            // 800-90Ar1 9.3: Generate Process.
+
+            DrbgParameters.NextBytes dp = (DrbgParameters.NextBytes) params;
+
+            // Step 2: max_number_of_bits_per_request
+            if (result.length > maxNumberOfBytesPerRequest) {
+                // generateAlgorithm should be called multiple times to fill
+                // up result. Unimplemented since maxNumberOfBytesPerRequest
+                // is now Integer.MAX_VALUE.
+            }
+
+            // Step 3: check requested_security_strength
+            if (dp.getStrength() > securityStrength) {
+                throw new IllegalArgumentException("strength too high: "
+                        + dp.getStrength());
+            }
+
+            // Step 4: check max_additional_input_length
+            byte[] ai = dp.getAdditionalInput();
+            if (ai != null && ai.length > maxAdditionalInputLength) {
+                throw new IllegalArgumentException("ai too long: "
+                        + ai.length);
+            }
+
+            // Step 5: check prediction_resistance_flag
+            boolean pr = dp.getPredictionResistance();
+            if (!predictionResistanceFlag && pr) {
+                throw new IllegalArgumentException("pr not available");
+            }
+
+            instantiateIfNecessary(null);
+
+            // Step 7: Auto reseed
+            if (reseedCounter > reseedInterval || pr) {
+                reseedAlgorithm(getEntropyInput(pr), ai);
+                ai = null;
+            }
+
+            // Step 8, 10: Generate_algorithm
+            // Step 9: Unnecessary. reseedCounter only updated after generation
+            generateAlgorithm(result, ai);
+
+            // Step 11: Return
+        } else {
+            throw new IllegalArgumentException("unknown params type:"
+                    + params.getClass());
+        }
+    }
+
+    @Override
+    public final void engineReseed(SecureRandomParameters params) {
+        if (debug != null) {
+            debug.println(this, "reseed with params");
+        }
+        if (!supportReseeding) {
+            throw new UnsupportedOperationException("Reseed not supported");
+        }
+        if (params == null) {
+            params = DrbgParameters.reseed(predictionResistanceFlag, null);
+        }
+        if (params instanceof DrbgParameters.Reseed) {
+            DrbgParameters.Reseed dp = (DrbgParameters.Reseed) params;
+
+            // 800-90Ar1 9.2: Reseed Process.
+
+            // Step 2: Check prediction_resistance_request
+            boolean pr = dp.getPredictionResistance();
+            if (!predictionResistanceFlag && pr) {
+                throw new IllegalArgumentException("pr not available");
+            }
+
+            // Step 3: Check additional_input length
+            byte[] ai = dp.getAdditionalInput();
+            if (ai != null && ai.length > maxAdditionalInputLength) {
+                throw new IllegalArgumentException("ai too long: "
+                        + ai.length);
+            }
+            instantiateIfNecessary(null);
+
+            // Step 4: Get_entropy_input
+            // Step 5: Check step 4
+            // Step 6-7: Reseed_algorithm
+            reseedAlgorithm(getEntropyInput(pr), ai);
+
+            // Step 8: Return
+        } else {
+            throw new IllegalArgumentException("unknown params type: "
+                    + params.getClass());
+        }
+    }
+
+    /**
+     * Returns the given number of seed bytes. A DRBG always uses
+     * {@link SeedGenerator} to get an array with full-entropy.
+     * <p>
+     * The implementation is identical to SHA1PRNG's
+     * {@link SecureRandom#engineGenerateSeed}.
+     *
+     * @param numBytes the number of seed bytes to generate.
+     * @return the seed bytes.
+     */
+    @Override
+    public final byte[] engineGenerateSeed(int numBytes) {
+        byte[] b = new byte[numBytes];
+        SeedGenerator.generateSeed(b);
+        return b;
+    }
+
+    /**
+     * Reseeds this random object with the given seed. A DRBG always expands
+     * or truncates the input to be between {@link #minLength} and
+     * {@link #maxLength} and uses it to instantiate or reseed itself
+     * (depending on whether the DRBG is instantiated).
+     *
+     * @param input the seed
+     */
+    @Override
+    public final synchronized void engineSetSeed(byte[] input) {
+        if (debug != null) {
+            debug.println(this, "setSeed");
+        }
+        if (input.length < minLength) {
+            input = Arrays.copyOf(input, minLength);
+        } else if (input.length > maxLength) {
+            input = Arrays.copyOf(input, maxLength);
+        }
+        if (!instantiated) {
+            instantiateIfNecessary(input);
+        } else {
+            reseedAlgorithm(input, null);
+        }
+    }
+
+    // get_entropy_input
+
+    private byte[] getEntropyInput(boolean isPr) {
+        // Should the 1st arg be minEntropy or minLength?
+        //
+        // Technically it should be minEntropy, but CtrDRBG
+        // (not using derivation function) is so confusing
+        // (does it need only strength or seedlen of entropy?)
+        // that it's safer to assume minLength. In all other
+        // cases minLength equals to minEntropy.
+        return getEntropyInput(minLength, minLength, maxLength, isPr);
+    }
+
+    private byte[] getEntropyInput(int minEntropy, int minLength,
+                                   int maxLength, boolean pr) {
+        if (debug != null) {
+            debug.println(this, "getEntropy(" + minEntropy + "," + minLength +
+                    "," + maxLength + "," + pr + ")");
+        }
+        EntropySource esNow = es;
+        if (esNow == null) {
+            esNow = pr ? SeederHolder.prseeder : SeederHolder.seeder;
+        }
+        return esNow.getEntropy(minEntropy, minLength, maxLength, pr);
+    }
+
+    // Defaults
+
+    /**
+     * The default {@code EntropySource} determined by system property
+     * "java.security.egd" or security property "securerandom.source".
+     * <p>
+     * This object uses {@link SeedGenerator#generateSeed(byte[])} to
+     * return a byte array containing {@code minLength} bytes. It is
+     * assumed to support prediction resistance and always contains
+     * full-entropy. A trusted application can update this field.
+     */
+    private final static EntropySource defaultES =
+            (minE, minLen, maxLen, pr) -> {
+        byte[] result = new byte[minLen];
+        SeedGenerator.generateSeed(result);
+        return result;
+    };
+
+    private static class SeederHolder {
+
+        /**
+         * Default EntropySource for SecureRandom with prediction resistance,
+         */
+        static final EntropySource prseeder;
+
+        /**
+         * Default EntropySource for SecureRandom without prediction resistance,
+         * which is backed by a DRBG whose EntropySource is {@link #prseeder}.
+         */
+        static final EntropySource seeder;
+
+        static {
+            prseeder = defaultES;
+            // According to SP800-90C section 7, a DRBG without live
+            // entropy (drbg here, with pr being false) can instantiate
+            // another DRBG with weaker strength. So we choose highest
+            // strength we support.
+            HashDrbg first = new HashDrbg(new MoreDrbgParameters(
+                    prseeder, null, "SHA-256", null, false,
+                    DrbgParameters.instantiation(
+                            256, NONE,
+                            SeedGenerator.getSystemEntropy())));
+            seeder = (entropy, minLen, maxLen, pr) -> {
+                if (pr) {
+                    // This SEI does not support pr
+                    throw new IllegalArgumentException("pr not supported");
+                }
+                byte[] result = new byte[minLen];
+                first.engineNextBytes(result);
+                return result;
+            };
+        }
+    }
+
+    // Constructor called by overridden methods, initializer...
+
+    /**
+     * A constructor without argument so that an implementation does not
+     * need to always write {@code super(params)}.
+     */
+    protected AbstractDrbg() {
+        // Nothing
+    }
+
+    /**
+     * A mechanism shall override this constructor to setup {@link #mechName},
+     * {@link #highestSupportedSecurityStrength},
+     * {@link #supportPredictionResistance}, {@link #supportReseeding}
+     * or other features like {@link #DEFAULT_STRENGTH}. Finally it shall
+     * call {@link #configure} on {@code params}.
+     *
+     * @param params the {@link SecureRandomParameters} object.
+     *               This argument can be {@code null}.
+     * @throws IllegalArgumentException if {@code params} is
+     *         inappropriate for this SecureRandom.
+     */
+    protected AbstractDrbg(SecureRandomParameters params) {
+        // Nothing
+    }
+
+    /**
+     * Returns the current configuration as a {@link DrbgParameters.Instantiation}
+     * object.
+     *
+     * @return the curent configuration
+     */
+    @Override
+    protected SecureRandomParameters engineGetParameters() {
+        // Or read from variable.
+        return DrbgParameters.instantiation(
+                securityStrength,
+                predictionResistanceFlag ? PR_AND_RESEED :
+                        (supportReseeding ? RESEED_ONLY : NONE),
+                personalizationString);
+    }
+
+    /**
+     * Configure this DRBG. This method calls
+     * {@link #chooseAlgorithmAndStrength()} and {@link #initEngine()}
+     * but does not do the actual instantiation.
+     *
+     * @param params configuration, if null, default configuration (default
+     *               strength, pr_false, no personalization string) is used.
+     * @throws IllegalArgumentException if {@code params} is
+     *         inappropriate for this SecureRandom.
+     */
+    protected final synchronized void configure(
+            SecureRandomParameters params) {
+        if (debug != null) {
+            debug.println(this, "configure " + this + " with " + params);
+        }
+        if (params == null) {
+            params = DrbgParameters.instantiation(-1, RESEED_ONLY, null);
+        }
+        if (params instanceof MoreDrbgParameters) {
+            MoreDrbgParameters m = (MoreDrbgParameters)params;
+            this.requestedNonce = m.nonce;
+            this.es = m.es;
+            this.requestedAlgorithm = m.algorithm;
+            this.usedf = m.usedf;
+            params = m.config;
+        }
+        if (params != null) {
+            if (params instanceof DrbgParameters.Instantiation) {
+                DrbgParameters.Instantiation inst =
+                        (DrbgParameters.Instantiation) params;
+
+                // 800-90Ar1 9.1: Instantiate Process. Steps 1-5.
+
+                // Step 1: Check requested_instantiation_security_strength
+                if (inst.getStrength() > highestSupportedSecurityStrength) {
+                    throw new IllegalArgumentException("strength too big: "
+                            + inst.getStrength());
+                }
+
+                // Step 2: Check prediction_resistance_flag
+                if (inst.getCapability().supportsPredictionResistance()
+                        && !supportPredictionResistance) {
+                    throw new IllegalArgumentException("pr not supported");
+                }
+
+                // Step 3: Check personalization_string
+                byte[] ps = inst.getPersonalizationString();
+                if (ps != null && ps.length > maxPersonalizationStringLength) {
+                    throw new IllegalArgumentException("ps too long: "
+                            + ps.length);
+                }
+
+                if (inst.getCapability().supportsReseeding()
+                        && !supportReseeding) {
+                    throw new IllegalArgumentException("reseed not supported");
+                }
+                this.personalizationString = ps;
+                this.predictionResistanceFlag =
+                        inst.getCapability().supportsPredictionResistance();
+                this.requestedInstantiationSecurityStrength = inst.getStrength();
+            } else {
+                throw new IllegalArgumentException("unknown params: "
+                        + params.getClass());
+            }
+        }
+
+        // Step 4: Set security_strength
+        chooseAlgorithmAndStrength();
+        instantiated = false;
+
+        // Step 5: no-op.
+
+        if (debug != null) {
+            debug.println(this, "configured " + this);
+        }
+    }
+
+    /**
+     * Instantiate if necessary,
+     *
+     * @param entropy a user-provided entropy, the length is already good.
+     *                If null, will fetch entropy input automatically.
+     */
+    private synchronized void instantiateIfNecessary(byte[] entropy) {
+        if (!instantiated) {
+
+            // 800-90Ar1 9.1: Instantiate Process. Steps 6-12.
+
+            // Step 6: Get_entropy_input
+            // Step 7: check error (getEntropyInput throw no exception now)
+            if (entropy == null) {
+                entropy = getEntropyInput(predictionResistanceFlag);
+            }
+
+            // Step 8. nonce
+            if (requestedNonce != null) {
+                nonce = requestedNonce;
+            } else {
+                nonce = NonceProvider.next();
+            }
+            initEngine();
+
+            // Step 9-11: Instantiate_algorithm
+            instantiateAlgorithm(entropy);
+            instantiated = true;
+
+            // Step 12: Return
+        }
+    }
+
+    // Nonce provider
+
+    private static class NonceProvider {
+
+        // 128 bits of nonce can be used by 256-bit strength DRBG
+        private static final byte[] block = new byte[16];
+
+        private static synchronized byte[] next() {
+            int k = 15;
+            while ((k >= 0) && (++block[k] == 0)) {
+                k--;
+            }
+            return block.clone();
+        }
+    }
+
+    // Misc
+
+    /** A handy method returning hexdump string with no colon or new line.
+     *
+     * @param in input byte array
+     * @return the hexdump string
+     */
+    protected static String hex(byte[] in) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : in) {
+            sb.append(String.format("%02x", b&0xff));
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Returns the smallest standard strength (112, 128, 192, 256) that is
+     * greater or equal to the input.
+     *
+     * @param input the input strength
+     * @return the standard strength
+     */
+    protected static int getStandardStrength(int input) {
+        if (input <= 112) return 112;
+        if (input <= 128) return 128;
+        if (input <= 192) return 192;
+        if (input <= 256) return 256;
+        throw new IllegalArgumentException("input too big: " + input);
+    }
+
+    @Override
+    public String toString() {
+        return mechName + ","  + algorithm
+                + "," + securityStrength + ","
+                + (predictionResistanceFlag ? "pr_and_reseed"
+                        : (supportReseeding ? "reseed_only" : "none"));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/AbstractHashDrbg.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider;
+
+import sun.security.util.HexDumpEncoder;
+
+import java.util.Arrays;
+import java.util.Locale;
+
+public abstract class AbstractHashDrbg extends AbstractDrbg {
+
+    private static final long serialVersionUID = 9L;
+
+    protected int outLen;
+    protected int seedLen;
+
+    private static int alg2strength(String algorithm) {
+        switch (algorithm.toUpperCase(Locale.ROOT)) {
+            case "SHA-1":
+                return 128;
+            case "SHA-224":
+            case "SHA-512/224":
+                return 192;
+            case "SHA-256":
+            case "SHA-512/256":
+            case "SHA-384":
+            case "SHA-512":
+                return 256;
+            default:
+                throw new IllegalArgumentException(algorithm +
+                        " not supported in Hash_DBRG");
+        }
+    }
+
+    protected void chooseAlgorithmAndStrength() {
+        if (requestedAlgorithm != null) {
+            algorithm = requestedAlgorithm.toUpperCase(Locale.ROOT);
+            int supportedStrength = alg2strength(algorithm);
+            if (requestedInstantiationSecurityStrength >= 0) {
+                int tryStrength = getStandardStrength(
+                        requestedInstantiationSecurityStrength);
+                if (tryStrength > supportedStrength) {
+                    throw new IllegalArgumentException(algorithm +
+                            " does not support strength " +
+                            requestedInstantiationSecurityStrength);
+                }
+                this.securityStrength = tryStrength;
+            } else {
+                this.securityStrength = DEFAULT_STRENGTH > supportedStrength ?
+                        supportedStrength : DEFAULT_STRENGTH;
+            }
+        } else {
+            int tryStrength = (requestedInstantiationSecurityStrength < 0) ?
+                    DEFAULT_STRENGTH : requestedInstantiationSecurityStrength;
+            tryStrength = getStandardStrength(tryStrength);
+            // The default algorithm which is enough for all strengths.
+            // Remember to sync with "securerandom.drbg.config" in java.security
+            algorithm = "SHA-256";
+            this.securityStrength = tryStrength;
+        }
+        switch (algorithm.toUpperCase(Locale.ROOT)) {
+            case "SHA-1":
+                this.seedLen = 440 / 8;
+                this.outLen = 160 / 8;
+                break;
+            case "SHA-224":
+            case "SHA-512/224":
+                this.seedLen = 440 / 8;
+                this.outLen = 224 / 8;
+                break;
+            case "SHA-256":
+            case "SHA-512/256":
+                this.seedLen = 440 / 8;
+                this.outLen = 256 / 8;
+                break;
+            case "SHA-384":
+                this.seedLen = 888 / 8;
+                this.outLen = 384 / 8;
+                break;
+            case "SHA-512":
+                this.seedLen = 888 / 8;
+                this.outLen = 512 / 8;
+                break;
+            default:
+                throw new IllegalArgumentException(algorithm +
+                        " not supported in Hash_DBRG");
+        }
+        this.minLength = this.securityStrength / 8;
+    }
+
+    @Override
+    public void instantiateAlgorithm(byte[] entropy) {
+        if (debug != null) {
+            debug.println(this, "instantiate");
+        }
+
+        // 800-90Ar1 10.1.1.2: Hash_DRBG Instantiate Process.
+        // 800-90Ar1 10.1.2.3: Hmac_DRBG Instantiate Process.
+
+        // Step 1: entropy_input || nonce || personalization_string.
+        byte[] seed = Arrays.copyOf(entropy, entropy.length + nonce.length +
+                ((personalizationString == null) ? 0
+                        : personalizationString.length));
+        System.arraycopy(nonce, 0, seed, entropy.length, nonce.length);
+        if (personalizationString != null) {
+            System.arraycopy(personalizationString, 0,
+                    seed, entropy.length + nonce.length,
+                    personalizationString.length);
+        }
+        hashReseedInternal(seed);
+    }
+
+    @Override
+    protected void reseedAlgorithm(
+            byte[] ei,
+            byte[] additionalInput) {
+        if (debug != null) {
+            debug.println(this, "reseedAlgorithm\n" +
+                    new HexDumpEncoder().encodeBuffer(ei) + "\n" +
+                    ((additionalInput == null) ? "" :
+                        new HexDumpEncoder().encodeBuffer(additionalInput)));
+        }
+
+        // 800-90Ar1 10.1.1.3: Hash_DRBG Reseed Process.
+        // 800-90Ar1 10.1.2.4: Hmac_DRBG Reseed Process.
+
+        // Step 1: entropy_input || additional_input.
+        if (additionalInput != null) {
+            ei = Arrays.copyOf(ei, ei.length + additionalInput.length);
+            System.arraycopy(additionalInput, 0, ei,
+                    ei.length - additionalInput.length, additionalInput.length);
+        }
+        hashReseedInternal(ei);
+    }
+
+    protected abstract void hashReseedInternal(byte[] seed);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/CtrDrbg.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,530 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider;
+
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.IOException;
+import java.security.*;
+import java.util.Arrays;
+import java.util.Locale;
+
+public class CtrDrbg extends AbstractDrbg {
+
+    private static final long serialVersionUID = 9L;
+    private static final int AES_LIMIT;
+
+    static {
+        try {
+            AES_LIMIT = Cipher.getMaxAllowedKeyLength("AES");
+        } catch (Exception e) {
+            // should not happen
+            throw new AssertionError("Cannot detect AES", e);
+        }
+    }
+
+    private transient Cipher cipher;
+
+    private String cipherAlg;
+    private String keyAlg;
+
+    private int ctrLen;
+    private int blockLen;
+    private int keyLen;
+    private int seedLen;
+
+    private transient byte[] v;
+    private transient byte[] k;
+
+    public CtrDrbg(SecureRandomParameters params) {
+        mechName = "CTR_DRBG";
+        configure(params);
+    }
+
+    private static int alg2strength(String algorithm) {
+        switch (algorithm.toUpperCase(Locale.ROOT)) {
+            case "TDEA":
+            case "3KEYTDEA":
+            case "3 KEY TDEA":
+            case "DESEDE":
+                return 112;
+            case "AES-128":
+                return 128;
+            case "AES-192":
+                return 192;
+            case "AES-256":
+                return 256;
+            default:
+                throw new IllegalArgumentException(algorithm +
+                        " not supported in CTR_DBRG");
+        }
+    }
+
+    @Override
+    protected void chooseAlgorithmAndStrength() {
+        if (requestedAlgorithm != null) {
+            algorithm = requestedAlgorithm.toUpperCase();
+            int supportedStrength = alg2strength(algorithm);
+            if (requestedInstantiationSecurityStrength >= 0) {
+                int tryStrength = getStandardStrength(
+                        requestedInstantiationSecurityStrength);
+                if (tryStrength > supportedStrength) {
+                    throw new IllegalArgumentException(algorithm +
+                            " does not support strength " +
+                            requestedInstantiationSecurityStrength);
+                }
+                this.securityStrength = tryStrength;
+            } else {
+                this.securityStrength = (DEFAULT_STRENGTH > supportedStrength) ?
+                        supportedStrength : DEFAULT_STRENGTH;
+            }
+        } else {
+            int tryStrength = (requestedInstantiationSecurityStrength < 0) ?
+                    DEFAULT_STRENGTH : requestedInstantiationSecurityStrength;
+            tryStrength = getStandardStrength(tryStrength);
+            // Default algorithm, use AES-128 if AES-256 is not available.
+            // Remember to sync with "securerandom.drbg.config" in java.security
+            if (tryStrength <= 128 && AES_LIMIT < 256) {
+                algorithm = "AES-128";
+            } else if (AES_LIMIT >= 256) {
+                algorithm = "AES-256";
+            } else {
+                throw new IllegalArgumentException("unsupported strength " +
+                        requestedInstantiationSecurityStrength);
+            }
+            this.securityStrength = tryStrength;
+        }
+        switch (algorithm.toUpperCase(Locale.ROOT)) {
+            case "TDEA":
+            case "3KEYTDEA":
+            case "3 KEY TDEA":
+            case "DESEDE":
+                algorithm = "DESede";
+                this.keyAlg = "DESede";
+                this.cipherAlg = "DESede/ECB/NoPadding";
+                this.blockLen = 64 / 8;
+                this.keyLen = 168 / 8;
+                break;
+            case "AES-128":
+            case "AES-192":
+            case "AES-256":
+                this.keyAlg = "AES";
+                this.cipherAlg = "AES/ECB/NoPadding";
+                switch (algorithm) {
+                    case "AES-128":
+                        this.keyLen = 128 / 8;
+                        break;
+                    case "AES-192":
+                        this.keyLen = 192 / 8;
+                        if (AES_LIMIT < 192) {
+                            throw new IllegalArgumentException(algorithm +
+                                " not available (because policy) in CTR_DBRG");
+                        }
+                        break;
+                    case "AES-256":
+                        this.keyLen = 256 / 8;
+                        if (AES_LIMIT < 256) {
+                            throw new IllegalArgumentException(algorithm +
+                                " not available (because policy) in CTR_DBRG");
+                        }
+                        break;
+                    default:
+                        throw new IllegalArgumentException(algorithm +
+                            " not supported in CTR_DBRG");
+                }
+                this.blockLen = 128 / 8;
+                break;
+            default:
+                throw new IllegalArgumentException(algorithm +
+                        " not supported in CTR_DBRG");
+        }
+        this.seedLen = this.blockLen + this.keyLen;
+        this.ctrLen = this.blockLen;    // TODO
+        if (usedf) {
+            this.minLength = this.securityStrength / 8;
+        } else {
+            this.minLength = this.maxLength =
+                    this.maxPersonalizationStringLength =
+                            this.maxAdditionalInputLength = seedLen;
+        }
+    }
+
+    /**
+     * This call, used by the constructors, instantiates the digest.
+     */
+    @Override
+    protected void initEngine() {
+        try {
+            /*
+             * Use the local SUN implementation to avoid native
+             * performance overhead.
+             */
+            cipher = Cipher.getInstance(cipherAlg, "SunJCE");
+        } catch (NoSuchProviderException | NoSuchAlgorithmException
+                | NoSuchPaddingException e) {
+            // Fallback to any available.
+            try {
+                cipher = Cipher.getInstance(cipherAlg);
+            } catch (NoSuchAlgorithmException | NoSuchPaddingException exc) {
+                throw new InternalError(
+                    "internal error: " + cipherAlg + " not available.", exc);
+            }
+        }
+    }
+
+    private void status() {
+        if (debug != null) {
+            debug.println(this, "Key = " + hex(k));
+            debug.println(this, "V   = " + hex(v));
+            debug.println(this, "reseed counter = " + reseedCounter);
+        }
+    }
+
+    // 800-90Ar1 10.2.1.2. CTR_DRBG_Update
+    private void update(byte[] input) {
+        if (input.length != seedLen) {
+            // Should not happen
+            throw new IllegalArgumentException("input length not seedLen: "
+                    + input.length);
+        }
+        try {
+
+            int m = (seedLen + blockLen - 1) / blockLen;
+            byte[] temp = new byte[m * blockLen];
+
+            // Step 1. temp = Null.
+
+            // Step 2. Loop
+            for (int i = 0; i < m; i++) {
+                // Step 2.1. Increment
+                addOne(v, ctrLen);
+                // Step 2.2. Block_Encrypt
+                cipher.init(Cipher.ENCRYPT_MODE, getKey(keyAlg, k));
+                // Step 2.3. Encrypt into right position, no need to cat
+                cipher.doFinal(v, 0, blockLen, temp, i * blockLen);
+            }
+
+            // Step 3. Truncate
+            temp = Arrays.copyOf(temp, seedLen);
+
+            // Step 4: Add
+            for (int i = 0; i < seedLen; i++) {
+                temp[i] ^= input[i];
+            }
+
+            // Step 5: leftmost
+            k = Arrays.copyOf(temp, keyLen);
+
+            // Step 6: rightmost
+            v = Arrays.copyOfRange(temp, seedLen - blockLen, seedLen);
+
+            // Step 7. Return
+        } catch (GeneralSecurityException e) {
+            throw new InternalError(e);
+        }
+    }
+
+    @Override
+    protected void instantiateAlgorithm(byte[] ei) {
+        if (debug != null) {
+            debug.println(this, "instantiate");
+        }
+        byte[] more;
+        if (usedf) {
+            // 800-90Ar1 10.2.1.3.2 Step 1-2. cat bytes
+            if (personalizationString == null) {
+                more = nonce;
+            } else {
+                more = Arrays.copyOf(
+                        nonce, nonce.length + personalizationString.length);
+                System.arraycopy(personalizationString, 0, more, nonce.length,
+                        personalizationString.length);
+            }
+        } else {
+            // 800-90Ar1 10.2.1.3.1
+            // Step 1-2, no need to expand personalizationString, we only XOR
+            // with shorter length
+            more = personalizationString;
+        }
+        reseedAlgorithm(ei, more);
+    }
+
+    private byte[] df(byte[] input) {
+        int l = input.length;
+        int n = seedLen;
+        int slen = 4 + 4 + l + 1;
+        byte[] s = new byte[(slen + blockLen - 1) / blockLen * blockLen];
+        s[0] = (byte)(l >> 24);
+        s[1] = (byte)(l >> 16);
+        s[2] = (byte)(l >> 8);
+        s[3] = (byte)(l);
+        s[4] = (byte)(n >> 24);
+        s[5] = (byte)(n >> 16);
+        s[6] = (byte)(n >> 8);
+        s[7] = (byte)(n);
+        System.arraycopy(input, 0, s, 8, l);
+        s[8+l] = (byte)0x80;
+
+        byte[] k = new byte[keyLen];
+        for (int i = 0; i < k.length; i++) {
+            k[i] = (byte)i;
+        }
+
+        byte[] temp = new byte[seedLen];
+
+        for (int i = 0; i * blockLen < temp.length; i++) {
+            byte[] iv = new byte[blockLen + s.length];
+            iv[0] = (byte)(i >> 24);
+            iv[1] = (byte)(i >> 16);
+            iv[2] = (byte)(i >> 8);
+            iv[3] = (byte)(i);
+            System.arraycopy(s, 0, iv, blockLen, s.length);
+            int tailLen = temp.length - blockLen*i;
+            if (tailLen > blockLen) {
+                tailLen = blockLen;
+            }
+            System.arraycopy(bcc(k, iv), 0, temp, blockLen*i, tailLen);
+        }
+
+        k = Arrays.copyOf(temp, keyLen);
+        byte[] x = Arrays.copyOfRange(temp, keyLen, temp.length);
+
+        for (int i = 0; i * blockLen < seedLen; i++) {
+            try {
+                cipher.init(Cipher.ENCRYPT_MODE, getKey(keyAlg, k));
+                int tailLen = temp.length - blockLen*i;
+                if (tailLen > blockLen) {
+                    tailLen = blockLen;
+                }
+                x = cipher.doFinal(x);
+                System.arraycopy(x, 0, temp, blockLen * i, tailLen);
+            } catch (GeneralSecurityException e) {
+                throw new InternalError(e);
+            }
+        }
+        return temp;
+    }
+
+    private byte[] bcc(byte[] k, byte[] data) {
+        byte[] chain = new byte[blockLen];
+        int n = data.length / blockLen;
+        for (int i = 0; i < n; i++) {
+            byte[] inputBlock = Arrays.copyOfRange(
+                    data, i * blockLen, i * blockLen + blockLen);
+            for (int j = 0; j < blockLen; j++) {
+                inputBlock[j] ^= chain[j];
+            }
+            try {
+                cipher.init(Cipher.ENCRYPT_MODE, getKey(keyAlg, k));
+                chain = cipher.doFinal(inputBlock);
+            } catch (GeneralSecurityException e) {
+                throw new InternalError(e);
+            }
+        }
+        return chain;
+    }
+
+    @Override
+    protected void reseedAlgorithm(
+            byte[] ei,
+            byte[] additionalInput) {
+        if (usedf) {
+            // 800-90Ar1 10.2.1.3.2 Instantiate.
+            // 800-90Ar1 10.2.1.4.2 Reseed.
+
+            // Step 1: cat bytes
+            if (additionalInput != null) {
+                byte[] temp = Arrays.copyOf(
+                        ei, ei.length + additionalInput.length);
+                System.arraycopy(additionalInput, 0, temp, ei.length,
+                        additionalInput.length);
+                ei = temp;
+            }
+            // Step 2. df (seed_material, seedlen).
+            ei = df(ei);
+        } else {
+            // 800-90Ar1 10.2.1.3.1 Instantiate
+            // 800-90Ar1 10.2.1.4.1 Reseed
+            // Step 1-2. Needless
+            // Step 3. seed_material = entropy_input XOR more
+            if (additionalInput != null) {
+                // additionalInput.length <= seedLen
+                for (int i = 0; i < additionalInput.length; i++) {
+                    ei[i] ^= additionalInput[i];
+                }
+            }
+        }
+
+        if (v == null) {
+            // 800-90Ar1 10.2.1.3.2 Instantiate. Step 3-4
+            // 800-90Ar1 10.2.1.3.1 Instantiate. Step 4-5
+            k = new byte[keyLen];
+            v = new byte[blockLen];
+        }
+        //status();
+
+        // 800-90Ar1 10.2.1.3.1 Instantiate. Step 6
+        // 800-90Ar1 10.2.1.3.2 Instantiate. Step 5
+        // 800-90Ar1 10.2.1.4.1 Reseed. Step 4
+        // 800-90Ar1 10.2.1.4.2 Reseed. Step 3
+        update(ei);
+        // 800-90Ar1 10.2.1.3.1 Instantiate. Step 7
+        // 800-90Ar1 10.2.1.3.2 Instantiate. Step 6
+        // 800-90Ar1 10.2.1.4.1 Reseed. Step 5
+        // 800-90Ar1 10.2.1.4.2 Reseed. Step 4
+        reseedCounter = 1;
+        //status();
+
+        // Whatever step. Return
+    }
+
+    /**
+     * Add one to data, only touch the last len bytes.
+     */
+    private static void addOne(byte[] data, int len) {
+        for (int i = 0; i < len; i++) {
+            data[data.length - 1 - i]++;
+            if (data[data.length - 1 - i] != 0) {
+                break;
+            }
+        }
+    }
+
+    @Override
+    public synchronized void generateAlgorithm(
+            byte[] result, byte[] additionalInput) {
+
+        if (debug != null) {
+            debug.println(this, "generateAlgorithm");
+        }
+
+        // 800-90Ar1 10.2.1.5.1 Generate
+        // 800-90Ar1 10.2.1.5.2 Generate
+
+        // Step 1: Check reseed_counter. Will not fail. Already checked in
+        // AbstractDrbg#engineNextBytes.
+
+        if (additionalInput != null) {
+            if (usedf) {
+                // 10.2.1.5.2 Step 2.1
+                additionalInput = df(additionalInput);
+            } else {
+                // 10.2.1.5.1 Step 2.1-2.2
+                additionalInput = Arrays.copyOf(additionalInput, seedLen);
+            }
+            // 10.2.1.5.1 Step 2.3
+            // 10.2.1.5.2 Step 2.2
+            update(additionalInput);
+        } else {
+            // 10.2.1.5.1 Step 2 Else
+            // 10.2.1.5.2 Step 2 Else
+            additionalInput = new byte[seedLen];
+        }
+
+        // Step 3. temp = Null
+        int pos = 0;
+
+        // Step 4. Loop
+        while (pos < result.length) {
+            int tailLen = result.length - pos;
+            // Step 4.1. Increment
+            addOne(v, ctrLen);
+            try {
+                // Step 4.2. Encrypt
+                cipher.init(Cipher.ENCRYPT_MODE, getKey(keyAlg, k));
+                byte[] out = cipher.doFinal(v);
+
+                // Step 4.3 and 5. Cat bytes and leftmost
+                System.arraycopy(out, 0, result, pos,
+                        (tailLen > blockLen) ? blockLen : tailLen);
+            } catch (GeneralSecurityException e) {
+                throw new InternalError(e);
+            }
+            pos += blockLen;
+        }
+
+        // Step 6. Update
+        update(additionalInput);
+
+        // Step 7. reseed_counter++
+        reseedCounter++;
+
+        //status();
+
+        // Step 8. Return
+    }
+
+    private static void des7to8(
+            byte[] key56, int off56, byte[] key64, int off64) {
+        key64[off64 + 0] = (byte)
+                (key56[off56 + 0] & 0xFE); // << 0
+        key64[off64 + 1] = (byte)
+                ((key56[off56 + 0] << 7) | ((key56[off56 + 1] & 0xFF) >>> 1));
+        key64[off64 + 2] = (byte)
+                ((key56[off56 + 1] << 6) | ((key56[off56 + 2] & 0xFF) >>> 2));
+        key64[off64 + 3] = (byte)
+                ((key56[off56 + 2] << 5) | ((key56[off56 + 3] & 0xFF) >>> 3));
+        key64[off64 + 4] = (byte)
+                ((key56[off56 + 3] << 4) | ((key56[off56 + 4] & 0xFF) >>> 4));
+        key64[off64 + 5] = (byte)
+                ((key56[off56 + 4] << 3) | ((key56[off56 + 5] & 0xFF) >>> 5));
+        key64[off64 + 6] = (byte)
+                ((key56[off56 + 5] << 2) | ((key56[off56 + 6] & 0xFF) >>> 6));
+        key64[off64 + 7] = (byte)
+                (key56[off56 + 6] << 1);
+
+        for (int i = 0; i < 8; i++) {
+            // if even # bits, make uneven, XOR with 1 (uneven & 1)
+            // for uneven # bits, make even, XOR with 0 (even & 1)
+            key64[off64 + i] ^= Integer.bitCount(key64[off64 + i] ^ 1) & 1;
+        }
+    }
+
+    private static SecretKey getKey(String keyAlg, byte[] k) {
+        if (keyAlg.equals("DESede")) {
+            byte[] k2 = new byte[24];
+            des7to8(k, 0, k2, 0);
+            des7to8(k, 7, k2, 8);
+            des7to8(k, 14, k2, 16);
+            k = k2;
+        }
+        return new SecretKeySpec(k, keyAlg);
+    }
+
+    private void readObject(java.io.ObjectInputStream s)
+            throws IOException, ClassNotFoundException {
+        s.defaultReadObject ();
+        initEngine();
+    }
+
+    @Override
+    public String toString() {
+        return super.toString() + "/"
+                + (usedf ? "use_df" : "no_df");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/DRBG.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,271 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider;
+
+import java.security.AccessController;
+import java.security.DrbgParameters;
+import java.security.PrivilegedAction;
+import java.security.SecureRandomParameters;
+import java.security.SecureRandomSpi;
+import java.security.Security;
+import java.util.Locale;
+import static java.security.DrbgParameters.Capability.*;
+
+/**
+ * Implement the "SecureRandom.DRBG" algorithm.
+ *
+ * About the default "securerandom.drbg.config" value:
+ *
+ * The default value in java.security is set to "". This is because
+ * the default values of different aspects are dependent (For example,
+ * strength depends on algorithm) and if we write a full string there
+ * it will be difficult to modify one and keep all others legal.
+ *
+ * When changing default values, touch all places including:
+ *
+ * 1. comments of the security property in java.security
+ * 2. Default mech, cap, usedf set in this class
+ * 3. Default algorithm set in final implementation of each mech
+ * 4. Default strength set in AbstractDrbg, but the effective
+ *    value can be smaller if an algorithm does not support it.
+ *
+ * The default value is also mentioned in the @implNote part of
+ * {@link DrbgParameters} class.
+ */
+public final class DRBG extends SecureRandomSpi {
+
+    private static final String PROP_NAME = "securerandom.drbg.config";
+
+    private static final long serialVersionUID = 9L;
+
+    private final AbstractDrbg impl;
+
+    private final String mechName;
+
+    private final String algorithmName;
+
+    public DRBG(SecureRandomParameters params) {
+
+        // All parameters at unset status (null or -1).
+
+        // Configurable with the "securerandom.drbg.config" security property
+        String mech = null;
+        Boolean usedf = null;
+        String algorithm = null;
+
+        // Default instantiate parameters also configurable with
+        // "securerandom.drbg.config", and can be changed with params
+        // in getInstance("drbg", params)
+        int strength = -1;
+        DrbgParameters.Capability cap = null;
+        byte[] ps = null;
+
+        // Not configurable with public interfaces, but is a part of
+        // MoreDrbgParameters
+        EntropySource es = null;
+        byte[] nonce = null;
+
+        // Can be configured with a security property
+
+        String config = AccessController.doPrivileged((PrivilegedAction<String>)
+                    () -> Security.getProperty(PROP_NAME));
+
+        if (config != null && !config.isEmpty()) {
+            for (String part : config.split(",")) {
+                part = part.trim();
+                switch (part.toLowerCase(Locale.ROOT)) {
+                    case "":
+                        throw new IllegalArgumentException(
+                                "aspect in " + PROP_NAME + " cannot be empty");
+                    case "pr_and_reseed":
+                        checkTwice(cap != null, "capability");
+                        cap = PR_AND_RESEED;
+                        break;
+                    case "reseed_only":
+                        checkTwice(cap != null, "capability");
+                        cap = RESEED_ONLY;
+                        break;
+                    case "none":
+                        checkTwice(cap != null, "capability");
+                        cap = NONE;
+                        break;
+                    case "hash_drbg":
+                    case "hmac_drbg":
+                    case "ctr_drbg":
+                        checkTwice(mech != null, "mechanism name");
+                        mech = part;
+                        break;
+                    case "no_df":
+                        checkTwice(usedf != null, "usedf flag");
+                        usedf = false;
+                        break;
+                    case "use_df":
+                        checkTwice(usedf != null, "usedf flag");
+                        usedf = true;
+                        break;
+                    default:
+                        // For all other parts of the property, it is
+                        // either an algorithm name or a strength
+                        try {
+                            int tmp = Integer.parseInt(part);
+                            if (tmp < 0) {
+                                throw new IllegalArgumentException(
+                                        "strength in " + PROP_NAME +
+                                                " cannot be negative: " + part);
+                            }
+                            checkTwice(strength >= 0, "strength");
+                            strength = tmp;
+                        } catch (NumberFormatException e) {
+                            checkTwice(algorithm != null, "algorithm name");
+                            algorithm = part;
+                        }
+                }
+            }
+        }
+
+        // Can be updated by params
+
+        if (params != null) {
+            // MoreDrbgParameters is used for testing.
+            if (params instanceof MoreDrbgParameters) {
+                MoreDrbgParameters m = (MoreDrbgParameters)params;
+                params = m.config;
+
+                // No need to check null for es and nonce, they are still null
+                es = m.es;
+                nonce = m.nonce;
+
+                if (m.mech != null) {
+                    mech = m.mech;
+                }
+                if (m.algorithm != null) {
+                    algorithm = m.algorithm;
+                }
+                usedf = m.usedf;
+            }
+            if (params instanceof DrbgParameters.Instantiation) {
+                DrbgParameters.Instantiation dp =
+                        (DrbgParameters.Instantiation) params;
+
+                // ps is still null by now
+                ps = dp.getPersonalizationString();
+
+                int tmp = dp.getStrength();
+                if (tmp != -1) {
+                    strength = tmp;
+                }
+                cap = dp.getCapability();
+            } else {
+                throw new IllegalArgumentException("Unsupported params: "
+                        + params.getClass());
+            }
+        }
+
+        // Hardcoded defaults.
+        // Remember to sync with "securerandom.drbg.config" in java.security.
+
+        if (cap == null) {
+            cap = NONE;
+        }
+        if (mech == null) {
+            mech = "Hash_DRBG";
+        }
+        if (usedf == null) {
+            usedf = true;
+        }
+
+        MoreDrbgParameters m = new MoreDrbgParameters(
+                es, mech, algorithm, nonce, usedf,
+                DrbgParameters.instantiation(strength, cap, ps));
+
+        switch (mech.toLowerCase(Locale.ROOT)) {
+            case "hash_drbg":
+                impl = new HashDrbg(m);
+                break;
+            case "hmac_drbg":
+                impl = new HmacDrbg(m);
+                break;
+            case "ctr_drbg":
+                impl = new CtrDrbg(m);
+                break;
+            default:
+                throw new IllegalArgumentException("Unsupported mech: " + mech);
+        }
+
+        mechName = mech;
+        algorithmName = impl.algorithm;
+    }
+
+    @Override
+    protected void engineSetSeed(byte[] seed) {
+        impl.engineSetSeed(seed);
+    }
+
+    @Override
+    protected void engineNextBytes(byte[] bytes) {
+        impl.engineNextBytes(bytes);
+    }
+
+    @Override
+    protected byte[] engineGenerateSeed(int numBytes) {
+        return impl.engineGenerateSeed(numBytes);
+    }
+
+    @Override
+    protected void engineNextBytes(
+            byte[] bytes, SecureRandomParameters params) {
+        impl.engineNextBytes(bytes, params);
+    }
+
+    @Override
+    protected void engineReseed(SecureRandomParameters params) {
+        impl.engineReseed(params);
+    }
+
+    @Override
+    protected SecureRandomParameters engineGetParameters() {
+        return impl.engineGetParameters();
+    }
+
+    @Override
+    public String toString() {
+        return impl.toString();
+    }
+
+    /**
+     * Ensures an aspect is not set more than once.
+     *
+     * @param flag true if set more than once
+     * @param name the name of aspect shown in IAE
+     * @throws IllegalArgumentException if it happens
+     */
+    private static void checkTwice(boolean flag, String name) {
+        if (flag) {
+            throw new IllegalArgumentException(name
+                    + " cannot be provided more than once in " + PROP_NAME);
+        }
+    }
+}
--- a/jdk/src/java.base/share/classes/sun/security/provider/DSAKeyFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/DSAKeyFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -70,7 +70,7 @@
          * By default this is false.
          * This incompatibility was introduced by 4532506.
          */
-        String prop = GetPropertyAction.getProperty(SERIAL_PROP);
+        String prop = GetPropertyAction.privilegedGetProperty(SERIAL_PROP);
         SERIAL_INTEROP = "true".equalsIgnoreCase(prop);
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/EntropySource.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider;
+
+/**
+ * An interface of a source of entropy input.
+ *
+ * @since 9
+ */
+public interface EntropySource {
+    /**
+     * Returns a byte array containing entropy.
+     * <p>
+     * This maps to the {@code Get_entropy_input} function defined in
+     * Section 9 of NIST SP 800-90Ar1.
+     *
+     * @param minEntropy minimum entropy required, in bytes
+     * @param minLength minimum length of output, in bytes
+     * @param maxLength maximum length of output, in bytes
+     * @param pr whether prediction resistance is required
+     * @return the byte array containing entropy
+     */
+    byte[] getEntropy(int minEntropy, int minLength, int maxLength, boolean pr);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/HashDrbg.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,276 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.DigestException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandomParameters;
+import java.util.Arrays;
+
+public class HashDrbg extends AbstractHashDrbg {
+
+    private static final long serialVersionUID = 9L;
+
+    private static final byte[] ZERO = new byte[1];
+    private static final byte[] ONE = new byte[]{1};
+
+    private transient MessageDigest digest;
+
+    private transient byte[] v;
+    private transient byte[] c;
+
+    public HashDrbg(SecureRandomParameters params) {
+        mechName = "Hash_DRBG";
+        configure(params);
+    }
+
+    /**
+     * This call, used by the constructors, instantiates the digest.
+     */
+    @Override
+    protected void initEngine() {
+        try {
+            /*
+             * Use the local SUN implementation to avoid native
+             * performance overhead.
+             */
+            digest = MessageDigest.getInstance(algorithm, "SUN");
+        } catch (NoSuchProviderException | NoSuchAlgorithmException e) {
+            // Fallback to any available.
+            try {
+                digest = MessageDigest.getInstance(algorithm);
+            } catch (NoSuchAlgorithmException exc) {
+                throw new InternalError(
+                    "internal error: " + algorithm + " not available.", exc);
+            }
+        }
+    }
+
+    private byte[] hashDf(int requested, byte[]... inputs) {
+        return hashDf(digest, outLen, requested, inputs);
+    }
+
+    /**
+     * A hash-based derivation function defined in NIST SP 800-90Ar1 10.3.1.
+     * The function is used inside Hash_DRBG, and can also be used as an
+     * approved conditioning function as described in 800-90B 6.4.2.2.
+     *
+     * @param digest a {@code MessageDigest} object in reset state
+     * @param outLen {@link MessageDigest#getDigestLength} of {@code digest}
+     * @param requested requested output length, in bytes
+     * @param inputs input data
+     * @return the condensed/expanded output
+     */
+    public static byte[] hashDf(MessageDigest digest, int outLen,
+                                int requested, byte[]... inputs) {
+        int len = (requested + outLen - 1) / outLen;
+        byte[] temp = new byte[len * outLen];
+        int counter = 1;
+
+        for (int i=0; i<len; i++) {
+            digest.update((byte) counter);
+            digest.update((byte)(requested >> 21)); // requested*8 as int32
+            digest.update((byte)(requested >> 13));
+            digest.update((byte)(requested >> 5));
+            digest.update((byte)(requested << 3));
+            for (byte[] input : inputs) {
+                digest.update(input);
+            }
+            try {
+                digest.digest(temp, i * outLen, outLen);
+            } catch (DigestException e) {
+                throw new AssertionError("will not happen", e);
+            }
+            counter++;
+        }
+        return temp.length == requested? temp: Arrays.copyOf(temp, requested);
+    }
+
+    // This method is used by both instantiation and reseeding.
+    @Override
+    protected final void hashReseedInternal(byte[] input) {
+
+        // 800-90Ar1 10.1.1.2: Instantiate Process.
+        // 800-90Ar1 10.1.1.3: Reseed Process.
+        byte[] seed;
+
+        // Step 2: seed = Hash_df (seed_material, seedlen).
+        if (v != null) {
+            // Step 1 of 10.1.1.3: Prepend 0x01 || V
+            seed = hashDf(seedLen, ONE, v, input);
+        } else {
+            seed = hashDf(seedLen, input);
+        }
+
+        // Step 3. V = seed.
+        v = seed;
+
+        // Step 4. C = Hash_df ((0x00 || V), seedlen).
+        c = hashDf(seedLen, ZERO, v);
+
+        // Step 5. reseed_counter = 1.
+        reseedCounter = 1;
+
+        //status();
+
+        // Step 6: Return
+    }
+
+    private void status() {
+        if (debug != null) {
+            debug.println(this, "V = " + hex(v));
+            debug.println(this, "C = " + hex(c));
+            debug.println(this, "reseed counter = " + reseedCounter);
+        }
+    }
+
+    /**
+     * Adds byte arrays into an existing one.
+     *
+     * @param out existing array
+     * @param data more arrays, can be of different length
+     */
+    private static void addBytes(byte[] out, int len, byte[]... data) {
+        for (byte[] d: data) {
+            int dlen = d.length;
+            int carry = 0;
+            for (int i = 0; i < len; i++) {
+                int sum = (out[len - i - 1] & 0xff) + carry;
+                if (i < dlen) {
+                    sum += (d[dlen - i - 1] & 0xff);
+                }
+                out[len - i - 1] = (byte) sum;
+                carry = sum >> 8;
+                if (i >= dlen - 1 && carry == 0) break;
+            }
+        }
+    }
+
+    /**
+     * Generates a user-specified number of random bytes.
+     *
+     * @param result the array to be filled in with random bytes.
+     */
+    @Override
+    public final synchronized void generateAlgorithm(
+            byte[] result, byte[] additionalInput) {
+
+        if (debug != null) {
+            debug.println(this, "generateAlgorithm");
+        }
+
+        // 800-90Ar1 10.1.1.4: Hash_DRBG_Generate Process
+
+        // Step 1: Check reseed_counter. Will not fail. Already checked in
+        // AbstractDrbg#engineNextBytes.
+
+        // Step 2: additional_input
+        if (additionalInput != null) {
+            digest.update((byte)2);
+            digest.update(v);
+            digest.update(additionalInput);
+            addBytes(v, seedLen, digest.digest());
+        }
+
+        // Step 3. Hashgen (requested_number_of_bits, V).
+        hashGen(result, result.length, v);
+
+        // Step 4. H = Hash (0x03 || V).
+        digest.update((byte)3);
+        digest.update(v);
+        byte[] h = digest.digest();
+
+        // Step 5. V = (V + H + C + reseed_counter) mod 2seedlen.
+        byte[] rcBytes;
+        if (reseedCounter < 256) {
+            rcBytes = new byte[]{(byte)reseedCounter};
+        } else {
+            rcBytes = BigInteger.valueOf(reseedCounter).toByteArray();
+        }
+        addBytes(v, seedLen, h, c, rcBytes);
+
+        // Step 6. reseed_counter = reseed_counter + 1.
+        reseedCounter++;
+
+        //status();
+
+        // Step 7: Return.
+    }
+
+    // 800-90Ar1 10.1.1.4: Hashgen
+    private void hashGen(byte[] output, int len, byte[] v) {
+
+        // Step 1. m
+        int m = (len + outLen - 1) / outLen;
+
+        // Step 2. data = V
+        byte[] data = v;
+
+        // Step 3: W is output not filled
+
+        // Step 4: For i = 1 to m
+        for (int i = 0; i < m; i++) {
+            int tailLen = len - i * outLen;
+            if (tailLen < outLen) {
+                // Step 4.1 w = Hash (data).
+                // Step 4.2 W = W || w.
+                System.arraycopy(digest.digest(data), 0, output, i * outLen,
+                        tailLen);
+            } else {
+                try {
+                    // Step 4.1 w = Hash (data).
+                    digest.update(data);
+                    // Step 4.2 digest into right position, no need to cat
+                    digest.digest(output, i*outLen, outLen);
+                } catch (DigestException e) {
+                    throw new AssertionError("will not happen", e);
+                }
+            }
+            // Unless this is the last around, we will need to increment data.
+            // but we cannot change v, so a copy is made.
+            if (i != m - 1) {
+                if (data == v) {
+                    data = Arrays.copyOf(v, v.length);
+                }
+                // Step 4.3 data = (data + 1) mod 2^seedlen.
+                addBytes(data, seedLen, ONE);
+            }
+        }
+
+        // Step 5: No need to truncate
+        // Step 6: Return
+    }
+
+    private void readObject(java.io.ObjectInputStream s)
+            throws IOException, ClassNotFoundException {
+        s.defaultReadObject ();
+        initEngine();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/HmacDrbg.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandomParameters;
+import java.util.Arrays;
+
+public class HmacDrbg extends AbstractHashDrbg {
+
+    private static final long serialVersionUID = 9L;
+
+    private transient Mac mac;
+
+    private String macAlg;
+
+    private transient byte[] v;
+    private transient byte[] k;
+
+    public HmacDrbg(SecureRandomParameters params) {
+        mechName = "HMAC_DRBG";
+        configure(params);
+    }
+
+    private void status() {
+        if (debug != null) {
+            debug.println(this, "V = " + hex(v));
+            debug.println(this, "Key = " + hex(k));
+            debug.println(this, "reseed counter = " + reseedCounter);
+        }
+    }
+
+    // 800-90Ar1 10.1.2.2: HMAC_DRBG Update Process
+    private void update(byte[]... inputs) {
+        try {
+            // Step 1. K = HMAC (K, V || 0x00 || provided_data).
+            mac.init(new SecretKeySpec(k, macAlg));
+            mac.update(v);
+            mac.update((byte) 0);
+            for (byte[] input: inputs) {
+                mac.update(input);
+            }
+            k = mac.doFinal();
+
+            // Step 2. V = HMAC (K, V).
+            mac.init(new SecretKeySpec(k, macAlg));
+            v = mac.doFinal(v);
+
+            if (inputs.length != 0) {
+                // Step 4. K = HMAC (K, V || 0x01 || provided_data).
+                mac.update(v);
+                mac.update((byte) 1);
+                for (byte[] input: inputs) {
+                    mac.update(input);
+                }
+                k = mac.doFinal();
+
+                // Step 5. V=HMAC(K,V).
+                mac.init(new SecretKeySpec(k, macAlg));
+                v = mac.doFinal(v);
+            } // else Step 3
+
+            // Step 6. Return
+        } catch (InvalidKeyException e) {
+            throw new InternalError(e);
+        }
+    }
+
+    /**
+     * This call, used by the constructors, instantiates the digest.
+     */
+    @Override
+    protected void initEngine() {
+        macAlg = "HmacSHA" + algorithm.substring(4);
+        try {
+            mac = Mac.getInstance(macAlg, "SunJCE");
+        } catch (NoSuchProviderException | NoSuchAlgorithmException e) {
+            // Fallback to any available.
+            try {
+                mac = Mac.getInstance(macAlg);
+            } catch (NoSuchAlgorithmException exc) {
+                throw new InternalError(
+                    "internal error: " + macAlg + " not available.", exc);
+            }
+        }
+    }
+
+    // This method is used by both instantiation and reseeding.
+    @Override
+    protected final void hashReseedInternal(byte[] input) {
+
+        // 800-90Ar1 10.1.2.3: Instantiate Process.
+        // 800-90Ar1 10.1.2.4: Reseed Process.
+        if (v == null) {
+            k = new byte[outLen];
+            v = new byte[outLen];
+            Arrays.fill(v, (byte) 1);
+        }
+
+        // Step 2: HMAC_DRBG_Update
+        update(input);
+
+        // Step 3: reseed_counter = 1.
+        reseedCounter = 1;
+        //status();
+
+        // Step 4: Return
+    }
+
+    /**
+     * Generates a user-specified number of random bytes.
+     *
+     * @param result the array to be filled in with random bytes.
+     */
+    @Override
+    public synchronized void generateAlgorithm(
+            byte[] result, byte[] additionalInput) {
+
+        if (debug != null) {
+            debug.println(this, "generateAlgorithm");
+        }
+
+        // 800-90Ar1 10.1.2.5: HMAC_DRBG_Generate Process
+
+        // Step 1: Check reseed_counter. Will not fail. Already checked in
+        // AbstractDrbg#engineNextBytes.
+
+        // Step 2. HMAC_DRBG_Update
+        if (additionalInput != null) {
+            update(additionalInput);
+        }
+
+        // Step 3. temp = Null.
+        int pos = 0;
+
+        // Step 4. Loop
+        while (pos < result.length) {
+            int tailLen = result.length - pos;
+
+            // Step 4.1 V = HMAC (Key, V).
+            try {
+                mac.init(new SecretKeySpec(k, macAlg));
+            } catch (InvalidKeyException e) {
+                throw new InternalError(e);
+            }
+            v = mac.doFinal(v);
+            // Step 4.2 temp = temp || V.
+            System.arraycopy(v, 0, result, pos,
+                    tailLen > outLen ? outLen : tailLen);
+            pos += outLen;
+        }
+
+        // Step 5: No need to truncate
+
+        // Step 6. HMAC_DRBG_Update (additional_input, Key, V).
+        if (additionalInput != null) {
+            update(additionalInput);
+        } else {
+            update();
+        }
+
+        // Step 7. reseed_counter = reseed_counter + 1.
+        reseedCounter++;
+
+        //status();
+
+        // Step 8. Return
+    }
+
+    private void readObject(java.io.ObjectInputStream s)
+            throws IOException, ClassNotFoundException {
+        s.defaultReadObject ();
+        initEngine();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/MoreDrbgParameters.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider;
+
+import java.security.DrbgParameters;
+import java.security.SecureRandomParameters;
+
+/**
+ * Extra non-standard parameters that can be used by DRBGs.
+ */
+public class MoreDrbgParameters implements SecureRandomParameters {
+
+    final String mech;
+    final String algorithm;
+    final EntropySource es;
+    final byte[] nonce;
+    final boolean usedf;
+    final DrbgParameters.Instantiation config;
+
+    /**
+     * Creates a new {@code MoreDrbgParameters} object.
+     *
+     * @param es the {@link EntropySource} to use. If set to {@code null},
+     *           a default entropy source will be used.
+     * @param mech mech name. If set to {@code null}, the one in
+     *             securerandom.drbg.config is used. This argument is ignored
+     *             when passing to HashDrbg/HmacDrbg/CtrDrbg.
+     * @param algorithm the requested algorithm to use. If set to {@code null},
+     *                  the algorithm will be decided by strength.
+     * @param nonce the nonce to use. If set to {@code null},
+     *              a nonce will be assigned.
+     * @param usedf whether a derivation function should be used
+     * @param config a {@link DrbgParameters.Instantiation} object
+     */
+    public MoreDrbgParameters(EntropySource es, String mech,
+                              String algorithm, byte[] nonce, boolean usedf,
+                              DrbgParameters.Instantiation config) {
+        this.mech = mech;
+        this.algorithm = algorithm;
+        this.es = es;
+        this.nonce = nonce;
+        this.usedf = usedf;
+        this.config = config;
+    }
+
+    @Override
+    public String toString() {
+        return mech + "," + algorithm + "," + usedf + "," + config;
+    }
+}
--- a/jdk/src/java.base/share/classes/sun/security/provider/SHA5.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SHA5.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2016, 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
@@ -25,9 +25,7 @@
 
 package sun.security.provider;
 
-import java.security.*;
 import java.util.Objects;
-import java.math.BigInteger;
 
 import jdk.internal.HotSpotIntrinsicCandidate;
 import static sun.security.provider.ByteArrayAccess.*;
@@ -118,7 +116,14 @@
         i2bBig4((int)bitsProcessed, buffer, 124);
         implCompress(buffer, 0);
 
-        l2bBig(state, 0, out, ofs, engineGetDigestLength());
+        int len = engineGetDigestLength();
+        if (len == 28) {
+            // Special case for SHA-512/224
+            l2bBig(state, 0, out, ofs, 24);
+            i2bBig4((int)(state[3] >> 32), out, ofs + 24);
+        } else {
+            l2bBig(state, 0, out, ofs, len);
+        }
     }
 
     /**
@@ -306,4 +311,31 @@
             super("SHA-384", 48, INITIAL_HASHES);
         }
     }
+    public static final class SHA512_224 extends SHA5 {
+
+        private static final long[] INITIAL_HASHES = {
+                0x8C3D37C819544DA2L, 0x73E1996689DCD4D6L,
+                0x1DFAB7AE32FF9C82L, 0x679DD514582F9FCFL,
+                0x0F6D2B697BD44DA8L, 0x77E36F7304C48942L,
+                0x3F9D85A86A1D36C8L, 0x1112E6AD91D692A1L
+        };
+
+        public SHA512_224() {
+            super("SHA-512/224", 28, INITIAL_HASHES);
+        }
+    }
+
+    public static final class SHA512_256 extends SHA5 {
+
+        private static final long[] INITIAL_HASHES = {
+                0x22312194FC2BF72CL, 0x9F555FA3C84C64C2L,
+                0x2393B86B6F53B151L, 0x963877195940EABDL,
+                0x96283EE2A88EFFE3L, 0xBE5E1E2553863992L,
+                0x2B0199FC2C85B8AAL, 0x0EB72DDC81C52CA2L
+        };
+
+        public SHA512_256() {
+            super("SHA-512/256", 32, INITIAL_HASHES);
+        }
+    }
 }
--- a/jdk/src/java.base/share/classes/sun/security/provider/SunEntries.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SunEntries.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2016, 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
@@ -97,6 +97,9 @@
             map.put("SecureRandom.NativePRNG",
                 "sun.security.provider.NativePRNG");
         }
+
+        map.put("SecureRandom.DRBG", "sun.security.provider.DRBG");
+
         map.put("SecureRandom.SHA1PRNG",
              "sun.security.provider.SecureRandom");
         if (nativeAvailable && !useNativePRNG) {
@@ -199,6 +202,14 @@
         map.put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.3", "SHA-512");
         map.put("Alg.Alias.MessageDigest.OID.2.16.840.1.101.3.4.2.3",
                 "SHA-512");
+        map.put("MessageDigest.SHA-512/224", "sun.security.provider.SHA5$SHA512_224");
+        map.put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.5", "SHA-512/224");
+        map.put("Alg.Alias.MessageDigest.OID.2.16.840.1.101.3.4.2.5",
+                "SHA-512/224");
+        map.put("MessageDigest.SHA-512/256", "sun.security.provider.SHA5$SHA512_256");
+        map.put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.6", "SHA-512/256");
+        map.put("Alg.Alias.MessageDigest.OID.2.16.840.1.101.3.4.2.6",
+                "SHA-512/256");
 
         /*
          * Algorithm Parameter Generator engines
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Wed Jul 05 21:40:37 2017 +0200
@@ -43,7 +43,6 @@
 
 import static sun.security.provider.certpath.OCSP.*;
 import static sun.security.provider.certpath.PKIX.*;
-import sun.security.action.GetPropertyAction;
 import sun.security.x509.*;
 import static sun.security.x509.PKIXExtensions.*;
 import sun.security.util.Debug;
--- a/jdk/src/java.base/share/classes/sun/security/rsa/RSAKeyFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/rsa/RSAKeyFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -84,7 +84,7 @@
     public static final int MAX_RESTRICTED_EXPLEN = 64;
 
     private static final boolean restrictExpLen =
-        "true".equalsIgnoreCase(GetPropertyAction.getProperty(
+        "true".equalsIgnoreCase(GetPropertyAction.privilegedGetProperty(
                 "sun.security.rsa.restrictRSAExponent", "true"));
 
     // instance used for static translateKey();
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java	Wed Jul 05 21:40:37 2017 +0200
@@ -933,10 +933,8 @@
                         ECParameterSpec params =
                             ((ECPublicKey)publicKey).getParams();
                         int index =
-                            SupportedEllipticCurvesExtension.getCurveIndex(
-                                params);
-                        if (!SupportedEllipticCurvesExtension.isSupported(
-                                index)) {
+                            EllipticCurvesExtension.getCurveIndex(params);
+                        if (!EllipticCurvesExtension.isSupported(index)) {
                             publicKey = null;
                         }
                     }
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ClientKeyExchangeService.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ClientKeyExchangeService.java	Wed Jul 05 21:40:37 2017 +0200
@@ -50,7 +50,7 @@
                 providers = new HashMap<>();
 
         static {
-            String path = GetPropertyAction.getProperty("java.home");
+            String path = GetPropertyAction.privilegedGetProperty("java.home");
             ServiceLoader<ClientKeyExchangeService> sc =
                     AccessController.doPrivileged(
                             (PrivilegedAction<ServiceLoader<ClientKeyExchangeService>>)
--- a/jdk/src/java.base/share/classes/sun/security/ssl/Debug.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/Debug.java	Wed Jul 05 21:40:37 2017 +0200
@@ -45,7 +45,7 @@
     private static String args;
 
     static {
-        args = GetPropertyAction.getProperty("javax.net.debug", "");
+        args = GetPropertyAction.privilegedGetProperty("javax.net.debug", "");
         args = args.toLowerCase(Locale.ENGLISH);
         if (args.equals("help")) {
             Help();
@@ -178,11 +178,11 @@
     /**
      * Return the value of the boolean System property propName.
      *
-     * Note use of doPrivileged(). Do make accessible to applications.
+     * Note use of privileged action. Do NOT make accessible to applications.
      */
     static boolean getBooleanProperty(String propName, boolean defaultValue) {
         // if set, require value of either true or false
-        String b = GetPropertyAction.getProperty(propName);
+        String b = GetPropertyAction.privilegedGetProperty(propName);
         if (b == null) {
             return defaultValue;
         } else if (b.equalsIgnoreCase("false")) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/EllipticCurvesExtension.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2006, 2016, 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 sun.security.ssl;
+
+import java.io.IOException;
+import java.security.spec.ECParameterSpec;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.net.ssl.SSLProtocolException;
+
+final class EllipticCurvesExtension extends HelloExtension {
+
+    // the extension value to send in the ClientHello message
+    static final EllipticCurvesExtension DEFAULT;
+
+    private static final boolean fips;
+
+    static {
+        int[] ids;
+        fips = SunJSSE.isFIPS();
+        if (fips == false) {
+            ids = new int[] {
+                // NIST curves first
+                // prefer NIST P-256, rest in order of increasing key length
+                23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14,
+                // non-NIST curves
+                15, 16, 17, 2, 18, 4, 5, 20, 8, 22,
+            };
+        } else {
+            ids = new int[] {
+                // same as above, but allow only NIST curves in FIPS mode
+                23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14,
+            };
+        }
+        DEFAULT = new EllipticCurvesExtension(ids);
+    }
+
+    private final int[] curveIds;
+
+    private EllipticCurvesExtension(int[] curveIds) {
+        super(ExtensionType.EXT_ELLIPTIC_CURVES);
+        this.curveIds = curveIds;
+    }
+
+    EllipticCurvesExtension(HandshakeInStream s, int len)
+            throws IOException {
+        super(ExtensionType.EXT_ELLIPTIC_CURVES);
+        int k = s.getInt16();
+        if (((len & 1) != 0) || (k + 2 != len)) {
+            throw new SSLProtocolException("Invalid " + type + " extension");
+        }
+        curveIds = new int[k >> 1];
+        for (int i = 0; i < curveIds.length; i++) {
+            curveIds[i] = s.getInt16();
+        }
+    }
+
+    boolean contains(int index) {
+        for (int curveId : curveIds) {
+            if (index == curveId) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // Return a reference to the internal curveIds array.
+    // The caller must NOT modify the contents.
+    int[] curveIds() {
+        return curveIds;
+    }
+
+    @Override
+    int length() {
+        return 6 + (curveIds.length << 1);
+    }
+
+    @Override
+    void send(HandshakeOutStream s) throws IOException {
+        s.putInt16(type.id);
+        int k = curveIds.length << 1;
+        s.putInt16(k + 2);
+        s.putInt16(k);
+        for (int curveId : curveIds) {
+            s.putInt16(curveId);
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Extension " + type + ", curve names: {");
+        boolean first = true;
+        for (int curveId : curveIds) {
+            if (first) {
+                first = false;
+            } else {
+                sb.append(", ");
+            }
+            // first check if it is a known named curve, then try other cases.
+            String oid = getCurveOid(curveId);
+            if (oid != null) {
+                ECParameterSpec spec = JsseJce.getECParameterSpec(oid);
+                // this toString() output will look nice for the current
+                // implementation of the ECParameterSpec class in the Sun
+                // provider, but may not look good for other implementations.
+                if (spec != null) {
+                    sb.append(spec.toString().split(" ")[0]);
+                } else {
+                    sb.append(oid);
+                }
+            } else if (curveId == ARBITRARY_PRIME) {
+                sb.append("arbitrary_explicit_prime_curves");
+            } else if (curveId == ARBITRARY_CHAR2) {
+                sb.append("arbitrary_explicit_char2_curves");
+            } else {
+                sb.append("unknown curve " + curveId);
+            }
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+
+    // Test whether we support the curve with the given index.
+    static boolean isSupported(int index) {
+        if ((index <= 0) || (index >= NAMED_CURVE_OID_TABLE.length)) {
+            return false;
+        }
+        if (fips == false) {
+            // in non-FIPS mode, we support all valid indices
+            return true;
+        }
+        return DEFAULT.contains(index);
+    }
+
+    static int getCurveIndex(ECParameterSpec params) {
+        String oid = JsseJce.getNamedCurveOid(params);
+        if (oid == null) {
+            return -1;
+        }
+        Integer n = curveIndices.get(oid);
+        return (n == null) ? -1 : n;
+    }
+
+    static String getCurveOid(int index) {
+        if ((index > 0) && (index < NAMED_CURVE_OID_TABLE.length)) {
+            return NAMED_CURVE_OID_TABLE[index];
+        }
+        return null;
+    }
+
+    private static final int ARBITRARY_PRIME = 0xff01;
+    private static final int ARBITRARY_CHAR2 = 0xff02;
+
+    // See sun.security.util.NamedCurve for the OIDs
+    private static final String[] NAMED_CURVE_OID_TABLE = new String[] {
+        null,                   //  (0) unused
+        "1.3.132.0.1",          //  (1) sect163k1, NIST K-163
+        "1.3.132.0.2",          //  (2) sect163r1
+        "1.3.132.0.15",         //  (3) sect163r2, NIST B-163
+        "1.3.132.0.24",         //  (4) sect193r1
+        "1.3.132.0.25",         //  (5) sect193r2
+        "1.3.132.0.26",         //  (6) sect233k1, NIST K-233
+        "1.3.132.0.27",         //  (7) sect233r1, NIST B-233
+        "1.3.132.0.3",          //  (8) sect239k1
+        "1.3.132.0.16",         //  (9) sect283k1, NIST K-283
+        "1.3.132.0.17",         // (10) sect283r1, NIST B-283
+        "1.3.132.0.36",         // (11) sect409k1, NIST K-409
+        "1.3.132.0.37",         // (12) sect409r1, NIST B-409
+        "1.3.132.0.38",         // (13) sect571k1, NIST K-571
+        "1.3.132.0.39",         // (14) sect571r1, NIST B-571
+        "1.3.132.0.9",          // (15) secp160k1
+        "1.3.132.0.8",          // (16) secp160r1
+        "1.3.132.0.30",         // (17) secp160r2
+        "1.3.132.0.31",         // (18) secp192k1
+        "1.2.840.10045.3.1.1",  // (19) secp192r1, NIST P-192
+        "1.3.132.0.32",         // (20) secp224k1
+        "1.3.132.0.33",         // (21) secp224r1, NIST P-224
+        "1.3.132.0.10",         // (22) secp256k1
+        "1.2.840.10045.3.1.7",  // (23) secp256r1, NIST P-256
+        "1.3.132.0.34",         // (24) secp384r1, NIST P-384
+        "1.3.132.0.35",         // (25) secp521r1, NIST P-521
+    };
+
+    private static final Map<String,Integer> curveIndices;
+
+    static {
+        curveIndices = new HashMap<String,Integer>();
+        for (int i = 1; i < NAMED_CURVE_OID_TABLE.length; i++) {
+            curveIndices.put(NAMED_CURVE_OID_TABLE[i], i);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/EllipticPointFormatsExtension.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2006, 2016, 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 sun.security.ssl;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.net.ssl.SSLProtocolException;
+
+final class EllipticPointFormatsExtension extends HelloExtension {
+
+    static final int FMT_UNCOMPRESSED = 0;
+    static final int FMT_ANSIX962_COMPRESSED_PRIME = 1;
+    static final int FMT_ANSIX962_COMPRESSED_CHAR2 = 2;
+
+    static final HelloExtension DEFAULT =
+            new EllipticPointFormatsExtension(new byte[] {FMT_UNCOMPRESSED});
+
+    private final byte[] formats;
+
+    private EllipticPointFormatsExtension(byte[] formats) {
+        super(ExtensionType.EXT_EC_POINT_FORMATS);
+        this.formats = formats;
+    }
+
+    EllipticPointFormatsExtension(HandshakeInStream s, int len)
+            throws IOException {
+        super(ExtensionType.EXT_EC_POINT_FORMATS);
+        formats = s.getBytes8();
+        // RFC 4492 says uncompressed points must always be supported.
+        // Check just to make sure.
+        boolean uncompressed = false;
+        for (int format : formats) {
+            if (format == FMT_UNCOMPRESSED) {
+                uncompressed = true;
+                break;
+            }
+        }
+        if (uncompressed == false) {
+            throw new SSLProtocolException
+                ("Peer does not support uncompressed points");
+        }
+    }
+
+    @Override
+    int length() {
+        return 5 + formats.length;
+    }
+
+    @Override
+    void send(HandshakeOutStream s) throws IOException {
+        s.putInt16(type.id);
+        s.putInt16(formats.length + 1);
+        s.putBytes8(formats);
+    }
+
+    private static String toString(byte format) {
+        int f = format & 0xff;
+        switch (f) {
+        case FMT_UNCOMPRESSED:
+            return "uncompressed";
+        case FMT_ANSIX962_COMPRESSED_PRIME:
+            return "ansiX962_compressed_prime";
+        case FMT_ANSIX962_COMPRESSED_CHAR2:
+            return "ansiX962_compressed_char2";
+        default:
+            return "unknown-" + f;
+        }
+    }
+
+    @Override
+    public String toString() {
+        List<String> list = new ArrayList<String>();
+        for (byte format : formats) {
+            list.add(toString(format));
+        }
+        return "Extension " + type + ", formats: " + list;
+    }
+}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java	Wed Jul 05 21:40:37 2017 +0200
@@ -314,8 +314,8 @@
         }
 
         if (cipherSuites.containsEC()) {
-            extensions.add(SupportedEllipticCurvesExtension.DEFAULT);
-            extensions.add(SupportedEllipticPointFormatsExtension.DEFAULT);
+            extensions.add(EllipticCurvesExtension.DEFAULT);
+            extensions.add(EllipticPointFormatsExtension.DEFAULT);
         }
 
         clnt_random = new RandomCookie(generator);
@@ -1401,7 +1401,7 @@
         ECParameterSpec params = publicKey.getParams();
         ECPoint point = publicKey.getW();
         pointBytes = JsseJce.encodePoint(point, params.getCurve());
-        curveId = SupportedEllipticCurvesExtension.getCurveIndex(params);
+        curveId = EllipticCurvesExtension.getCurveIndex(params);
 
         if (privateKey == null) {
             // ECDH_anon
@@ -1439,13 +1439,11 @@
         // the supported curves during the exchange of the Hello messages.
         if (curveType == CURVE_NAMED_CURVE) {
             curveId = input.getInt16();
-            if (SupportedEllipticCurvesExtension.isSupported(curveId)
-                    == false) {
+            if (!EllipticCurvesExtension.isSupported(curveId)) {
                 throw new SSLHandshakeException(
                     "Unsupported curveId: " + curveId);
             }
-            String curveOid =
-                SupportedEllipticCurvesExtension.getCurveOid(curveId);
+            String curveOid = EllipticCurvesExtension.getCurveOid(curveId);
             if (curveOid == null) {
                 throw new SSLHandshakeException(
                     "Unknown named curve: " + curveId);
--- a/jdk/src/java.base/share/classes/sun/security/ssl/HelloExtensions.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HelloExtensions.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2016, 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
@@ -49,8 +49,8 @@
  *      explicitly support.
  *  . ServerNameExtension: the server_name extension.
  *  . SignatureAlgorithmsExtension: the signature_algorithms extension.
- *  . SupportedEllipticCurvesExtension: the ECC supported curves extension.
- *  . SupportedEllipticPointFormatsExtension: the ECC supported point formats
+ *  . EllipticCurvesExtension: the ECC supported curves extension.
+ *  . EllipticPointFormatsExtension: the ECC supported point formats
  *      (compressed/uncompressed) extension.
  *  . ALPNExtension: the application_layer_protocol_negotiation extension.
  *
@@ -80,10 +80,9 @@
             } else if (extType == ExtensionType.EXT_SIGNATURE_ALGORITHMS) {
                 extension = new SignatureAlgorithmsExtension(s, extlen);
             } else if (extType == ExtensionType.EXT_ELLIPTIC_CURVES) {
-                extension = new SupportedEllipticCurvesExtension(s, extlen);
+                extension = new EllipticCurvesExtension(s, extlen);
             } else if (extType == ExtensionType.EXT_EC_POINT_FORMATS) {
-                extension =
-                        new SupportedEllipticPointFormatsExtension(s, extlen);
+                extension = new EllipticPointFormatsExtension(s, extlen);
             } else if (extType == ExtensionType.EXT_RENEGOTIATION_INFO) {
                 extension = new RenegotiationInfoExtension(s, extlen);
             } else if (extType == ExtensionType.EXT_ALPN) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -656,7 +656,8 @@
         // the provider service. Instead, please handle the initialization
         // exception in the caller's constructor.
         static {
-            String property = GetPropertyAction.getProperty(PROPERTY_NAME);
+            String property = GetPropertyAction
+                    .privilegedGetProperty(PROPERTY_NAME);
             if (property != null && property.length() != 0) {
                 // remove double quote marks from beginning/end of the property
                 if (property.length() > 1 && property.charAt(0) == '"' &&
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java	Wed Jul 05 21:40:37 2017 +0200
@@ -94,7 +94,7 @@
     // we remember it for the RSA premaster secret version check
     private ProtocolVersion clientRequestedVersion;
 
-    private SupportedEllipticCurvesExtension supportedCurves;
+    private EllipticCurvesExtension supportedCurves;
 
     // the preferable signature algorithm used by ServerKeyExchange message
     SignatureAndHashAlgorithm preferableSignatureAlgorithm;
@@ -119,8 +119,8 @@
     private long statusRespTimeout;
 
     static {
-        String property =
-                GetPropertyAction.getProperty("jdk.tls.ephemeralDHKeySize");
+        String property = GetPropertyAction
+                .privilegedGetProperty("jdk.tls.ephemeralDHKeySize");
         if (property == null || property.length() == 0) {
             useLegacyEphemeralDHKeys = false;
             useSmartEphemeralDHKeys = false;
@@ -741,7 +741,7 @@
                 throw new SSLException("Client did not resume a session");
             }
 
-            supportedCurves = (SupportedEllipticCurvesExtension)
+            supportedCurves = (EllipticCurvesExtension)
                         mesg.extensions.get(ExtensionType.EXT_ELLIPTIC_CURVES);
 
             // We only need to handle the "signature_algorithm" extension
@@ -1577,7 +1577,7 @@
             // if the client sent the supported curves extension, pick the
             // first one that we support;
             for (int curveId : supportedCurves.curveIds()) {
-                if (SupportedEllipticCurvesExtension.isSupported(curveId)) {
+                if (EllipticCurvesExtension.isSupported(curveId)) {
                     index = curveId;
                     break;
                 }
@@ -1588,9 +1588,9 @@
             }
         } else {
             // pick our preference
-            index = SupportedEllipticCurvesExtension.DEFAULT.curveIds()[0];
+            index = EllipticCurvesExtension.DEFAULT.curveIds()[0];
         }
-        String oid = SupportedEllipticCurvesExtension.getCurveOid(index);
+        String oid = EllipticCurvesExtension.getCurveOid(index);
         ecdh = new ECDHCrypt(oid, sslContext.getSecureRandom());
         return true;
     }
@@ -1633,15 +1633,15 @@
             return false;
         }
         // For ECC certs, check whether we support the EC domain parameters.
-        // If the client sent a SupportedEllipticCurves ClientHello extension,
+        // If the client sent a EllipticCurves ClientHello extension,
         // check against that too.
         if (keyAlgorithm.equals("EC")) {
             if (publicKey instanceof ECPublicKey == false) {
                 return false;
             }
             ECParameterSpec params = ((ECPublicKey)publicKey).getParams();
-            int index = SupportedEllipticCurvesExtension.getCurveIndex(params);
-            if (SupportedEllipticCurvesExtension.isSupported(index) == false) {
+            int index = EllipticCurvesExtension.getCurveIndex(params);
+            if (!EllipticCurvesExtension.isSupported(index)) {
                 return false;
             }
             if ((supportedCurves != null) && !supportedCurves.contains(index)) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/StatusResponseManager.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/StatusResponseManager.java	Wed Jul 05 21:40:37 2017 +0200
@@ -73,8 +73,8 @@
                     DEFAULT_CACHE_LIFETIME));
         cacheLifetime = life > 0 ? life : 0;
 
-        String uriStr =
-                GetPropertyAction.getProperty("jdk.tls.stapling.responderURI");
+        String uriStr = GetPropertyAction
+                .privilegedGetProperty("jdk.tls.stapling.responderURI");
         URI tmpURI;
         try {
             tmpURI = ((uriStr != null && !uriStr.isEmpty()) ?
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 2006, 2012, 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 sun.security.ssl;
-
-import java.io.IOException;
-import java.security.spec.ECParameterSpec;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.net.ssl.SSLProtocolException;
-
-final class SupportedEllipticCurvesExtension extends HelloExtension {
-
-    // the extension value to send in the ClientHello message
-    static final SupportedEllipticCurvesExtension DEFAULT;
-
-    private static final boolean fips;
-
-    static {
-        int[] ids;
-        fips = SunJSSE.isFIPS();
-        if (fips == false) {
-            ids = new int[] {
-                // NIST curves first
-                // prefer NIST P-256, rest in order of increasing key length
-                23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14,
-                // non-NIST curves
-                15, 16, 17, 2, 18, 4, 5, 20, 8, 22,
-            };
-        } else {
-            ids = new int[] {
-                // same as above, but allow only NIST curves in FIPS mode
-                23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14,
-            };
-        }
-        DEFAULT = new SupportedEllipticCurvesExtension(ids);
-    }
-
-    private final int[] curveIds;
-
-    private SupportedEllipticCurvesExtension(int[] curveIds) {
-        super(ExtensionType.EXT_ELLIPTIC_CURVES);
-        this.curveIds = curveIds;
-    }
-
-    SupportedEllipticCurvesExtension(HandshakeInStream s, int len)
-            throws IOException {
-        super(ExtensionType.EXT_ELLIPTIC_CURVES);
-        int k = s.getInt16();
-        if (((len & 1) != 0) || (k + 2 != len)) {
-            throw new SSLProtocolException("Invalid " + type + " extension");
-        }
-        curveIds = new int[k >> 1];
-        for (int i = 0; i < curveIds.length; i++) {
-            curveIds[i] = s.getInt16();
-        }
-    }
-
-    boolean contains(int index) {
-        for (int curveId : curveIds) {
-            if (index == curveId) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Return a reference to the internal curveIds array.
-    // The caller must NOT modify the contents.
-    int[] curveIds() {
-        return curveIds;
-    }
-
-    @Override
-    int length() {
-        return 6 + (curveIds.length << 1);
-    }
-
-    @Override
-    void send(HandshakeOutStream s) throws IOException {
-        s.putInt16(type.id);
-        int k = curveIds.length << 1;
-        s.putInt16(k + 2);
-        s.putInt16(k);
-        for (int curveId : curveIds) {
-            s.putInt16(curveId);
-        }
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("Extension " + type + ", curve names: {");
-        boolean first = true;
-        for (int curveId : curveIds) {
-            if (first) {
-                first = false;
-            } else {
-                sb.append(", ");
-            }
-            // first check if it is a known named curve, then try other cases.
-            String oid = getCurveOid(curveId);
-            if (oid != null) {
-                ECParameterSpec spec = JsseJce.getECParameterSpec(oid);
-                // this toString() output will look nice for the current
-                // implementation of the ECParameterSpec class in the Sun
-                // provider, but may not look good for other implementations.
-                if (spec != null) {
-                    sb.append(spec.toString().split(" ")[0]);
-                } else {
-                    sb.append(oid);
-                }
-            } else if (curveId == ARBITRARY_PRIME) {
-                sb.append("arbitrary_explicit_prime_curves");
-            } else if (curveId == ARBITRARY_CHAR2) {
-                sb.append("arbitrary_explicit_char2_curves");
-            } else {
-                sb.append("unknown curve " + curveId);
-            }
-        }
-        sb.append("}");
-        return sb.toString();
-    }
-
-    // Test whether we support the curve with the given index.
-    static boolean isSupported(int index) {
-        if ((index <= 0) || (index >= NAMED_CURVE_OID_TABLE.length)) {
-            return false;
-        }
-        if (fips == false) {
-            // in non-FIPS mode, we support all valid indices
-            return true;
-        }
-        return DEFAULT.contains(index);
-    }
-
-    static int getCurveIndex(ECParameterSpec params) {
-        String oid = JsseJce.getNamedCurveOid(params);
-        if (oid == null) {
-            return -1;
-        }
-        Integer n = curveIndices.get(oid);
-        return (n == null) ? -1 : n;
-    }
-
-    static String getCurveOid(int index) {
-        if ((index > 0) && (index < NAMED_CURVE_OID_TABLE.length)) {
-            return NAMED_CURVE_OID_TABLE[index];
-        }
-        return null;
-    }
-
-    private static final int ARBITRARY_PRIME = 0xff01;
-    private static final int ARBITRARY_CHAR2 = 0xff02;
-
-    // See sun.security.util.NamedCurve for the OIDs
-    private static final String[] NAMED_CURVE_OID_TABLE = new String[] {
-        null,                   //  (0) unused
-        "1.3.132.0.1",          //  (1) sect163k1, NIST K-163
-        "1.3.132.0.2",          //  (2) sect163r1
-        "1.3.132.0.15",         //  (3) sect163r2, NIST B-163
-        "1.3.132.0.24",         //  (4) sect193r1
-        "1.3.132.0.25",         //  (5) sect193r2
-        "1.3.132.0.26",         //  (6) sect233k1, NIST K-233
-        "1.3.132.0.27",         //  (7) sect233r1, NIST B-233
-        "1.3.132.0.3",          //  (8) sect239k1
-        "1.3.132.0.16",         //  (9) sect283k1, NIST K-283
-        "1.3.132.0.17",         // (10) sect283r1, NIST B-283
-        "1.3.132.0.36",         // (11) sect409k1, NIST K-409
-        "1.3.132.0.37",         // (12) sect409r1, NIST B-409
-        "1.3.132.0.38",         // (13) sect571k1, NIST K-571
-        "1.3.132.0.39",         // (14) sect571r1, NIST B-571
-        "1.3.132.0.9",          // (15) secp160k1
-        "1.3.132.0.8",          // (16) secp160r1
-        "1.3.132.0.30",         // (17) secp160r2
-        "1.3.132.0.31",         // (18) secp192k1
-        "1.2.840.10045.3.1.1",  // (19) secp192r1, NIST P-192
-        "1.3.132.0.32",         // (20) secp224k1
-        "1.3.132.0.33",         // (21) secp224r1, NIST P-224
-        "1.3.132.0.10",         // (22) secp256k1
-        "1.2.840.10045.3.1.7",  // (23) secp256r1, NIST P-256
-        "1.3.132.0.34",         // (24) secp384r1, NIST P-384
-        "1.3.132.0.35",         // (25) secp521r1, NIST P-521
-    };
-
-    private static final Map<String,Integer> curveIndices;
-
-    static {
-        curveIndices = new HashMap<String,Integer>();
-        for (int i = 1; i < NAMED_CURVE_OID_TABLE.length; i++) {
-            curveIndices.put(NAMED_CURVE_OID_TABLE[i], i);
-        }
-    }
-
-}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SupportedEllipticPointFormatsExtension.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2006, 2012, 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 sun.security.ssl;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.net.ssl.SSLProtocolException;
-
-final class SupportedEllipticPointFormatsExtension extends HelloExtension {
-
-    static final int FMT_UNCOMPRESSED = 0;
-    static final int FMT_ANSIX962_COMPRESSED_PRIME = 1;
-    static final int FMT_ANSIX962_COMPRESSED_CHAR2 = 2;
-
-    static final HelloExtension DEFAULT =
-        new SupportedEllipticPointFormatsExtension(
-            new byte[] {FMT_UNCOMPRESSED});
-
-    private final byte[] formats;
-
-    private SupportedEllipticPointFormatsExtension(byte[] formats) {
-        super(ExtensionType.EXT_EC_POINT_FORMATS);
-        this.formats = formats;
-    }
-
-    SupportedEllipticPointFormatsExtension(HandshakeInStream s, int len)
-            throws IOException {
-        super(ExtensionType.EXT_EC_POINT_FORMATS);
-        formats = s.getBytes8();
-        // RFC 4492 says uncompressed points must always be supported.
-        // Check just to make sure.
-        boolean uncompressed = false;
-        for (int format : formats) {
-            if (format == FMT_UNCOMPRESSED) {
-                uncompressed = true;
-                break;
-            }
-        }
-        if (uncompressed == false) {
-            throw new SSLProtocolException
-                ("Peer does not support uncompressed points");
-        }
-    }
-
-    @Override
-    int length() {
-        return 5 + formats.length;
-    }
-
-    @Override
-    void send(HandshakeOutStream s) throws IOException {
-        s.putInt16(type.id);
-        s.putInt16(formats.length + 1);
-        s.putBytes8(formats);
-    }
-
-    private static String toString(byte format) {
-        int f = format & 0xff;
-        switch (f) {
-        case FMT_UNCOMPRESSED:
-            return "uncompressed";
-        case FMT_ANSIX962_COMPRESSED_PRIME:
-            return "ansiX962_compressed_prime";
-        case FMT_ANSIX962_COMPRESSED_CHAR2:
-            return "ansiX962_compressed_char2";
-        default:
-            return "unknown-" + f;
-        }
-    }
-
-    @Override
-    public String toString() {
-        List<String> list = new ArrayList<String>();
-        for (byte format : formats) {
-            list.add(toString(format));
-        }
-        return "Extension " + type + ", formats: " + list;
-    }
-}
--- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Wed Jul 05 21:40:37 2017 +0200
@@ -728,6 +728,7 @@
                     provClass = Class.forName(provName);
                 }
 
+                @SuppressWarnings("deprecation")
                 Object obj = provClass.newInstance();
                 if (!(obj instanceof Provider)) {
                     MessageFormat form = new MessageFormat
--- a/jdk/src/java.base/share/classes/sun/security/util/Debug.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/util/Debug.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, 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
@@ -43,10 +43,10 @@
     private static String args;
 
     static {
-        args = GetPropertyAction.getProperty("java.security.debug");
+        args = GetPropertyAction.privilegedGetProperty("java.security.debug");
 
-        String args2 =
-                GetPropertyAction.getProperty("java.security.auth.debug");
+        String args2 = GetPropertyAction
+                .privilegedGetProperty("java.security.auth.debug");
 
         if (args == null) {
             args = args2;
@@ -87,6 +87,7 @@
         System.err.println("pkcs12        PKCS12 KeyStore debugging");
         System.err.println("sunpkcs11     SunPKCS11 provider debugging");
         System.err.println("scl           permissions SecureClassLoader assigns");
+        System.err.println("securerandom  SecureRandom");
         System.err.println("ts            timestamping");
         System.err.println();
         System.err.println("The following can be used with access:");
@@ -175,6 +176,16 @@
     }
 
     /**
+     * print a message to stderr that is prefixed with the prefix
+     * created from the call to getInstance and obj.
+     */
+    public void println(Object obj, String message)
+    {
+        System.err.println(prefix + " [" + obj.getClass().getSimpleName() +
+                "@" + System.identityHashCode(obj) + "]: "+message);
+    }
+
+    /**
      * print a blank line to stderr that is prefixed with the prefix.
      */
 
--- a/jdk/src/java.base/share/classes/sun/security/util/KeyStoreDelegator.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/util/KeyStoreDelegator.java	Wed Jul 05 21:40:37 2017 +0200
@@ -196,8 +196,9 @@
         // A new keystore is always created in the primary keystore format
         if (stream == null) {
             try {
-                keystore = primaryKeyStore.newInstance();
-
+                @SuppressWarnings("deprecation")
+                KeyStoreSpi tmp = primaryKeyStore.newInstance();
+                keystore = tmp;
             } catch (InstantiationException | IllegalAccessException e) {
                 // can safely ignore
             }
@@ -214,7 +215,9 @@
             bufferedStream.mark(Integer.MAX_VALUE);
 
             try {
-                keystore = primaryKeyStore.newInstance();
+                @SuppressWarnings("deprecation")
+                KeyStoreSpi tmp = primaryKeyStore.newInstance();
+                keystore = tmp;
                 type = primaryType;
                 keystore.engineLoad(bufferedStream, password);
 
@@ -232,7 +235,9 @@
                         throw e;
                     }
 
-                    keystore = secondaryKeyStore.newInstance();
+                    @SuppressWarnings("deprecation")
+                    KeyStoreSpi tmp= secondaryKeyStore.newInstance();
+                    keystore = tmp;
                     type = secondaryType;
                     bufferedStream.reset();
                     keystore.engineLoad(bufferedStream, password);
@@ -284,7 +289,9 @@
         boolean result = false;
 
         try {
-            keystore = primaryKeyStore.newInstance();
+            @SuppressWarnings("deprecation")
+            KeyStoreSpi tmp = primaryKeyStore.newInstance();
+            keystore = tmp;
             type = primaryType;
             result = keystore.engineProbe(stream);
 
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509Key.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509Key.java	Wed Jul 05 21:40:37 2017 +0200
@@ -255,11 +255,10 @@
                 }
             }
 
-            Object      inst = null;
+            @SuppressWarnings("deprecation")
+            Object      inst = (keyClass != null) ? keyClass.newInstance() : null;
             X509Key     result;
 
-            if (keyClass != null)
-                inst = keyClass.newInstance();
             if (inst instanceof X509Key) {
                 result = (X509Key) inst;
                 result.algid = algid;
--- a/jdk/src/java.base/share/classes/sun/util/calendar/CalendarSystem.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarSystem.java	Wed Jul 05 21:40:37 2017 +0200
@@ -157,8 +157,9 @@
             cal = LocalGregorianCalendar.getLocalGregorianCalendar(calendarName);
         } else {
             try {
-                Class<?> cl = Class.forName(className);
-                cal = (CalendarSystem) cl.newInstance();
+                @SuppressWarnings("deprecation")
+                Object tmp = Class.forName(className).newInstance();
+                cal = (CalendarSystem) tmp;
             } catch (Exception e) {
                 throw new InternalError(e);
             }
--- a/jdk/src/java.base/share/classes/sun/util/calendar/LocalGregorianCalendar.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/LocalGregorianCalendar.java	Wed Jul 05 21:40:37 2017 +0200
@@ -144,7 +144,7 @@
 
         // Append an era to the predefined eras if it's given by the property.
         String prop = GetPropertyAction
-                .getProperty("jdk.calendar.japanese.supplemental.era");
+                .privilegedGetProperty("jdk.calendar.japanese.supplemental.era");
         if (prop != null) {
             Era era = parseEraEntry(prop);
             if (era != null) {
--- a/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java	Wed Jul 05 21:40:37 2017 +0200
@@ -246,7 +246,7 @@
 
     static {
         String oldmapping = GetPropertyAction
-                .getProperty("sun.timezone.ids.oldmapping", "false")
+                .privilegedGetProperty("sun.timezone.ids.oldmapping", "false")
                 .toLowerCase(Locale.ROOT);
         USE_OLDMAPPING = (oldmapping.equals("yes") || oldmapping.equals("true"));
         AccessController.doPrivileged(new PrivilegedAction<Void>() {
--- a/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java	Wed Jul 05 21:40:37 2017 +0200
@@ -116,7 +116,7 @@
         adapterCache = new ConcurrentHashMap<>();
 
     static {
-        String order = GetPropertyAction.getProperty("java.locale.providers");
+        String order = GetPropertyAction.privilegedGetProperty("java.locale.providers");
         List<Type> typeList = new ArrayList<>();
 
         // Check user specified adapter preference
@@ -171,8 +171,9 @@
             if (cached == null) {
                 try {
                     // lazily load adapters here
-                    adapter = (LocaleProviderAdapter)Class.forName(type.getAdapterClassName())
-                        .newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object tmp = Class.forName(type.getAdapterClassName()).newInstance();
+                    adapter = (LocaleProviderAdapter)tmp;
                     cached = adapterInstances.putIfAbsent(type, adapter);
                     if (cached != null) {
                         adapter = cached;
--- a/jdk/src/java.base/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java	Wed Jul 05 21:40:37 2017 +0200
@@ -73,7 +73,7 @@
         try {
             return AccessController.doPrivileged(new PrivilegedExceptionAction<P>() {
                 @Override
-                @SuppressWarnings("unchecked")
+                @SuppressWarnings(value={"unchecked", "deprecation"})
                 public P run() {
                     P delegate = null;
 
--- a/jdk/src/java.base/share/conf/security/java.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/conf/security/java.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -8,6 +8,19 @@
         permission java.security.AllPermission;
 };
 
+grant codeBase "jrt:/java.compiler" {
+        permission java.security.AllPermission;
+};
+
+grant codeBase "jrt:/jdk.charsets" {
+        permission java.io.FilePermission "${java.home}/-", "read";
+        permission java.util.PropertyPermission "os.name", "read";
+        permission java.util.PropertyPermission "sun.nio.cs.map", "read";
+        permission java.lang.RuntimePermission "charsetProvider";
+        permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.misc";
+        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.cs";
+};
+
 grant codeBase "jrt:/jdk.crypto.ucrypto" {
         permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
         permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
--- a/jdk/src/java.base/share/conf/security/java.security	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/share/conf/security/java.security	Wed Jul 05 21:40:37 2017 +0200
@@ -120,30 +120,30 @@
 #
 # Sun Provider SecureRandom seed source.
 #
-# Select the primary source of seed data for the "SHA1PRNG" and
-# "NativePRNG" SecureRandom implementations in the "Sun" provider.
+# Select the primary source of seed data for the "NativePRNG", "SHA1PRNG"
+# and "DRBG" SecureRandom implementations in the "Sun" provider.
 # (Other SecureRandom implementations might also use this property.)
 #
 # On Unix-like systems (for example, Solaris/Linux/MacOS), the
-# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
+# "NativePRNG", "SHA1PRNG" and "DRBG" implementations obtains seed data from
 # special device files such as file:/dev/random.
 #
 # On Windows systems, specifying the URLs "file:/dev/random" or
 # "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
-# mechanism for SHA1PRNG.
+# mechanism for SHA1PRNG and DRBG.
 #
 # By default, an attempt is made to use the entropy gathering device
 # specified by the "securerandom.source" Security property.  If an
 # exception occurs while accessing the specified URL:
 #
-#     SHA1PRNG:
-#         the traditional system/thread activity algorithm will be used.
-#
 #     NativePRNG:
 #         a default value of /dev/random will be used.  If neither
 #         are available, the implementation will be disabled.
 #         "file" is the only currently supported protocol type.
 #
+#     SHA1PRNG and DRBG:
+#         the traditional system/thread activity algorithm will be used.
+#
 # The entropy gathering device can also be specified with the System
 # property "java.security.egd". For example:
 #
@@ -154,7 +154,7 @@
 #
 # In addition, if "file:/dev/random" or "file:/dev/urandom" is
 # specified, the "NativePRNG" implementation will be more preferred than
-# SHA1PRNG in the Sun provider.
+# DRBG and SHA1PRNG in the Sun provider.
 #
 securerandom.source=file:/dev/random
 
@@ -169,13 +169,79 @@
 # entries.
 #
 #ifdef windows
-securerandom.strongAlgorithms=Windows-PRNG:SunMSCAPI,SHA1PRNG:SUN
+securerandom.strongAlgorithms=Windows-PRNG:SunMSCAPI,DRBG:SUN
 #endif
 #ifndef windows
-securerandom.strongAlgorithms=NativePRNGBlocking:SUN
+securerandom.strongAlgorithms=NativePRNGBlocking:SUN,DRBG:SUN
 #endif
 
 #
+# Sun provider DRBG configuration and default instantiation request.
+#
+# NIST SP 800-90Ar1 lists several DRBG mechanisms. Each can be configured
+# with a DRBG algorithm name, and can be instantiated with a security strength,
+# prediction resistance support, etc. This property defines the configuration
+# and the default instantiation request of "DRBG" SecureRandom implementations
+# in the SUN provider. (Other DRBG implementations can also use this property.)
+# Applications can request different instantiation parameters like security
+# strength, capability, personalization string using one of the
+# getInstance(...,SecureRandomParameters,...) methods with a
+# DrbgParameters.Instantiation argument, but other settings such as the
+# mechanism and DRBG algorithm names are not currently configurable by any API.
+#
+# Please note that the SUN implementation of DRBG always supports reseeding.
+#
+# The value of this property is a comma-separated list of all configurable
+# aspects. The aspects can appear in any order but the same aspect can only
+# appear at most once. Its BNF-style definition is:
+#
+#   Value:
+#     aspect { "," aspect }
+#
+#   aspect:
+#     mech_name | algorithm_name | strength | capability | df
+#
+#   // The DRBG mechanism to use. Default "Hash_DRBG"
+#   mech_name:
+#     "Hash_DRBG" | "HMAC_DRBG" | "CTR_DRBG"
+#
+#   // The DRBG algorithm name. The "SHA-***" names are for Hash_DRBG and
+#   // HMAC_DRBG, default "SHA-256". "3KeyTDEA" and "AES-***" names are for
+#   // CTR_DRBG, default "AES-128" when using the limited cryptographic
+#   // or "AES-256" when using the unlimited.
+#   algorithm_name:
+#     "SHA-1" | "SHA-224" | "SHA-512/224" | "SHA-256" |
+#     "SHA-512/256" | "SHA-384" | "SHA-512" |
+#     "3KeyTDEA" | "AES-128" | "AES-192" | "AES-256"
+#
+#   // Security strength requested. Default "128", or "112"
+#   // if mech_name is CTR_DRBG and algorithm_name is "3KeyTDEA"
+#   strength:
+#     "112" | "128" | "192" | "256"
+#
+#   // Prediction resistance and reseeding request. Default "none"
+#   //  "pr_and_reseed" - Both prediction resistance and reseeding
+#   //                    support requested
+#   //  "reseed_only"   - Only reseeding support requested
+#   //  "none"          - Neither prediction resistance not reseeding
+#   //                    support requested
+#   pr:
+#     "pr_and_reseed" | "reseed_only" | "none"
+#
+#   // Whether a derivation function should be used. only applicable
+#   // to CTR_DRBG. Default "use_df"
+#   df:
+#     "use_df" | "no_df"
+#
+# Examples,
+#   securerandom.drbg.config=Hash_DRBG,SHA-1,112,none
+#   securerandom.drbg.config=CTR_DRBG,AES-256,192,pr_and_reseed,use_df
+#
+# The default value is an empty string, which is equivalent to
+#   securerandom.drbg.config=Hash_DRBG,SHA-256,128,none
+securerandom.drbg.config=
+
+#
 # Class to instantiate as the javax.security.auth.login.Configuration
 # provider.
 #
--- a/jdk/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystem.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystem.java	Wed Jul 05 21:40:37 2017 +0200
@@ -42,7 +42,7 @@
         super(provider, dir);
 
         // check os.version
-        String osversion = GetPropertyAction.getProperty("os.version");
+        String osversion = GetPropertyAction.privilegedGetProperty("os.version");
         String[] vers = Util.split(osversion, '.');
         assert vers.length >= 2;
         int majorVersion = Integer.parseInt(vers[0]);
--- a/jdk/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -85,7 +85,7 @@
     @Override
     FileTypeDetector getFileTypeDetector() {
         Path userMimeTypes = Paths.get(
-            GetPropertyAction.getProperty("user.home"), ".mime.types");
+            GetPropertyAction.privilegedGetProperty("user.home"), ".mime.types");
         Path etcMimeTypes = Paths.get("/etc/mime.types");
 
         return chain(new GioFileTypeDetector(),
--- a/jdk/src/java.base/solaris/native/libnio/ch/DevPollArrayWrapper.c	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/solaris/native/libnio/ch/DevPollArrayWrapper.c	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2016, 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
@@ -94,6 +94,7 @@
                     return 0;
                 }
                 start = now;
+                a.dp_timeout = remaining;
             }
         } else {
             return res;
--- a/jdk/src/java.base/unix/classes/java/io/UnixFileSystem.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/java/io/UnixFileSystem.java	Wed Jul 05 21:40:37 2017 +0200
@@ -36,7 +36,7 @@
     private final String javaHome;
 
     public UnixFileSystem() {
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         slash = props.getProperty("file.separator").charAt(0);
         colon = props.getProperty("path.separator").charAt(0);
         javaHome = props.getProperty("java.home");
--- a/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -125,7 +125,7 @@
         }
 
         String helperPath() {
-            Properties props = GetPropertyAction.getProperties();
+            Properties props = GetPropertyAction.privilegedGetProperties();
             return helperPath(props.getProperty("java.home"),
                               props.getProperty("os.arch"));
         }
@@ -159,7 +159,7 @@
         }
 
         static Platform get() {
-            String osName = GetPropertyAction.getProperty("os.name");
+            String osName = GetPropertyAction.privilegedGetProperty("os.name");
 
             if (osName.equals("Linux")) { return LINUX; }
             if (osName.contains("OS X")) { return BSD; }
--- a/jdk/src/java.base/unix/classes/java/net/DefaultDatagramSocketImplFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/java/net/DefaultDatagramSocketImplFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -40,7 +40,7 @@
     static {
         String prefix = null;
         try {
-            prefix = GetPropertyAction.getProperty("impl.prefix", null);
+            prefix = GetPropertyAction.privilegedGetProperty("impl.prefix");
             if (prefix != null)
                 prefixImplClass = Class.forName("java.net."+prefix+"DatagramSocketImpl");
         } catch (Exception e) {
@@ -61,7 +61,9 @@
         throws SocketException {
         if (prefixImplClass != null) {
             try {
-                return (DatagramSocketImpl)prefixImplClass.newInstance();
+                @SuppressWarnings("deprecation")
+                DatagramSocketImpl result = (DatagramSocketImpl)prefixImplClass.newInstance();
+                return result;
             } catch (Exception e) {
                 throw new SocketException("can't instantiate DatagramSocketImpl");
             }
--- a/jdk/src/java.base/unix/classes/sun/net/NetHooks.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/sun/net/NetHooks.java	Wed Jul 05 21:40:37 2017 +0200
@@ -28,9 +28,6 @@
 import java.net.InetAddress;
 import java.io.FileDescriptor;
 import java.io.IOException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import sun.security.action.GetPropertyAction;
 
 /**
  * Defines static methods to be invoked prior to binding or connecting TCP sockets.
--- a/jdk/src/java.base/unix/classes/sun/net/sdp/SdpProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/sun/net/sdp/SdpProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -55,8 +55,9 @@
     private PrintStream log;
 
     public SdpProvider() {
+        Properties props = GetPropertyAction.privilegedGetProperties();
         // if this property is not defined then there is nothing to do.
-        String file = GetPropertyAction.getProperty("com.sun.sdp.conf");
+        String file = props.getProperty("com.sun.sdp.conf");
         if (file == null) {
             this.enabled = false;
             this.rules = null;
@@ -65,17 +66,15 @@
 
         // load configuration file
         List<Rule> list = null;
-        if (file != null) {
-            try {
-                list = loadRulesFromFile(file);
-            } catch (IOException e) {
-                fail("Error reading %s: %s", file, e.getMessage());
-            }
+        try {
+            list = loadRulesFromFile(file);
+        } catch (IOException e) {
+            fail("Error reading %s: %s", file, e.getMessage());
         }
 
         // check if debugging is enabled
         PrintStream out = null;
-        String logfile = GetPropertyAction.getProperty("com.sun.sdp.debug");
+        String logfile = props.getProperty("com.sun.sdp.debug");
         if (logfile != null) {
             out = System.out;
             if (logfile.length() > 0) {
--- a/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Wed Jul 05 21:40:37 2017 +0200
@@ -76,7 +76,7 @@
     private String hostname;
     /* Domain to use if not specified by user */
     private static String defaultDomain =
-            GetPropertyAction.getProperty("http.auth.ntlm.domain", "");
+            GetPropertyAction.privilegedGetProperty("http.auth.ntlm.domain", "");
 
     public static boolean supportsTransparentAuth () {
         return false;
@@ -141,7 +141,7 @@
         password = pw.getPassword();
         init0();
         try {
-            String version = GetPropertyAction.getProperty("ntlm.version");
+            String version = GetPropertyAction.privilegedGetProperty("ntlm.version");
             client = new Client(version, hostname, username, ntdomain, password);
         } catch (NTLMException ne) {
             try {
--- a/jdk/src/java.base/unix/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -48,7 +48,9 @@
             throw new AssertionError(x);
         }
         try {
-            return c.newInstance();
+            @SuppressWarnings("deprecation")
+            AsynchronousChannelProvider result = c.newInstance();
+            return result;
         } catch (IllegalAccessException | InstantiationException x) {
             throw new AssertionError(x);
         }
@@ -59,7 +61,7 @@
      * Returns the default AsynchronousChannelProvider.
      */
     public static AsynchronousChannelProvider create() {
-        String osname = GetPropertyAction.getProperty("os.name");
+        String osname = GetPropertyAction.privilegedGetProperty("os.name");
         if (osname.equals("SunOS"))
             return createProvider("sun.nio.ch.SolarisAsynchronousChannelProvider");
         if (osname.equals("Linux"))
--- a/jdk/src/java.base/unix/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -46,8 +46,8 @@
 
     private static final boolean disableSynchronousRead;
     static {
-        String propValue = GetPropertyAction
-                .getProperty("sun.nio.ch.disableSynchronousRead", "false");
+        String propValue = GetPropertyAction.privilegedGetProperty(
+            "sun.nio.ch.disableSynchronousRead", "false");
         disableSynchronousRead = (propValue.length() == 0) ?
             true : Boolean.valueOf(propValue);
     }
--- a/jdk/src/java.base/unix/classes/sun/nio/fs/DefaultFileSystemProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/DefaultFileSystemProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -44,7 +44,9 @@
             throw new AssertionError(x);
         }
         try {
-            return c.newInstance();
+            @SuppressWarnings("deprecation")
+            FileSystemProvider result = c.newInstance();
+            return result;
         } catch (IllegalAccessException | InstantiationException x) {
             throw new AssertionError(x);
         }
@@ -54,7 +56,7 @@
      * Returns the default FileSystemProvider.
      */
     public static FileSystemProvider create() {
-        String osname = GetPropertyAction.getProperty("os.name");
+        String osname = GetPropertyAction.privilegedGetProperty("os.name");
         if (osname.equals("SunOS"))
             return createProvider("sun.nio.fs.SolarisFileSystemProvider");
         if (osname.equals("Linux"))
--- a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixFileSystem.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixFileSystem.java	Wed Jul 05 21:40:37 2017 +0200
@@ -57,7 +57,7 @@
         // process working directory then paths must be resolved against the
         // default directory.
         String propValue = GetPropertyAction
-                .getProperty("sun.nio.fs.chdirAllowed", "false");
+                .privilegedGetProperty("sun.nio.fs.chdirAllowed", "false");
         boolean chdirAllowed = (propValue.length() == 0) ?
             true : Boolean.valueOf(propValue);
         if (chdirAllowed) {
--- a/jdk/src/java.base/windows/classes/java/io/WinNTFileSystem.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/windows/classes/java/io/WinNTFileSystem.java	Wed Jul 05 21:40:37 2017 +0200
@@ -42,7 +42,7 @@
     private final char semicolon;
 
     public WinNTFileSystem() {
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         slash = props.getProperty("file.separator").charAt(0);
         semicolon = props.getProperty("path.separator").charAt(0);
         altSlash = (this.slash == '\\') ? '/' : '\\';
--- a/jdk/src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -56,7 +56,7 @@
     static {
         Class<?> prefixImplClassLocal = null;
 
-        Properties props = GetPropertyAction.getProperties();
+        Properties props = GetPropertyAction.privilegedGetProperties();
         preferIPv4Stack = Boolean.parseBoolean(
                 props.getProperty("java.net.preferIPv4Stack"));
 
@@ -90,7 +90,9 @@
         throws SocketException {
         if (prefixImplClass != null) {
             try {
-                return (DatagramSocketImpl) prefixImplClass.newInstance();
+                @SuppressWarnings("deprecation")
+                Object result = prefixImplClass.newInstance();
+                return (DatagramSocketImpl) result;
             } catch (Exception e) {
                 throw new SocketException("can't instantiate DatagramSocketImpl");
             }
--- a/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Wed Jul 05 21:40:37 2017 +0200
@@ -53,8 +53,8 @@
     private static String defaultDomain; /* Domain to use if not specified by user */
 
     static {
-        defaultDomain = GetPropertyAction.getProperty("http.auth.ntlm.domain",
-                                                      "domain");
+        defaultDomain = GetPropertyAction
+                .privilegedGetProperty("http.auth.ntlm.domain", "domain");
     };
 
     private void init0() {
--- a/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -120,7 +120,7 @@
 
     static boolean isFastFileTransferRequested() {
         String fileTransferProp = GetPropertyAction
-                .getProperty("jdk.nio.enableFastFileTransfer");
+                .privilegedGetProperty("jdk.nio.enableFastFileTransfer");
         boolean enable;
         if ("".equals(fileTransferProp)) {
             enable = true;
--- a/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsFileAttributes.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsFileAttributes.java	Wed Jul 05 21:40:37 2017 +0200
@@ -114,8 +114,8 @@
     // indicates if accurate metadata is required (interesting on NTFS only)
     private static final boolean ensureAccurateMetadata;
     static {
-        String propValue = GetPropertyAction
-                .getProperty("sun.nio.fs.ensureAccurateMetadata", "false");
+        String propValue = GetPropertyAction.privilegedGetProperty(
+            "sun.nio.fs.ensureAccurateMetadata", "false");
         ensureAccurateMetadata = (propValue.length() == 0) ?
             true : Boolean.valueOf(propValue);
     }
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -25,12 +25,15 @@
 
 package sun.lwawt.macosx;
 
+import sun.lwawt.LWWindowPeer;
+
 import java.awt.*;
 import java.beans.*;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 import java.util.concurrent.Callable;
+import sun.awt.AWTAccessor;
 
 import javax.accessibility.*;
 import javax.swing.*;
@@ -421,6 +424,8 @@
     }
 
     public static AccessibleAction getAccessibleAction(final Accessible a, final Component c) {
+        if (a == null) return null;
+
         return invokeAndWait(new Callable<AccessibleAction>() {
             public AccessibleAction call() throws Exception {
                 final AccessibleContext ac = a.getAccessibleContext();
@@ -667,4 +672,28 @@
             }
         }, c);
     }
+
+    /**
+     * @return AWTView ptr, a peer of the CPlatformView associated with the toplevel container of the Accessible, if any
+     */
+    private static long getAWTView(Accessible a) {
+        Accessible ax = CAccessible.getSwingAccessible(a);
+        if (!(ax instanceof Component)) return 0;
+
+        return invokeAndWait(new Callable<Long>() {
+            public Long call() throws Exception {
+                Component cont = (Component) ax;
+                while (cont != null && !(cont instanceof Window)) {
+                    cont = cont.getParent();
+                }
+                if (cont != null) {
+                    LWWindowPeer peer = (LWWindowPeer) AWTAccessor.getComponentAccessor().getPeer(cont);
+                    if (peer != null) {
+                        return ((CPlatformWindow) peer.getPlatformWindow()).getContentView().getAWTView();
+                    }
+                }
+                return 0L;
+            }
+        }, (Component)ax);
+    }
 }
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibleText.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibleText.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -264,6 +264,8 @@
                 final double localY = boundsUnion.getY();
 
                 final Point componentLocation = ac.getAccessibleComponent().getLocationOnScreen();
+                if (componentLocation == null) return ret;
+
                 final double screenX = componentLocation.getX() + localX;
                 final double screenY = componentLocation.getY() + localY;
 
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.h	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -62,6 +62,8 @@
 - (void) deliverJavaMouseEvent: (NSEvent *) event;
 - (jobject) awtComponent:(JNIEnv *)env;
 
++ (AWTView *) awtView:(JNIEnv *)env ofAccessible:(jobject)jaccessible;
+
 // Input method-related events
 - (void)setInputMethod:(jobject)inputMethod;
 - (void)abandonInput;
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m	Wed Jul 05 21:40:37 2017 +0200
@@ -29,6 +29,7 @@
 #import "AWTWindow.h"
 #import "JavaComponentAccessibility.h"
 #import "JavaTextAccessibility.h"
+#import "JavaAccessibilityUtilities.h"
 #import "GeomUtilities.h"
 #import "OSVersion.h"
 #import "ThreadUtilities.h"
@@ -129,7 +130,7 @@
     self.cglLayer = nil;
     
     JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
-    (*env)->DeleteGlobalRef(env, m_cPlatformView);
+    (*env)->DeleteWeakGlobalRef(env, m_cPlatformView);
     m_cPlatformView = NULL;
     
     if (fInputMethodLOCKABLE != NULL)
@@ -396,7 +397,11 @@
     
     static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView");
     static JNF_MEMBER_CACHE(jm_deliverMouseEvent, jc_PlatformView, "deliverMouseEvent", "(Lsun/lwawt/macosx/NSEvent;)V");
-    JNFCallVoidMethod(env, m_cPlatformView, jm_deliverMouseEvent, jEvent);
+    jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView);
+    if (!(*env)->IsSameObject(env, jlocal, NULL)) {
+        JNFCallVoidMethod(env, jlocal, jm_deliverMouseEvent, jEvent);
+        (*env)->DeleteLocalRef(env, jlocal);
+    }
     (*env)->DeleteLocalRef(env, jEvent);
 }
 
@@ -459,8 +464,11 @@
     static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView");
     static JNF_MEMBER_CACHE(jm_deliverKeyEvent, jc_PlatformView,
                             "deliverKeyEvent", "(Lsun/lwawt/macosx/NSEvent;)V");
-    JNFCallVoidMethod(env, m_cPlatformView, jm_deliverKeyEvent, jEvent);
-    
+    jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView);
+    if (!(*env)->IsSameObject(env, jlocal, NULL)) {
+        JNFCallVoidMethod(env, jlocal, jm_deliverKeyEvent, jEvent);
+        (*env)->DeleteLocalRef(env, jlocal);
+    }
     if (characters != NULL) {
         (*env)->DeleteLocalRef(env, characters);
     }
@@ -475,7 +483,12 @@
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView");
     static JNF_MEMBER_CACHE(jm_deliverResize, jc_PlatformView, "deliverResize", "(IIII)V");
-    JNFCallVoidMethod(env, m_cPlatformView, jm_deliverResize, x,y,w,h);
+
+    jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView);
+    if (!(*env)->IsSameObject(env, jlocal, NULL)) {
+        JNFCallVoidMethod(env, jlocal, jm_deliverResize, x,y,w,h);
+        (*env)->DeleteLocalRef(env, jlocal);
+    }
 }
 
 
@@ -504,7 +517,11 @@
          */
         static JNF_CLASS_CACHE(jc_CPlatformView, "sun/lwawt/macosx/CPlatformView");
         static JNF_MEMBER_CACHE(jm_deliverWindowDidExposeEvent, jc_CPlatformView, "deliverWindowDidExposeEvent", "()V");
-        JNFCallVoidMethod(env, m_cPlatformView, jm_deliverWindowDidExposeEvent);
+        jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView);
+        if (!(*env)->IsSameObject(env, jlocal, NULL)) {
+            JNFCallVoidMethod(env, jlocal, jm_deliverWindowDidExposeEvent);
+            (*env)->DeleteLocalRef(env, jlocal);
+        }
         /*
          }
          */
@@ -541,7 +558,13 @@
         }
         return NULL;
     }
-    jobject peer = JNFGetObjectField(env, m_cPlatformView, jf_Peer);
+
+    jobject peer = NULL;
+    jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView);
+    if (!(*env)->IsSameObject(env, jlocal, NULL)) {
+        peer = JNFGetObjectField(env, jlocal, jf_Peer);
+        (*env)->DeleteLocalRef(env, jlocal);
+    }
     static JNF_CLASS_CACHE(jc_LWWindowPeer, "sun/lwawt/LWWindowPeer");
     static JNF_MEMBER_CACHE(jf_Target, jc_LWWindowPeer, "target", "Ljava/awt/Component;");
     if (peer == NULL) {
@@ -549,12 +572,27 @@
         JNFDumpJavaStack(env);
         return NULL;
     }
-    return JNFGetObjectField(env, peer, jf_Target);
+    jobject comp = JNFGetObjectField(env, peer, jf_Target);
+    (*env)->DeleteLocalRef(env, peer);
+    return comp;
+}
+
++ (AWTView *) awtView:(JNIEnv*)env ofAccessible:(jobject)jaccessible
+{
+    static JNF_STATIC_MEMBER_CACHE(jm_getAWTView, sjc_CAccessibility, "getAWTView", "(Ljavax/accessibility/Accessible;)J");
+
+    jlong jptr = JNFCallStaticLongMethod(env, jm_getAWTView, jaccessible);
+    if (jptr == 0) return nil;
+
+    return (AWTView *)jlong_to_ptr(jptr);
 }
 
 - (id)getAxData:(JNIEnv*)env
 {
-    return [[[JavaComponentAccessibility alloc] initWithParent:self withEnv:env withAccessible:[self awtComponent:env] withIndex:-1 withView:self withJavaRole:nil] autorelease];
+    jobject jcomponent = [self awtComponent:env];
+    id ax = [[[JavaComponentAccessibility alloc] initWithParent:self withEnv:env withAccessible:jcomponent withIndex:-1 withView:self withJavaRole:nil] autorelease];
+    (*env)->DeleteLocalRef(env, jcomponent);
+    return ax;
 }
 
 - (NSArray *)accessibilityAttributeNames
@@ -1299,7 +1337,7 @@
     JNF_COCOA_ENTER(env);
     
     NSRect rect = NSMakeRect(originX, originY, width, height);
-    jobject cPlatformView = (*env)->NewGlobalRef(env, obj);
+    jobject cPlatformView = (*env)->NewWeakGlobalRef(env, obj);
     
     [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
         
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityAction.m	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityAction.m	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -35,9 +35,9 @@
 {
     self = [super init];
     if (self) {
-        fAccessibleAction = JNFNewGlobalRef(env, accessibleAction);
+        fAccessibleAction = JNFNewWeakGlobalRef(env, accessibleAction);
         fIndex = index;
-        fComponent = JNFNewGlobalRef(env, component);
+        fComponent = JNFNewWeakGlobalRef(env, component);
     }
     return self;
 }
@@ -46,10 +46,10 @@
 {
     JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
 
-    JNFDeleteGlobalRef(env, fAccessibleAction);
+    JNFDeleteWeakGlobalRef(env, fAccessibleAction);
     fAccessibleAction = NULL;
 
-    JNFDeleteGlobalRef(env, fComponent);
+    JNFDeleteWeakGlobalRef(env, fComponent);
     fComponent = NULL;
 
     [super dealloc];
@@ -61,7 +61,18 @@
 
     JNIEnv* env = [ThreadUtilities getJNIEnv];
 
-    return JNFJavaToNSString(env, JNFCallStaticObjectMethod(env, jm_getAccessibleActionDescription, fAccessibleAction, fIndex, fComponent)); // AWT_THREADING Safe (AWTRunLoopMode)
+    jobject fCompLocal = (*env)->NewLocalRef(env, fComponent);
+    if ((*env)->IsSameObject(env, fCompLocal, NULL)) {
+        return @"unknown";
+    }
+    NSString *str = nil;
+    jobject jstr = JNFCallStaticObjectMethod(env, jm_getAccessibleActionDescription, fAccessibleAction, fIndex, fCompLocal);
+    if (jstr != NULL) {
+        NSString *str = JNFJavaToNSString(env, jstr); // AWT_THREADING Safe (AWTRunLoopMode)
+        (*env)->DeleteLocalRef(env, jstr);
+    }
+    (*env)->DeleteLocalRef(env, fCompLocal);
+    return str == nil ? @"unknown" : str;
 }
 
 - (void)perform
@@ -82,9 +93,9 @@
 {
     self = [super init];
     if (self) {
-        fTabGroup = JNFNewGlobalRef(env, tabGroup);
+        fTabGroup = JNFNewWeakGlobalRef(env, tabGroup);
         fIndex = index;
-        fComponent = JNFNewGlobalRef(env, component);
+        fComponent = JNFNewWeakGlobalRef(env, component);
     }
     return self;
 }
@@ -93,10 +104,10 @@
 {
     JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
 
-    JNFDeleteGlobalRef(env, fTabGroup);
+    JNFDeleteWeakGlobalRef(env, fTabGroup);
     fTabGroup = NULL;
 
-    JNFDeleteGlobalRef(env, fComponent);
+    JNFDeleteWeakGlobalRef(env, fComponent);
     fComponent = NULL;
 
     [super dealloc];
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -77,7 +77,9 @@
     jobject axRole = JNFCallStaticObjectMethod(env, sjm_getAccessibleRole, axComponent, component); // AWT_THREADING Safe (AWTRunLoopMode)
     if (axRole == NULL) return @"unknown";
 
-    return JNFJavaToNSString(env, axRole);
+    NSString* str = JNFJavaToNSString(env, axRole);
+    (*env)->DeleteLocalRef(env, axRole);
+    return str;
 }
 
 jobject getAxSelection(JNIEnv *env, jobject axContext, jobject component)
@@ -126,21 +128,27 @@
 {
     static JNF_STATIC_MEMBER_CACHE(jm_VERTICAL, sjc_AccessibleState, "VERTICAL", "Ljavax/accessibility/AccessibleState;");
     jobject axVertState = JNFGetStaticObjectField(env, jm_VERTICAL);
-    return containsAxState(env, axContext, axVertState, component);
+    BOOL vertical = containsAxState(env, axContext, axVertState, component);
+    (*env)->DeleteLocalRef(env, axVertState);
+    return vertical;
 }
 
 BOOL isHorizontal(JNIEnv *env, jobject axContext, jobject component)
 {
     static JNF_STATIC_MEMBER_CACHE(jm_HORIZONTAL, sjc_AccessibleState, "HORIZONTAL", "Ljavax/accessibility/AccessibleState;");
     jobject axHorizState = JNFGetStaticObjectField(env, jm_HORIZONTAL);
-    return containsAxState(env, axContext, axHorizState, component);
+    BOOL horizontal = containsAxState(env, axContext, axHorizState, component);
+    (*env)->DeleteLocalRef(env, axHorizState);
+    return horizontal;
 }
 
 BOOL isShowing(JNIEnv *env, jobject axContext, jobject component)
 {
     static JNF_STATIC_MEMBER_CACHE(jm_SHOWING, sjc_AccessibleState, "SHOWING", "Ljavax/accessibility/AccessibleState;");
     jobject axVisibleState = JNFGetStaticObjectField(env, jm_SHOWING);
-    return containsAxState(env, axContext, axVisibleState, component);
+    BOOL showing = containsAxState(env, axContext, axVisibleState, component);
+    (*env)->DeleteLocalRef(env, axVisibleState);
+    return showing;
 }
 
 NSPoint getAxComponentLocationOnScreen(JNIEnv *env, jobject axComponent, jobject component)
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -75,7 +75,6 @@
 static NSMutableDictionary *sAttributeNamesForRoleCache = nil;
 static NSObject *sAttributeNamesLOCK = nil;
 
-
 @interface TabGroupAccessibility : JavaComponentAccessibility {
     NSInteger _numTabs;
 }
@@ -137,8 +136,11 @@
         fView = [view retain];
         fJavaRole = [javaRole retain];
 
-        fAccessible = JNFNewGlobalRef(env, accessible);
-        fComponent = JNFNewGlobalRef(env, [(AWTView *)fView awtComponent:env]);
+        fAccessible = (*env)->NewWeakGlobalRef(env, accessible);
+        
+        jobject jcomponent = [(AWTView *)fView awtComponent:env];
+        fComponent = (*env)->NewWeakGlobalRef(env, jcomponent);
+        (*env)->DeleteLocalRef(env, jcomponent);
 
         fIndex = index;
 
@@ -166,10 +168,10 @@
 
     JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
 
-    JNFDeleteGlobalRef(env, fAccessible);
+    (*env)->DeleteWeakGlobalRef(env, fAccessible);
     fAccessible = NULL;
 
-    JNFDeleteGlobalRef(env, fComponent);
+    (*env)->DeleteWeakGlobalRef(env, fComponent);
     fComponent = NULL;
 
     [fParent release];
@@ -279,7 +281,7 @@
 
 + (NSArray *)childrenOfParent:(JavaComponentAccessibility *)parent withEnv:(JNIEnv *)env withChildrenCode:(NSInteger)whichChildren allowIgnored:(BOOL)allowIgnored
 {
-    jobjectArray jchildrenAndRoles = JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, parent->fAccessible, parent->fComponent, whichChildren, allowIgnored); // AWT_THREADING Safe (AWTRunLoop)
+    jobjectArray jchildrenAndRoles = (jobjectArray)JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, parent->fAccessible, parent->fComponent, whichChildren, allowIgnored); // AWT_THREADING Safe (AWTRunLoop)
     if (jchildrenAndRoles == NULL) return nil;
 
     jsize arrayLen = (*env)->GetArrayLength(env, jchildrenAndRoles);
@@ -294,14 +296,21 @@
 
         NSString *childJavaRole = nil;
         if (jchildJavaRole != NULL) {
-            childJavaRole = JNFJavaToNSString(env, JNFGetObjectField(env, jchildJavaRole, sjf_key));
+            jobject jkey = JNFGetObjectField(env, jchildJavaRole, sjf_key);
+            childJavaRole = JNFJavaToNSString(env, jkey);
+            (*env)->DeleteLocalRef(env, jkey);
         }
 
         JavaComponentAccessibility *child = [self createWithParent:parent accessible:jchild role:childJavaRole index:childIndex withEnv:env withView:parent->fView];
+        
+        (*env)->DeleteLocalRef(env, jchild);
+        (*env)->DeleteLocalRef(env, jchildJavaRole);
+        
         [children addObject:child];
         childIndex++;
     }
-
+    (*env)->DeleteLocalRef(env, jchildrenAndRoles);
+    
     return children;
 }
 
@@ -310,7 +319,7 @@
     jobject jcomponent = [(AWTView *)view awtComponent:env];
     jint index = JNFCallStaticIntMethod(env, sjm_getAccessibleIndexInParent, jaccessible, jcomponent);
     NSString *javaRole = getJavaRole(env, jaccessible, jcomponent);
-
+    (*env)->DeleteLocalRef(env, jcomponent);
     return [self createWithAccessible:jaccessible role:javaRole index:index withEnv:env withView:view];
 }
 
@@ -325,7 +334,10 @@
     jobject jCAX = [JavaComponentAccessibility getCAccessible:jaccessible withEnv:env];
     if (jCAX == NULL) return nil;
     JavaComponentAccessibility *value = (JavaComponentAccessibility *) jlong_to_ptr(JNFGetLongField(env, jCAX, jf_ptr));
-    if (value != nil) return [[value retain] autorelease];
+    if (value != nil) {
+        (*env)->DeleteLocalRef(env, jCAX);
+        return [[value retain] autorelease];
+    }
 
     // otherwise, create a new instance
     JavaComponentAccessibility *newChild = nil;
@@ -348,6 +360,7 @@
     // must hard retain pointer poked into Java object
     [newChild retain];
     JNFSetLongField(env, jCAX, jf_ptr, ptr_to_jlong(newChild));
+    (*env)->DeleteLocalRef(env, jCAX);
 
     // return autoreleased instance
     return [newChild autorelease];
@@ -380,7 +393,7 @@
 
     // Get all the other accessibility attributes states we need in one swell foop.
     // javaRole isn't pulled in because we need protected access to AccessibleRole.key
-    jbooleanArray attributeStates = JNFCallStaticObjectMethod(env, jm_getInitialAttributeStates, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
+    jbooleanArray attributeStates = (jbooleanArray)JNFCallStaticObjectMethod(env, jm_getInitialAttributeStates, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
     if (attributeStates == NULL) return nil;
     jboolean *attributeStatesArray = (*env)->GetBooleanArrayElements(env, attributeStates, 0);
     if (attributeStatesArray == NULL) {
@@ -475,6 +488,7 @@
         JavaAxAction *action = [[JavaAxAction alloc] initWithEnv:env withAccessibleAction:axAction withIndex:0 withComponent:fComponent];
         [fActions setObject:action forKey:[self isMenu] ? NSAccessibilityPickAction : NSAccessibilityPressAction];
         [action release];
+        (*env)->DeleteLocalRef(env, axAction);
     }
 }
 
@@ -485,7 +499,9 @@
 
 - (id)parent
 {
+    static JNF_CLASS_CACHE(sjc_Window, "java/awt/Window");
     static JNF_STATIC_MEMBER_CACHE(sjm_getAccessibleParent, sjc_CAccessibility, "getAccessibleParent", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;)Ljavax/accessibility/Accessible;");
+    static JNF_STATIC_MEMBER_CACHE(sjm_getSwingAccessible, sjc_CAccessible, "getSwingAccessible", "(Ljavax/accessibility/Accessible;)Ljavax/accessibility/Accessible;");
 
     if(fParent == nil) {
         JNIEnv* env = [ThreadUtilities getJNIEnv];
@@ -495,10 +511,21 @@
         if (jparent == NULL) {
             fParent = fView;
         } else {
-            fParent = [JavaComponentAccessibility createWithAccessible:jparent withEnv:env withView:fView];
+            AWTView *view = fView;
+            jobject jax = JNFCallStaticObjectMethod(env, sjm_getSwingAccessible, fAccessible);
+
+            if (JNFIsInstanceOf(env, jax, &sjc_Window)) {
+                // In this case jparent is an owner toplevel and we should retrieve its own view
+                view = [AWTView awtView:env ofAccessible:jparent];
+            }
+            if (view != nil) {
+                fParent = [JavaComponentAccessibility createWithAccessible:jparent withEnv:env withView:view];
+            }
             if (fParent == nil) {
                 fParent = fView;
             }
+            (*env)->DeleteLocalRef(env, jparent);
+            (*env)->DeleteLocalRef(env, jax );
         }
         [fParent retain];
     }
@@ -546,7 +573,10 @@
         return NO;
     }
 
-    return isShowing(env, [self axContextWithEnv:env], fComponent);
+    jobject axContext = [self axContextWithEnv:env];
+    BOOL showing = isShowing(env, axContext, fComponent);
+    (*env)->DeleteLocalRef(env, axContext);
+    return showing;
 }
 
 // the array of names for each role is cached in the sAttributeNamesForRoleCache
@@ -723,7 +753,12 @@
     JNIEnv* env = [ThreadUtilities getJNIEnv];
 
     jobject val = JNFCallStaticObjectMethod(env, sjm_getAccessibleDescription, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
-    return JNFJavaToNSString(env, val);
+    if (val == NULL) {
+        return @"unknown";
+    }
+    NSString* str = JNFJavaToNSString(env, val);
+    (*env)->DeleteLocalRef(env, val);
+    return str;
 }
 
 - (BOOL)accessibilityIsHelpAttributeSettable
@@ -739,7 +774,12 @@
     JNIEnv* env = [ThreadUtilities getJNIEnv];
 
     jobject axValue = JNFCallStaticObjectMethod(env, jm_getMaximumAccessibleValue, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
-    return JNFJavaToNSNumber(env, axValue);
+    if (axValue == NULL) {
+        return [NSNumber numberWithInt:0];
+    }
+    NSNumber* num = JNFJavaToNSNumber(env, axValue);
+    (*env)->DeleteLocalRef(env, axValue);
+    return num;
 }
 
 - (BOOL)accessibilityIsMaxValueAttributeSettable
@@ -755,7 +795,12 @@
     JNIEnv* env = [ThreadUtilities getJNIEnv];
 
     jobject axValue = JNFCallStaticObjectMethod(env, jm_getMinimumAccessibleValue, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
-    return JNFJavaToNSNumber(env, axValue);
+    if (axValue == NULL) {
+        return [NSNumber numberWithInt:0];
+    }
+    NSNumber* num = JNFJavaToNSNumber(env, axValue);
+    (*env)->DeleteLocalRef(env, axValue);
+    return num;
 }
 
 - (BOOL)accessibilityIsMinValueAttributeSettable
@@ -770,13 +815,16 @@
 
     // cmcnote - should batch these two calls into one that returns an array of two bools, one for vertical and one for horiz
     if (isVertical(env, axContext, fComponent)) {
+        (*env)->DeleteLocalRef(env, axContext);
         return NSAccessibilityVerticalOrientationValue;
     }
 
     if (isHorizontal(env, axContext, fComponent)) {
+        (*env)->DeleteLocalRef(env, axContext);
         return NSAccessibilityHorizontalOrientationValue;
     }
 
+    (*env)->DeleteLocalRef(env, axContext);
     return nil;
 }
 
@@ -808,6 +856,7 @@
     // Get the java screen coords, and make a NSPoint of the bottom left of the AxComponent.
     NSSize size = getAxComponentSize(env, axComponent, fComponent);
     NSPoint point = getAxComponentLocationOnScreen(env, axComponent, fComponent);
+    (*env)->DeleteLocalRef(env, axComponent);
 
     point.y += size.height;
 
@@ -857,8 +906,9 @@
         JNIEnv* env = [ThreadUtilities getJNIEnv];
 
         jobject axRole = JNFCallStaticObjectMethod(env, jm_getAccessibleRoleDisplayString, fAccessible, fComponent);
-        if(axRole != NULL) {
+        if (axRole != NULL) {
             value = JNFJavaToNSString(env, axRole);
+            (*env)->DeleteLocalRef(env, axRole);
         } else {
             value = @"unknown";
         }
@@ -893,7 +943,9 @@
 - (NSValue *)accessibilitySizeAttribute {
     JNIEnv* env = [ThreadUtilities getJNIEnv];
     jobject axComponent = JNFCallStaticObjectMethod(env, sjm_getAccessibleComponent, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
-    return [NSValue valueWithSize:getAxComponentSize(env, axComponent, fComponent)];
+    NSValue* size = [NSValue valueWithSize:getAxComponentSize(env, axComponent, fComponent)];
+    (*env)->DeleteLocalRef(env, axComponent);
+    return size;
 }
 
 - (BOOL)accessibilityIsSizeAttributeSettable
@@ -952,7 +1004,12 @@
     JNIEnv* env = [ThreadUtilities getJNIEnv];
 
     jobject val = JNFCallStaticObjectMethod(env, sjm_getAccessibleName, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
-    return JNFJavaToNSString(env, val);
+    if (val == NULL) {
+        return @"unknown";
+    }
+    NSString* str = JNFJavaToNSString(env, val);
+    (*env)->DeleteLocalRef(env, val);
+    return str;
 }
 
 - (BOOL)accessibilityIsTitleAttributeSettable
@@ -984,8 +1041,20 @@
     // a text value is taken care of in JavaTextAccessibility
 
     // cmcnote should coalesce these calls into one java call
+    NSNumber *num = nil;
     jobject axValue = JNFCallStaticObjectMethod(env, sjm_getAccessibleValue, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
-    return JNFJavaToNSNumber(env, JNFCallStaticObjectMethod(env, jm_getCurrentAccessibleValue, axValue, fComponent)); // AWT_THREADING Safe (AWTRunLoop)
+    if (axValue != NULL) {
+        jobject str = JNFCallStaticObjectMethod(env, jm_getCurrentAccessibleValue, axValue, fComponent);
+        if (str != NULL) {
+            num = JNFJavaToNSNumber(env, str); // AWT_THREADING Safe (AWTRunLoop)
+            (*env)->DeleteLocalRef(env, str);
+        }
+        (*env)->DeleteLocalRef(env, axValue);
+    }
+    if (num == nil) {
+        num = [NSNumber numberWithInt:0];
+    }
+    return num;
 }
 
 - (BOOL)accessibilityIsValueAttributeSettable
@@ -1084,7 +1153,10 @@
     id value = nil;
     if (JNFIsInstanceOf(env, jparent, &jc_Container)) {
         jobject jaccessible = JNFCallStaticObjectMethod(env, jm_accessibilityHitTest, jparent, (jfloat)point.x, (jfloat)point.y); // AWT_THREADING Safe (AWTRunLoop)
-        value = [JavaComponentAccessibility createWithAccessible:jaccessible withEnv:env withView:fView];
+        if (jaccessible != NULL) {
+            value = [JavaComponentAccessibility createWithAccessible:jaccessible withEnv:env withView:fView];
+            (*env)->DeleteLocalRef(env, jaccessible);
+        }
     }
 
     if (value == nil) {
@@ -1116,6 +1188,7 @@
         if (JNFIsInstanceOf(env, focused, &sjc_Accessible)) {
             value = [JavaComponentAccessibility createWithAccessible:focused withEnv:env withView:fView];
         }
+        (*env)->DeleteLocalRef(env, focused);
     }
 
     if (value == nil) {
@@ -1222,38 +1295,46 @@
     for (i = 0; i < _numTabs; i++) {
         aTab = (JavaComponentAccessibility *)[tabs objectAtIndex:i];
         if ([aTab isAccessibleWithEnv:env forAccessible:selAccessible]) {
+            (*env)->DeleteLocalRef(env, selAccessible);
             return aTab;
         }
     }
-
+    (*env)->DeleteLocalRef(env, selAccessible);
     return nil;
 }
 
 - (NSArray *)tabControlsWithEnv:(JNIEnv *)env withTabGroupAxContext:(jobject)axContext withTabCode:(NSInteger)whichTabs allowIgnored:(BOOL)allowIgnored
 {
-    jobjectArray jtabsAndRoles = JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, fAccessible, fComponent, whichTabs, allowIgnored); // AWT_THREADING Safe (AWTRunLoop)
+    jobjectArray jtabsAndRoles = (jobjectArray)JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, fAccessible, fComponent, whichTabs, allowIgnored); // AWT_THREADING Safe (AWTRunLoop)
     if(jtabsAndRoles == NULL) return nil;
 
     jsize arrayLen = (*env)->GetArrayLength(env, jtabsAndRoles);
-    if (arrayLen == 0) return nil;
-
+    if (arrayLen == 0) {
+        (*env)->DeleteLocalRef(env, jtabsAndRoles);
+        return nil;
+    }
     NSMutableArray *tabs = [NSMutableArray arrayWithCapacity:(arrayLen/2)];
 
     // all of the tabs have the same role, so we can just find out what that is here and use it for all the tabs
     jobject jtabJavaRole = (*env)->GetObjectArrayElement(env, jtabsAndRoles, 1); // the array entries alternate between tab/role, starting with tab. so the first role is entry 1.
-    if (jtabJavaRole == NULL) return nil;
-
-    NSString *tabJavaRole = JNFJavaToNSString(env, JNFGetObjectField(env, jtabJavaRole, sjf_key));
+    if (jtabJavaRole == NULL) {
+        (*env)->DeleteLocalRef(env, jtabsAndRoles);
+        return nil;
+    }
+    jobject jkey = JNFGetObjectField(env, jtabJavaRole, sjf_key);
+    NSString *tabJavaRole = JNFJavaToNSString(env, jkey);
+    (*env)->DeleteLocalRef(env, jkey);
 
     NSInteger i;
     NSUInteger tabIndex = (whichTabs >= 0) ? whichTabs : 0; // if we're getting one particular child, make sure to set its index correctly
     for(i = 0; i < arrayLen; i+=2) {
         jobject jtab = (*env)->GetObjectArrayElement(env, jtabsAndRoles, i);
         JavaComponentAccessibility *tab = [[[TabGroupControlAccessibility alloc] initWithParent:self withEnv:env withAccessible:jtab withIndex:tabIndex withTabGroup:axContext withView:[self view] withJavaRole:tabJavaRole] autorelease];
+        (*env)->DeleteLocalRef(env, jtab);
         [tabs addObject:tab];
         tabIndex++;
     }
-
+    (*env)->DeleteLocalRef(env, jtabsAndRoles);
     return tabs;
 }
 
@@ -1272,7 +1353,9 @@
 {
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     jobject axContext = [self axContextWithEnv:env];
-    return [self tabControlsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO];
+    id tabs = [self tabControlsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO];
+    (*env)->DeleteLocalRef(env, axContext);
+    return tabs;
 }
 
 - (BOOL)accessibilityIsTabsAttributeSettable
@@ -1292,7 +1375,9 @@
 {
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     jobject axContext = [self axContextWithEnv:env];
-    return [self contentsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO];
+    NSArray* cont = [self contentsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO];
+    (*env)->DeleteLocalRef(env, axContext);
+    return cont;
 }
 
 - (BOOL)accessibilityIsContentsAttributeSettable
@@ -1305,7 +1390,9 @@
 {
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     jobject axContext = [self axContextWithEnv:env];
-    return [self currentTabWithEnv:env withAxContext:axContext];
+    id val = [self currentTabWithEnv:env withAxContext:axContext];
+    (*env)->DeleteLocalRef(env, axContext);
+    return val;
 }
 
 - (BOOL)accessibilityIsValueAttributeSettable
@@ -1322,6 +1409,7 @@
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     jobject axContext = [self axContextWithEnv:env];
     setAxContextSelection(env, axContext, fIndex, fComponent);
+    (*env)->DeleteLocalRef(env, axContext);
 }
 
 - (NSArray *)accessibilityChildrenAttribute
@@ -1357,6 +1445,7 @@
                 result = children;
             }
         }
+        (*env)->DeleteLocalRef(env, axContext);
     } else {
         result = [super accessibilityArrayAttributeValues:attribute index:index maxCount:maxCount];
     }
@@ -1375,7 +1464,7 @@
     self = [super initWithParent:parent withEnv:env withAccessible:accessible withIndex:index withView:view withJavaRole:javaRole];
     if (self) {
         if (tabGroup != NULL) {
-            fTabGroupAxContext = JNFNewGlobalRef(env, tabGroup);
+            fTabGroupAxContext = JNFNewWeakGlobalRef(env, tabGroup);
         } else {
             fTabGroupAxContext = NULL;
         }
@@ -1388,7 +1477,7 @@
     JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
 
     if (fTabGroupAxContext != NULL) {
-        JNFDeleteGlobalRef(env, fTabGroupAxContext);
+        JNFDeleteWeakGlobalRef(env, fTabGroupAxContext);
         fTabGroupAxContext = NULL;
     }
 
@@ -1399,9 +1488,14 @@
 {
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     jobject axContext = [self axContextWithEnv:env];
+    jobject selAccessible = getAxContextSelection(env, [self tabGroup], fIndex, fComponent);
 
     // Returns the current selection of the page tab list
-    return [NSNumber numberWithBool:ObjectEquals(env, axContext, getAxContextSelection(env, [self tabGroup], fIndex, fComponent), fComponent)];
+    id val = [NSNumber numberWithBool:ObjectEquals(env, axContext, selAccessible, fComponent)];
+
+    (*env)->DeleteLocalRef(env, selAccessible);
+    (*env)->DeleteLocalRef(env, axContext);
+    return val;
 }
 
 - (void)getActionsWithEnv:(JNIEnv *)env
@@ -1416,7 +1510,8 @@
     if (fTabGroupAxContext == NULL) {
         JNIEnv* env = [ThreadUtilities getJNIEnv];
         jobject tabGroupAxContext = [(JavaComponentAccessibility *)[self parent] axContextWithEnv:env];
-        fTabGroupAxContext = JNFNewGlobalRef(env, tabGroupAxContext);
+        fTabGroupAxContext = JNFNewWeakGlobalRef(env, tabGroupAxContext);
+        (*env)->DeleteLocalRef(env, tabGroupAxContext);
     }
     return fTabGroupAxContext;
 }
@@ -1451,8 +1546,10 @@
         if ([[aElement accessibilityRoleAttribute] isEqualToString:NSAccessibilityScrollBarRole]) {
             jobject elementAxContext = [aElement axContextWithEnv:env];
             if (isHorizontal(env, elementAxContext, fComponent)) {
+                (*env)->DeleteLocalRef(env, elementAxContext);
                 return aElement;
             }
+            (*env)->DeleteLocalRef(env, elementAxContext);
         }
     }
 
@@ -1478,8 +1575,10 @@
         if ([[aElement accessibilityRoleAttribute] isEqualToString:NSAccessibilityScrollBarRole]) {
             jobject elementAxContext = [aElement axContextWithEnv:env];
             if (isVertical(env, elementAxContext, fComponent)) {
+                (*env)->DeleteLocalRef(env, elementAxContext);
                 return aElement;
             }
+            (*env)->DeleteLocalRef(env, elementAxContext);
         }
     }
 
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaTextAccessibility.m	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaTextAccessibility.m	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -112,7 +112,9 @@
         // if it's static text, the AppKit AXValue is the java accessibleName
         jobject axName = JNFCallStaticObjectMethod(env, sjm_getAccessibleName, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
         if (axName != NULL) {
-            return JNFJavaToNSString(env, axName);
+            NSString* str = JNFJavaToNSString(env, axName);
+            (*env)->DeleteLocalRef(env, axName);
+            return str;
         }
         // value is still nil if no accessibleName for static text. Below, try to get the accessibleText.
     }
@@ -120,12 +122,18 @@
     // cmcnote: inefficient to make three distinct JNI calls. Coalesce. radr://3951923
     jobject axText = JNFCallStaticObjectMethod(env, sjm_getAccessibleText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
     if (axText == NULL) return nil;
-
+    (*env)->DeleteLocalRef(env, axText);
+    
     jobject axEditableText = JNFCallStaticObjectMethod(env, sjm_getAccessibleEditableText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
     if (axEditableText == NULL) return nil;
 
     static JNF_STATIC_MEMBER_CACHE(jm_getTextRange, sjc_CAccessibleText, "getTextRange", "(Ljavax/accessibility/AccessibleEditableText;IILjava/awt/Component;)Ljava/lang/String;");
-    NSString *string = JNFJavaToNSString(env, JNFCallStaticObjectMethod(env, jm_getTextRange, axEditableText, 0, getAxTextCharCount(env, axEditableText, fComponent), fComponent)); // AWT_THREADING Safe (AWTRunLoop)
+    jobject jrange = JNFCallStaticObjectMethod(env, jm_getTextRange, axEditableText, 0, getAxTextCharCount(env, axEditableText, fComponent), fComponent);
+    NSString *string = JNFJavaToNSString(env, jrange); // AWT_THREADING Safe (AWTRunLoop)
+
+    (*env)->DeleteLocalRef(env, jrange);
+    (*env)->DeleteLocalRef(env, axEditableText);
+    
     if (string == nil) string = @"";
     return string;
 }
@@ -139,6 +147,7 @@
     JNIEnv* env = [ThreadUtilities getJNIEnv];
     jobject axEditableText = JNFCallStaticObjectMethod(env, sjm_getAccessibleEditableText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
     if (axEditableText == NULL) return NO;
+    (*env)->DeleteLocalRef(env, axEditableText);
     return YES;
 }
 
@@ -157,7 +166,9 @@
     static JNF_STATIC_MEMBER_CACHE(jm_getSelectedText, sjc_CAccessibleText, "getSelectedText", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;)Ljava/lang/String;");
     jobject axText = JNFCallStaticObjectMethod(env, jm_getSelectedText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
     if (axText == NULL) return @"";
-    return JNFJavaToNSString(env, axText);
+    NSString* str = JNFJavaToNSString(env, axText);
+    (*env)->DeleteLocalRef(env, axText);
+    return str;
 }
 
 - (BOOL)accessibilityIsSelectedTextAttributeSettable
@@ -220,7 +231,9 @@
     // also, static text doesn't always have accessibleText. if axText is null, should get the charcount of the accessibleName instead
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     jobject axText = JNFCallStaticObjectMethod(env, sjm_getAccessibleText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop)
-    return [NSNumber numberWithInt:getAxTextCharCount(env, axText, fComponent)];
+    NSNumber* num = [NSNumber numberWithInt:getAxTextCharCount(env, axText, fComponent)];
+    (*env)->DeleteLocalRef(env, axText);
+    return num;
 }
 
 - (BOOL)accessibilityIsNumberOfCharactersAttributeSettable
@@ -285,7 +298,7 @@
 
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     static JNF_STATIC_MEMBER_CACHE(jm_getBoundsForRange, sjc_CAccessibleText, "getBoundsForRange", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;II)[D");
-    jdoubleArray axBounds = JNFCallStaticObjectMethod(env, jm_getBoundsForRange, fAccessible, fComponent, range.location, range.length); // AWT_THREADING Safe (AWTRunLoop)
+    jdoubleArray axBounds = (jdoubleArray)JNFCallStaticObjectMethod(env, jm_getBoundsForRange, fAccessible, fComponent, range.location, range.length); // AWT_THREADING Safe (AWTRunLoop)
     if (axBounds == NULL) return nil;
 
     // We cheat because we know that the array is 4 elements long (x, y, width, height)
@@ -324,7 +337,7 @@
 
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     static JNF_STATIC_MEMBER_CACHE(jm_getRangeForLine, sjc_CAccessibleText, "getRangeForLine", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;I)[I");
-    jintArray axTextRange = JNFCallStaticObjectMethod(env, jm_getRangeForLine, fAccessible, fComponent, [line intValue]); // AWT_THREADING Safe (AWTRunLoop)
+    jintArray axTextRange = (jintArray)JNFCallStaticObjectMethod(env, jm_getRangeForLine, fAccessible, fComponent, [line intValue]); // AWT_THREADING Safe (AWTRunLoop)
     if (axTextRange == NULL) return nil;
 
     return javaIntArrayToNSRangeValue(env,axTextRange);
@@ -350,10 +363,12 @@
 
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     static JNF_STATIC_MEMBER_CACHE(jm_getStringForRange, sjc_CAccessibleText, "getStringForRange", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;II)Ljava/lang/String;");
-    jstring jstringForRange = JNFCallStaticObjectMethod(env, jm_getStringForRange, fAccessible, fComponent, range.location, range.length); // AWT_THREADING Safe (AWTRunLoop)
+    jstring jstringForRange = (jstring)JNFCallStaticObjectMethod(env, jm_getStringForRange, fAccessible, fComponent, range.location, range.length); // AWT_THREADING Safe (AWTRunLoop)
 
     if (jstringForRange == NULL) return @"";
-    return JNFJavaToNSString(env, jstringForRange);
+    NSString* str = JNFJavaToNSString(env, jstringForRange);
+    (*env)->DeleteLocalRef(env, jstringForRange);
+    return str;
 }
 
 //
@@ -406,7 +421,7 @@
 
     JNIEnv *env = [ThreadUtilities getJNIEnv];
     static JNF_STATIC_MEMBER_CACHE(jm_getRangeForIndex, sjc_CAccessibleText, "getRangeForIndex", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;I)[I");
-    jintArray axTextRange = JNFCallStaticObjectMethod(env, jm_getRangeForIndex, fAccessible, fComponent, index); // AWT_THREADING Safe (AWTRunLoop)
+    jintArray axTextRange = (jintArray)JNFCallStaticObjectMethod(env, jm_getRangeForIndex, fAccessible, fComponent, index); // AWT_THREADING Safe (AWTRunLoop)
     if (axTextRange == NULL) return nil;
 
     return javaIntArrayToNSRangeValue(env, axTextRange);
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.h	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -31,7 +31,7 @@
 @interface CGLLayer : CAOpenGLLayer
 {
 @private
-    JNFJObjectWrapper *javaLayer;
+    JNFWeakJObjectWrapper *javaLayer;
 
     // intermediate buffer, used the RQ lock to synchronize
     GLuint textureID;
@@ -45,7 +45,7 @@
 #endif /* REMOTELAYER */
 }
 
-@property (nonatomic, retain) JNFJObjectWrapper *javaLayer;
+@property (nonatomic, retain) JNFWeakJObjectWrapper *javaLayer;
 @property (readwrite, assign) GLuint textureID;
 @property (readwrite, assign) GLenum target;
 @property (readwrite, assign) float textureWidth;
@@ -57,7 +57,7 @@
 @property (nonatomic, retain) NSObject<JRSRemoteLayer> *jrsRemoteLayer;
 #endif
 
-- (id) initWithJavaLayer:(JNFJObjectWrapper *)javaLayer;
+- (id) initWithJavaLayer:(JNFWeakJObjectWrapper *)javaLayer;
 - (void) blitTexture;
 @end
 
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.m	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.m	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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 @@
 @synthesize jrsRemoteLayer;
 #endif
 
-- (id) initWithJavaLayer:(JNFJObjectWrapper *)layer;
+- (id) initWithJavaLayer:(JNFWeakJObjectWrapper *)layer;
 {
 AWT_ASSERT_APPKIT_THREAD;
     // Initialize ourselves
@@ -133,6 +133,15 @@
 {
     AWT_ASSERT_APPKIT_THREAD;
 
+    JNIEnv *env = [ThreadUtilities getJNIEnv];
+    static JNF_CLASS_CACHE(jc_JavaLayer, "sun/java2d/opengl/CGLLayer");
+    static JNF_MEMBER_CACHE(jm_drawInCGLContext, jc_JavaLayer, "drawInCGLContext", "()V");
+
+    jobject javaLayerLocalRef = [self.javaLayer jObjectWithEnv:env];
+    if ((*env)->IsSameObject(env, javaLayerLocalRef, NULL)) {
+        return;
+    }
+
     // Set the current context to the one given to us.
     CGLSetCurrentContext(glContext);
 
@@ -141,12 +150,7 @@
     glClear(GL_COLOR_BUFFER_BIT);
 
     glViewport(0, 0, textureWidth, textureHeight);
-    
-    JNIEnv *env = [ThreadUtilities getJNIEnv];
-    static JNF_CLASS_CACHE(jc_JavaLayer, "sun/java2d/opengl/CGLLayer");
-    static JNF_MEMBER_CACHE(jm_drawInCGLContext, jc_JavaLayer, "drawInCGLContext", "()V");
 
-    jobject javaLayerLocalRef = [self.javaLayer jObjectWithEnv:env];
     JNFCallVoidMethod(env, javaLayerLocalRef, jm_drawInCGLContext);
     (*env)->DeleteLocalRef(env, javaLayerLocalRef);
 
@@ -171,7 +175,7 @@
 
 JNF_COCOA_ENTER(env);
 
-    JNFJObjectWrapper *javaLayer = [JNFJObjectWrapper wrapperWithJObject:obj withEnv:env];
+    JNFWeakJObjectWrapper *javaLayer = [JNFWeakJObjectWrapper wrapperWithJObject:obj withEnv:env];
 
     [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
             AWT_ASSERT_APPKIT_THREAD;
--- a/jdk/src/java.desktop/share/native/libawt/awt/image/BufImgSurfaceData.c	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/awt/image/BufImgSurfaceData.c	Wed Jul 05 21:40:37 2017 +0200
@@ -231,12 +231,14 @@
         pRasInfo->redErrTable = NULL;
         pRasInfo->grnErrTable = NULL;
         pRasInfo->bluErrTable = NULL;
+        pRasInfo->representsPrimaries = 0;
     } else {
         pRasInfo->invColorTable = bipriv->cData->img_clr_tbl;
         pRasInfo->redErrTable = bipriv->cData->img_oda_red;
         pRasInfo->grnErrTable = bipriv->cData->img_oda_green;
         pRasInfo->bluErrTable = bipriv->cData->img_oda_blue;
         pRasInfo->invGrayTable = bipriv->cData->pGrayInverseLutData;
+        pRasInfo->representsPrimaries = bipriv->cData->representsPrimaries;
     }
 }
 
@@ -259,6 +261,59 @@
     }
 }
 
+static int calculatePrimaryColorsApproximation(int* cmap, unsigned char* cube, int cube_size) {
+    int i, j, k;
+    int index, value, color;
+    // values calculated from cmap
+    int r, g, b;
+    // maximum positive/negative variation allowed for r, g, b values for primary colors
+    int delta = 5;
+    // get the primary color cmap indices from corner of inverse color table
+    for (i = 0; i < cube_size; i += (cube_size - 1)) {
+        for (j = 0; j < cube_size; j += (cube_size - 1)) {
+            for (k = 0; k < cube_size; k += (cube_size - 1)) {
+                // calculate inverse color table index
+                index = i + cube_size * (j + cube_size * k);
+                // get value present in corners of inverse color table
+                value = cube[index];
+                // use the corner values as index for cmap
+                color = cmap[value];
+                // extract r,g,b values from cmap value
+                r = ((color) >> 16) & 0xff;
+                g = ((color) >> 8) & 0xff;
+                b = color & 0xff;
+                /*
+                 * If i/j/k value is 0 optimum value of b/g/r should be 0 but we allow
+                 * maximum positive variation of 5. If i/j/k value is 31 optimum value
+                 * of b/g/r should be 255 but we allow maximum negative variation of 5.
+                 */
+                if (i == 0) {
+                    if (b > delta)
+                        return 0;
+                } else {
+                    if (b < (255 - delta))
+                        return 0;
+                }
+                if (j == 0) {
+                    if (g > delta)
+                        return 0;
+                } else {
+                    if (g < (255 - delta))
+                        return 0;
+                }
+                if (k == 0) {
+                    if (r > delta)
+                        return 0;
+                } else {
+                    if (r < (255 - delta))
+                        return 0;
+                }
+            }
+        }
+    }
+    return 1;
+}
+
 static ColorData *BufImg_SetupICM(JNIEnv *env,
                                   BufImgSDOps *bisdo)
 {
@@ -298,6 +353,7 @@
         }
 
         cData->img_clr_tbl = initCubemap(pRgb, bisdo->lutsize, 32);
+        cData->representsPrimaries = calculatePrimaryColorsApproximation(pRgb, cData->img_clr_tbl, 32);
         if (allGray == JNI_TRUE) {
             initInverseGrayLut(pRgb, bisdo->lutsize, cData);
         }
--- a/jdk/src/java.desktop/share/native/libawt/java2d/SurfaceData.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/SurfaceData.h	Wed Jul 05 21:40:37 2017 +0200
@@ -163,6 +163,7 @@
     char                *grnErrTable;           /* Green ordered dither table */
     char                *bluErrTable;           /* Blue ordered dither table */
     int                 *invGrayTable;          /* Inverse gray table */
+    int                 representsPrimaries;    /* whether cmap represents primary colors */
     union {
         void            *align;                 /* ensures strict alignment */
         char            data[SD_RASINFO_PRIVATE_SIZE];
--- a/jdk/src/java.desktop/share/native/libawt/java2d/loops/ByteIndexed.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/ByteIndexed.h	Wed Jul 05 21:40:37 2017 +0200
@@ -43,7 +43,7 @@
     jint *PREFIX ## Lut;
 
 #define DeclareByteIndexedStoreVars(PREFIX) \
-    int PREFIX ## XDither, PREFIX ## YDither; \
+    int PREFIX ## XDither, PREFIX ## YDither, PREFIX ## RepPrims; \
     char *PREFIX ## rerr, *PREFIX ## gerr, *PREFIX ## berr; \
     unsigned char *PREFIX ## InvLut;
 
@@ -70,6 +70,7 @@
     do { \
         SetByteIndexedStoreVarsYPos(PREFIX, pRasInfo, (pRasInfo)->bounds.y1); \
         PREFIX ## InvLut = (pRasInfo)->invColorTable; \
+        PREFIX ## RepPrims = (pRasInfo)->representsPrimaries; \
     } while (0)
 
 #define InitByteIndexedStoreVarsX(PREFIX, pRasInfo) \
@@ -168,9 +169,14 @@
 
 #define StoreByteIndexedFrom3ByteRgb(pRas, PREFIX, x, r, g, b) \
     do { \
-        r += PREFIX ## rerr[PREFIX ## XDither]; \
-        g += PREFIX ## gerr[PREFIX ## XDither]; \
-        b += PREFIX ## berr[PREFIX ## XDither]; \
+        if (!(((r == 0) || (r == 255)) && \
+              ((g == 0) || (g == 255)) && \
+              ((b == 0) || (b == 255)) && \
+              PREFIX ## RepPrims)) { \
+            r += PREFIX ## rerr[PREFIX ## XDither]; \
+            g += PREFIX ## gerr[PREFIX ## XDither]; \
+            b += PREFIX ## berr[PREFIX ## XDither]; \
+        } \
         ByteClamp3Components(r, g, b); \
         (pRas)[x] = SurfaceData_InvColorMap(PREFIX ## InvLut, r, g, b); \
     } while (0)
--- a/jdk/src/java.desktop/share/native/libawt/java2d/loops/FourByteAbgr.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/FourByteAbgr.h	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -191,4 +191,11 @@
                                    COMP_PREFIX ## A, COMP_PREFIX ## R, \
                                    COMP_PREFIX ## G, COMP_PREFIX ## B)
 
+/*
+ * SrcOver ## TYPE ## BlendFactor
+ * Returns appropriate blend value for use in blending calculations.
+ */
+#define SrcOverFourByteAbgrBlendFactor(dF, dA) \
+    (dA)
+
 #endif /* FourByteAbgr_h_Included */
--- a/jdk/src/java.desktop/share/native/libawt/java2d/loops/FourByteAbgrPre.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/FourByteAbgrPre.h	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -217,4 +217,11 @@
         (pRas)[4*(x)+3] = (jubyte) COMP_PREFIX ## R; \
     } while (0)
 
+/*
+ * SrcOver ## TYPE ## BlendFactor
+ * Returns appropriate blend value for use in blending calculations.
+ */
+#define SrcOverFourByteAbgrPreBlendFactor(dF, dA) \
+    (dF)
+
 #endif /* FourByteAbgrPre_h_Included */
--- a/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgb.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgb.h	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -208,4 +208,11 @@
         COMP_PREFIX ## A = (COMP_PREFIX ## A << 8) + COMP_PREFIX ## A; \
     } while (0)
 
+/*
+ * SrcOver ## TYPE ## BlendFactor
+ * Returns appropriate blend value for use in blending calculations.
+ */
+#define SrcOverIntArgbBlendFactor(dF, dA) \
+    (dA)
+
 #endif /* IntArgb_h_Included */
--- a/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgbBm.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgbBm.h	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2016, 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
@@ -206,4 +206,11 @@
         COMP_PREFIX ## A = (COMP_PREFIX ## A << 8) + COMP_PREFIX ## A; \
     } while (0)
 
+/*
+ * SrcOver ## TYPE ## BlendFactor
+ * Returns appropriate blend value for use in blending calculations.
+ */
+#define SrcOverIntArgbBmBlendFactor(dF, dA) \
+    (dA)
+
 #endif /* IntArgbBm_h_Included */
--- a/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgbPre.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgbPre.h	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -216,4 +216,11 @@
                                             COMP_PREFIX ## G, \
                                             COMP_PREFIX ## B)
 
+/*
+ * SrcOver ## TYPE ## BlendFactor
+ * Returns appropriate blend value for use in blending calculations.
+ */
+#define SrcOverIntArgbPreBlendFactor(dF, dA) \
+    (dF)
+
 #endif /* IntArgbPre_h_Included */
--- a/jdk/src/java.desktop/share/native/libawt/java2d/loops/LoopMacros.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/LoopMacros.h	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -1668,31 +1668,83 @@
         } \
     } while (0);
 
+/*
+ * Antialiased glyph drawing results in artifacts around the character edges
+ * when text is drawn ontop of translucent background color. The standard
+ * blending equation for two colors:
+ * destColor = srcColor * glyphAlpha + destColor * (1 - glyphAlpha)
+ * works only when srcColor and destColor are opaque. For translucent srcColor
+ * and destColor, the respective alpha components in each color will influence
+ * the visibility of the color and the visibility of the color below it. Hence
+ * the equation for blending is given as:
+ * resA = srcAlpha + dstAlpha * (1 - srcAlpha)
+ * resCol = (srcColor * srcAlpha + destColor * destAlpha * (1- srcAlpha))/resA
+ * In addition, srcAlpha is multiplied with the glyphAlpha- that indicates the
+ * grayscale mask value of the glyph being drawn. The combined result provides
+ * smooth antialiased text on the buffer without any artifacts. Since the
+ * logic is executed for every pixel in a glyph, the implementation is further
+ * optimized to reduce computation and improve execution time.
+ */
 #define GlyphListAABlend4ByteArgb(DST, GLYPH_PIXELS, PIXEL_INDEX, DST_PTR, \
                                   FG_PIXEL, PREFIX, SRC_PREFIX) \
-   do { \
-        DeclareAlphaVarFor4ByteArgb(dstA) \
-        DeclareCompVarsFor4ByteArgb(dst) \
+    do { \
+        DeclareAlphaVarFor4ByteArgb(resA) \
+        DeclareCompVarsFor4ByteArgb(res) \
         jint mixValSrc = GLYPH_PIXELS[PIXEL_INDEX]; \
         if (mixValSrc) { \
-            if (mixValSrc < 255) { \
-                jint mixValDst = 255 - mixValSrc; \
-                Load ## DST ## To4ByteArgb(DST_PTR, pix, PIXEL_INDEX, \
-                                           dstA, dstR, dstG, dstB); \
-                dstA = MUL8(dstA, mixValDst) + \
-                       MUL8(SRC_PREFIX ## A, mixValSrc); \
-                MultMultAddAndStore4ByteArgbComps(dst, mixValDst, dst, \
-                                                  mixValSrc, SRC_PREFIX); \
-                if (!(DST ## IsOpaque) && \
-                    !(DST ## IsPremultiplied) && dstA && dstA < 255) { \
-                    DivideAndStore4ByteArgbComps(dst, dst, dstA); \
+            if (mixValSrc != 0xff) { \
+                PromoteByteAlphaFor4ByteArgb(mixValSrc); \
+                resA = MultiplyAlphaFor4ByteArgb(mixValSrc, SRC_PREFIX ## A); \
+            } else { \
+                resA = SRC_PREFIX ## A; \
+            } \
+            if (resA != MaxValFor4ByteArgb) { \
+                DeclareAndInvertAlphaVarFor4ByteArgb(dstF, resA) \
+                DeclareAndClearAlphaVarFor4ByteArgb(dstA) \
+                DeclareCompVarsFor4ByteArgb(dst) \
+                DeclareCompVarsFor4ByteArgb(tmp) \
+                MultiplyAndStore4ByteArgbComps(res, resA, SRC_PREFIX); \
+                if (!(DST ## IsPremultiplied)) { \
+                    Load ## DST ## To4ByteArgb(DST_PTR, pix, PIXEL_INDEX, \
+                                               dstA, dstR, dstG, dstB); \
+                    Store4ByteArgbCompsUsingOp(tmp, =, dst); \
+                } else { \
+                    Declare ## DST ## AlphaLoadData(DstPix) \
+                    jint pixelOffset = PIXEL_INDEX * (DST ## PixelStride); \
+                    DST ## DataType *pixelAddress = PtrAddBytes(DST_PTR, \
+                                                                pixelOffset); \
+                    LoadAlphaFrom ## DST ## For4ByteArgb(pixelAddress, \
+                                                         DstPix, \
+                                                         dst); \
+                    Postload4ByteArgbFrom ## DST(pixelAddress, \
+                                                 DstPix, \
+                                                 tmp); \
                 } \
-                Store ## DST ## From4ByteArgbComps(DST_PTR, pix, \
-                                                   PIXEL_INDEX, dst); \
+                if (dstA) { \
+                    DeclareAlphaVarFor4ByteArgb(blendF) \
+                    dstA = MultiplyAlphaFor4ByteArgb(dstF, dstA); \
+                    resA += dstA; \
+                    blendF = SrcOver ## DST ## BlendFactor(dstF, dstA); \
+                    if (blendF != MaxValFor4ByteArgb) { \
+                        MultiplyAndStore4ByteArgbComps(tmp, \
+                                                       blendF, \
+                                                       tmp); \
+                    } \
+                    Store4ByteArgbCompsUsingOp(res, +=, tmp); \
+                } \
             } else { \
                 Store ## DST ## PixelData(DST_PTR, PIXEL_INDEX, \
                                           FG_PIXEL, PREFIX); \
+                break; \
             } \
+            if (!(DST ## IsOpaque) && \
+                !(DST ## IsPremultiplied) && resA && \
+                resA < MaxValFor4ByteArgb) \
+            { \
+                DivideAndStore4ByteArgbComps(res, res, resA); \
+            } \
+            Store ## DST ## From4ByteArgbComps(DST_PTR, pix, \
+                                               PIXEL_INDEX, res); \
         } \
     } while (0);
 
--- a/jdk/src/java.desktop/unix/native/common/awt/colordata.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/unix/native/common/awt/colordata.h	Wed Jul 05 21:40:37 2017 +0200
@@ -44,6 +44,7 @@
     char* img_oda_blue;
     int *pGrayInverseLutData;
     int screendata;
+    int representsPrimaries;
 } ColorData;
 
 
--- a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c	Wed Jul 05 21:40:37 2017 +0200
@@ -312,7 +312,7 @@
     return result;
 }
 
-gboolean gtk2_check(const char* lib_name, int flags)
+gboolean gtk2_check(const char* lib_name, gboolean load)
 {
     if (gtk2_libhandle != NULL) {
         /* We've already successfully opened the GTK libs, so return true. */
@@ -320,16 +320,25 @@
     } else {
         void *lib = NULL;
 
-        lib = dlopen(lib_name, flags);
+#ifdef RTLD_NOLOAD
+        /* Just check if gtk libs are already in the process space */
+        lib = dlopen(lib_name, RTLD_LAZY | RTLD_NOLOAD);
+        if (!load || lib != NULL) {
+            return lib != NULL;
+        }
+#else
+#ifdef _AIX
+        /* On AIX we could implement this with the help of loadquery(L_GETINFO, ..)  */
+        /* (see reload_table() in hotspot/src/os/aix/vm/loadlib_aix.cpp) but it is   */
+        /* probably not worth it because most AIX servers don't have GTK libs anyway */
+#endif
+#endif
 
+        lib = dlopen(lib_name, RTLD_LAZY | RTLD_LOCAL);
         if (lib == NULL) {
             return FALSE;
         }
 
-        if (flags & RTLD_NOLOAD) {
-            return TRUE;
-        }
-
         fp_gtk_check_version = dlsym(lib, "gtk_check_version");
         /* Check for GTK 2.2+ */
         if (!fp_gtk_check_version(2, 2, 0)) {
--- a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c	Wed Jul 05 21:40:37 2017 +0200
@@ -87,13 +87,25 @@
     return result;
 }
 
-gboolean gtk3_check(const char* lib_name, int flags)
+gboolean gtk3_check(const char* lib_name, gboolean load)
 {
     if (gtk3_libhandle != NULL) {
         /* We've already successfully opened the GTK libs, so return true. */
         return TRUE;
     } else {
-        return dlopen(lib_name, flags) != NULL;
+#ifdef RTLD_NOLOAD
+        void *lib = dlopen(lib_name, RTLD_LAZY | RTLD_NOLOAD);
+        if (!load || lib != NULL) {
+            return lib != NULL;
+        }
+#else
+#ifdef _AIX
+        /* On AIX we could implement this with the help of loadquery(L_GETINFO, ..)  */
+        /* (see reload_table() in hotspot/src/os/aix/vm/loadlib_aix.cpp) but it is   */
+        /* probably not worth it because most AIX servers don't have GTK libs anyway */
+#endif
+#endif
+        return dlopen(lib_name, RTLD_LAZY | RTLD_LOCAL) != NULL;
     }
 }
 
--- a/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c	Wed Jul 05 21:40:37 2017 +0200
@@ -30,8 +30,8 @@
 GtkApi* gtk2_load(JNIEnv *env, const char* lib_name);
 GtkApi* gtk3_load(JNIEnv *env, const char* lib_name);
 
-gboolean gtk2_check(const char* lib_name, int flags);
-gboolean gtk3_check(const char* lib_name, int flags);
+gboolean gtk2_check(const char* lib_name, gboolean load);
+gboolean gtk3_check(const char* lib_name, gboolean load);
 
 GtkApi *gtk;
 
@@ -40,7 +40,7 @@
     const char* name;
     const char* vname;
     GtkApi* (*load)(JNIEnv *env, const char* lib_name);
-    gboolean (*check)(const char* lib_name, int flags);
+    gboolean (*check)(const char* lib_name, gboolean load);
 } GtkLib;
 
 static GtkLib libs[] = {
@@ -70,10 +70,10 @@
 static GtkLib* get_loaded() {
     GtkLib* lib = libs;
     while(!gtk && lib->version) {
-        if (lib->check(lib->vname, RTLD_NOLOAD)) {
+        if (lib->check(lib->vname, /* load = */FALSE)) {
             return lib;
         }
-        if (lib->check(lib->name, RTLD_NOLOAD)) {
+        if (lib->check(lib->name, /* load = */FALSE)) {
             return lib;
         }
         lib++;
@@ -130,14 +130,14 @@
     return gtk != NULL;
 }
 
-static gboolean check_version(GtkVersion version, int flags) {
+static gboolean check_version(GtkVersion version) {
     GtkLib* lib = libs;
     while (lib->version) {
         if (version == GTK_ANY || lib->version == version) {
-            if (lib->check(lib->vname, flags)) {
+            if (lib->check(lib->vname, /* load = */TRUE)) {
                 return TRUE;
             }
-            if (lib->check(lib->name, flags)) {
+            if (lib->check(lib->name, /* load = */TRUE)) {
                 return TRUE;
             }
         }
@@ -150,9 +150,6 @@
     if (gtk) {
         return TRUE;
     }
-    if (check_version(version, RTLD_NOLOAD)) {
-        return TRUE;
-    }
-    return check_version(version, RTLD_LAZY | RTLD_LOCAL);
+    return check_version(version);
 }
 
--- a/jdk/src/java.desktop/windows/native/libawt/windows/colordata.h	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/colordata.h	Wed Jul 05 21:40:37 2017 +0200
@@ -33,6 +33,7 @@
     char* img_oda_blue;
     unsigned char* img_clr_tbl;
     int *pGrayInverseLutData;
+    int representsPrimaries;
 } ColorData;
 
 #define CANFREE(pData) (pData)
--- a/jdk/src/java.httpclient/share/classes/java/net/http/AsyncSSLDelegate.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/AsyncSSLDelegate.java	Wed Jul 05 21:40:37 2017 +0200
@@ -144,13 +144,9 @@
         sslParameters = Utils.copySSLParameters(sslp);
         if (alpn != null) {
             sslParameters.setApplicationProtocols(alpn);
-            Log.logSSL("Setting application protocols: " + Arrays.toString(alpn));
-        } else {
-            Log.logSSL("No application protocols proposed");
         }
+        logParams(sslParameters);
         engine.setSSLParameters(sslParameters);
-        engine.setEnabledCipherSuites(sslp.getCipherSuites());
-        engine.setEnabledProtocols(sslp.getProtocols());
         this.lowerOutput = lowerOutput;
         this.client = client;
         this.channelInputQ = new Queue<>();
@@ -560,24 +556,26 @@
         return sslParameters;
     }
 
-    static void printParams(SSLParameters p) {
-        System.out.println("SSLParameters:");
+    static void logParams(SSLParameters p) {
+        if (!Log.ssl())
+            return;
+        Log.logSSL("SSLParameters:");
         if (p == null) {
-            System.out.println("Null params");
+            Log.logSSL("Null params");
             return;
         }
         for (String cipher : p.getCipherSuites()) {
-                System.out.printf("cipher: %s\n", cipher);
+            Log.logSSL("cipher: {0}\n", cipher);
         }
         for (String approto : p.getApplicationProtocols()) {
-                System.out.printf("application protocol: %s\n", approto);
+            Log.logSSL("application protocol: {0}\n", approto);
         }
         for (String protocol : p.getProtocols()) {
-                System.out.printf("protocol: %s\n", protocol);
+            Log.logSSL("protocol: {0}\n", protocol);
         }
         if (p.getServerNames() != null)
-        for (SNIServerName sname : p.getServerNames()) {
-                System.out.printf("server name: %s\n", sname.toString());
+            for (SNIServerName sname : p.getServerNames()) {
+                Log.logSSL("server name: {0}\n", sname.toString());
         }
     }
 
--- a/jdk/src/java.httpclient/share/classes/java/net/http/FilterFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/FilterFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -39,7 +39,9 @@
         List<HeaderFilter> l = new LinkedList<>();
         for (Class<? extends HeaderFilter> clazz : filterClasses) {
             try {
-                l.add(clazz.newInstance());
+                @SuppressWarnings("deprecation")
+                HeaderFilter headerFilter = clazz.newInstance();
+                l.add(headerFilter);
             } catch (ReflectiveOperationException e) {
                 throw new InternalError(e);
             }
--- a/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -110,7 +110,10 @@
         this.proxySelector = builder.proxy;
         authenticator = builder.authenticator;
         version = builder.version;
-        sslParams = builder.sslParams;
+        if (builder.sslParams == null)
+            sslParams = getDefaultParams(sslContext);
+        else
+            sslParams = builder.sslParams;
         connections = new ConnectionPool();
         connections.start();
         timeouts = new LinkedList<>();
@@ -129,6 +132,12 @@
         selmgr.start();
     }
 
+    private static SSLParameters getDefaultParams(SSLContext ctx) {
+        SSLParameters params = ctx.getSupportedSSLParameters();
+        params.setProtocols(new String[]{"TLSv1.2"});
+        return params;
+    }
+
     /**
      * Wait for activity on given exchange (assuming blocking = false).
      * It's a no-op if blocking = true. In particular, the following occurs
--- a/jdk/src/java.httpclient/share/classes/java/net/http/SSLDelegate.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/SSLDelegate.java	Wed Jul 05 21:40:37 2017 +0200
@@ -66,8 +66,6 @@
             Log.logSSL("No application protocols proposed");
         }
         engine.setSSLParameters(sslParameters);
-        engine.setEnabledCipherSuites(sslp.getCipherSuites());
-        engine.setEnabledProtocols(sslp.getProtocols());
         wrapper = new EngineWrapper(chan, engine);
         this.chan = chan;
         this.client = client;
--- a/jdk/src/java.httpclient/share/classes/java/net/http/Utils.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/Utils.java	Wed Jul 05 21:40:37 2017 +0200
@@ -146,7 +146,7 @@
         } else {
             sb.append(uri.getScheme())
                     .append("://")
-                    .append(uri.getHost())
+                    .append(uri.getAuthority())
                     .append(uri.getPath());
             urlstring = sb.toString();
 
--- a/jdk/src/java.instrument/share/classes/sun/instrument/InstrumentationImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.instrument/share/classes/sun/instrument/InstrumentationImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -436,7 +436,8 @@
             if (classBeingRedefined != null) {
                 module = classBeingRedefined.getModule();
             } else {
-                module = loader.getUnnamedModule();
+                module = (loader == null) ? jdk.internal.loader.BootLoader.getUnnamedModule()
+                                          : loader.getUnnamedModule();
             }
         }
         if (mgr == null) {
--- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java	Wed Jul 05 21:40:37 2017 +0200
@@ -231,13 +231,15 @@
                     cname = System.getProperty("java.util.logging.manager");
                     if (cname != null) {
                         try {
-                            Class<?> clz = ClassLoader.getSystemClassLoader()
-                                    .loadClass(cname);
-                            mgr = (LogManager) clz.newInstance();
+                            @SuppressWarnings("deprecation")
+                            Object tmp = ClassLoader.getSystemClassLoader()
+                                .loadClass(cname).newInstance();
+                            mgr = (LogManager) tmp;
                         } catch (ClassNotFoundException ex) {
-                            Class<?> clz = Thread.currentThread()
-                                    .getContextClassLoader().loadClass(cname);
-                            mgr = (LogManager) clz.newInstance();
+                            @SuppressWarnings("deprecation")
+                            Object tmp = Thread.currentThread()
+                                .getContextClassLoader().loadClass(cname).newInstance();
+                            mgr = (LogManager) tmp;
                         }
                     }
                 } catch (Exception ex) {
@@ -991,8 +993,9 @@
         List<Handler> handlers = new ArrayList<>(names.length);
         for (String type : names) {
             try {
-                Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(type);
-                Handler hdl = (Handler) clz.newInstance();
+                @SuppressWarnings("deprecation")
+                Object o = ClassLoader.getSystemClassLoader().loadClass(type).newInstance();
+                Handler hdl = (Handler) o;
                 // Check if there is a property defining the
                 // this handler's level.
                 String levs = getProperty(type + ".level");
@@ -1330,11 +1333,13 @@
                 // calling readConfiguration(InputStream) with a suitable stream.
                 try {
                     Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(cname);
-                    clz.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object witness = clz.newInstance();
                     return;
                 } catch (ClassNotFoundException ex) {
                     Class<?> clz = Thread.currentThread().getContextClassLoader().loadClass(cname);
-                    clz.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object witness = clz.newInstance();
                     return;
                 }
             } catch (Exception ex) {
@@ -1561,7 +1566,8 @@
                 for (String word : names) {
                     try {
                         Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(word);
-                        clz.newInstance();
+                        @SuppressWarnings("deprecation")
+                        Object witness = clz.newInstance();
                     } catch (Exception ex) {
                         System.err.println("Can't load config class \"" + word + "\"");
                         System.err.println("" + ex);
@@ -2307,8 +2313,9 @@
         String val = getProperty(name);
         try {
             if (val != null) {
-                Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(val);
-                return (Filter) clz.newInstance();
+                @SuppressWarnings("deprecation")
+                Object o = ClassLoader.getSystemClassLoader().loadClass(val).newInstance();
+                return (Filter) o;
             }
         } catch (Exception ex) {
             // We got one of a variety of exceptions in creating the
@@ -2328,8 +2335,9 @@
         String val = getProperty(name);
         try {
             if (val != null) {
-                Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(val);
-                return (Formatter) clz.newInstance();
+                @SuppressWarnings("deprecation")
+                Object o = ClassLoader.getSystemClassLoader().loadClass(val).newInstance();
+                return (Formatter) o;
             }
         } catch (Exception ex) {
             // We got one of a variety of exceptions in creating the
--- a/jdk/src/java.logging/share/classes/java/util/logging/MemoryHandler.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.logging/share/classes/java/util/logging/MemoryHandler.java	Wed Jul 05 21:40:37 2017 +0200
@@ -117,7 +117,9 @@
         Class<?> clz;
         try {
             clz = ClassLoader.getSystemClassLoader().loadClass(targetName);
-            target = (Handler) clz.newInstance();
+            @SuppressWarnings("deprecation")
+            Object o = clz.newInstance();
+            target = (Handler) o;
         } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
             throw new RuntimeException("MemoryHandler can't load handler target \"" + targetName + "\"" , e);
         }
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -655,7 +655,9 @@
             final Object[] openArray = (Object[]) openValue;
             final Collection<Object> valueCollection;
             try {
-                valueCollection = cast(collectionClass.newInstance());
+                @SuppressWarnings("deprecation")
+                Collection<?> tmp = collectionClass.newInstance();
+                valueCollection = cast(tmp);
             } catch (Exception e) {
                 throw invalidObjectException("Cannot create collection", e);
             }
@@ -1114,7 +1116,9 @@
             try {
                 final Class<?> targetClass = getTargetClass();
                 ReflectUtil.checkPackageAccess(targetClass);
-                o = targetClass.newInstance();
+                @SuppressWarnings("deprecation")
+                Object tmp = targetClass.newInstance();
+                o = tmp;
                 for (int i = 0; i < itemNames.length; i++) {
                     if (cd.containsKey(itemNames[i])) {
                         Object openItem = cd.get(itemNames[i]);
--- a/jdk/src/java.management/share/classes/javax/management/MBeanServerFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.management/share/classes/javax/management/MBeanServerFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -458,6 +458,7 @@
      **/
     private static MBeanServerBuilder newBuilder(Class<?> builderClass) {
         try {
+            @SuppressWarnings("deprecation")
             final Object abuilder = builderClass.newInstance();
             return (MBeanServerBuilder)abuilder;
         } catch (RuntimeException x) {
--- a/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectorFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectorFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -531,7 +531,9 @@
             // We have just proved that this cast is correct
             Class<? extends T> providerClassT = Util.cast(providerClass);
             try {
-                return providerClassT.newInstance();
+                @SuppressWarnings("deprecation")
+                T result = providerClassT.newInstance();
+                return result;
             } catch (Exception e) {
                 final String msg =
                     "Exception when instantiating provider [" + className +
--- a/jdk/src/java.naming/share/classes/com/sun/naming/internal/FactoryEnumeration.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/naming/internal/FactoryEnumeration.java	Wed Jul 05 21:40:37 2017 +0200
@@ -86,7 +86,9 @@
                     answer = cls;
                 }
                 // Instantiate Class to get factory
-                answer = ((Class) answer).newInstance();
+                @SuppressWarnings("deprecation")
+                Object tmp = ((Class) answer).newInstance();
+                answer = tmp;
                 ref = new NamedWeakReference<>(answer, className);
                 factories.set(posn-1, ref);  // replace Class object or null
                 return answer;
--- a/jdk/src/java.naming/share/classes/com/sun/naming/internal/ResourceManager.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/naming/internal/ResourceManager.java	Wed Jul 05 21:40:37 2017 +0200
@@ -399,7 +399,9 @@
                 className = parser.nextToken() + classSuffix;
                 try {
                     // System.out.println("loading " + className);
-                    factory = helper.loadClass(className, loader).newInstance();
+                    @SuppressWarnings("deprecation") // Class.newInstance
+                    Object tmp = helper.loadClass(className, loader).newInstance();
+                    factory = tmp;
                 } catch (InstantiationException e) {
                     NamingException ne =
                         new NamingException("Cannot instantiate " + className);
--- a/jdk/src/java.naming/share/classes/javax/naming/ldap/StartTlsRequest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.naming/share/classes/javax/naming/ldap/StartTlsRequest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -192,18 +192,12 @@
         }
         try {
             VersionHelper helper = VersionHelper.getVersionHelper();
-            Class<?> clas = helper.loadClass(
-                "com.sun.jndi.ldap.ext.StartTlsResponseImpl");
-
-            resp = (StartTlsResponse) clas.newInstance();
+            @SuppressWarnings("deprecation")
+            Object o = helper.loadClass(
+                "com.sun.jndi.ldap.ext.StartTlsResponseImpl").newInstance();
+            resp = (StartTlsResponse) o;
 
-        } catch (IllegalAccessException e) {
-            throw wrapException(e);
-
-        } catch (InstantiationException e) {
-            throw wrapException(e);
-
-        } catch (ClassNotFoundException e) {
+        } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) {
             throw wrapException(e);
         }
 
--- a/jdk/src/java.naming/share/classes/javax/naming/spi/NamingManager.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.naming/share/classes/javax/naming/spi/NamingManager.java	Wed Jul 05 21:40:37 2017 +0200
@@ -159,7 +159,9 @@
             }
         }
 
-        return (clas != null) ? (ObjectFactory) clas.newInstance() : null;
+        @SuppressWarnings("deprecation") // Class.newInstance
+        ObjectFactory result = (clas != null) ? (ObjectFactory) clas.newInstance() : null;
+        return result;
     }
 
 
@@ -710,8 +712,9 @@
 
             if (factory == null) {
                 try {
-                    factory = (InitialContextFactory)
-                            helper.loadClass(className).newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object o = helper.loadClass(className).newInstance();
+                    factory = (InitialContextFactory) o;
                 } catch (Exception e) {
                     NoInitialContextException ne =
                             new NoInitialContextException(
--- a/jdk/src/java.prefs/share/classes/java/util/prefs/Preferences.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.prefs/share/classes/java/util/prefs/Preferences.java	Wed Jul 05 21:40:37 2017 +0200
@@ -238,10 +238,11 @@
             // dependent on the invoking thread.
             // Checking AllPermission also seems wrong.
             try {
-                return (PreferencesFactory)
-                    Class.forName(factoryName, false,
-                                  ClassLoader.getSystemClassLoader())
+                @SuppressWarnings("deprecation")
+                Object result =Class.forName(factoryName, false,
+                                             ClassLoader.getSystemClassLoader())
                     .newInstance();
+                return (PreferencesFactory)result;
             } catch (Exception ex) {
                 try {
                     // workaround for javaws, plugin,
@@ -250,11 +251,12 @@
                     if (sm != null) {
                         sm.checkPermission(new java.security.AllPermission());
                     }
-                    return (PreferencesFactory)
-                        Class.forName(factoryName, false,
-                                      Thread.currentThread()
-                                      .getContextClassLoader())
+                    @SuppressWarnings("deprecation")
+                    Object result = Class.forName(factoryName, false,
+                                                  Thread.currentThread()
+                                                  .getContextClassLoader())
                         .newInstance();
+                    return (PreferencesFactory) result;
                 } catch (Exception e) {
                     throw new InternalError(
                         "Can't instantiate Preferences factory "
@@ -299,9 +301,10 @@
             platformFactory = "java.util.prefs.FileSystemPreferencesFactory";
         }
         try {
-            return (PreferencesFactory)
-                Class.forName(platformFactory, false,
-                              Preferences.class.getClassLoader()).newInstance();
+            @SuppressWarnings("deprecation")
+            Object result = Class.forName(platformFactory, false,
+                                          Preferences.class.getClassLoader()).newInstance();
+            return (PreferencesFactory) result;
         } catch (Exception e) {
             throw new InternalError(
                 "Can't instantiate platform default Preferences factory "
--- a/jdk/src/java.rmi/share/classes/java/rmi/activation/ActivationID.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.rmi/share/classes/java/rmi/activation/ActivationID.java	Wed Jul 05 21:40:37 2017 +0200
@@ -272,6 +272,7 @@
             Class<? extends RemoteRef> refClass =
                 Class.forName(RemoteRef.packagePrefix + "." + in.readUTF())
                 .asSubclass(RemoteRef.class);
+            @SuppressWarnings("deprecation")
             RemoteRef ref = refClass.newInstance();
             ref.readExternal(in);
             activator = (Activator)
--- a/jdk/src/java.rmi/share/classes/java/rmi/server/RMIClassLoader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.rmi/share/classes/java/rmi/server/RMIClassLoader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -681,7 +681,9 @@
                     Class.forName(providerClassName, false,
                                   ClassLoader.getSystemClassLoader())
                     .asSubclass(RMIClassLoaderSpi.class);
-                return providerClass.newInstance();
+                @SuppressWarnings("deprecation")
+                RMIClassLoaderSpi result = providerClass.newInstance();
+                return result;
 
             } catch (ClassNotFoundException e) {
                 throw new NoClassDefFoundError(e.getMessage());
--- a/jdk/src/java.rmi/share/classes/java/rmi/server/RemoteObject.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.rmi/share/classes/java/rmi/server/RemoteObject.java	Wed Jul 05 21:40:37 2017 +0200
@@ -439,18 +439,16 @@
                 RemoteRef.packagePrefix + "." + refClassName;
             Class<?> refClass = Class.forName(internalRefClassName);
             try {
-                ref = (RemoteRef) refClass.newInstance();
+                @SuppressWarnings("deprecation")
+                Object tmp = refClass.newInstance();
+                ref = (RemoteRef) tmp;
 
                 /*
                  * If this step fails, assume we found an internal
                  * class that is not meant to be a serializable ref
                  * type.
                  */
-            } catch (InstantiationException e) {
-                throw new ClassNotFoundException(internalRefClassName, e);
-            } catch (IllegalAccessException e) {
-                throw new ClassNotFoundException(internalRefClassName, e);
-            } catch (ClassCastException e) {
+            } catch (InstantiationException | IllegalAccessException | ClassCastException e) {
                 throw new ClassNotFoundException(internalRefClassName, e);
             }
             ref.readExternal(in);
--- a/jdk/src/java.rmi/share/classes/sun/rmi/server/Activation.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/Activation.java	Wed Jul 05 21:40:37 2017 +0200
@@ -2066,7 +2066,9 @@
 
                 try {
                     Class<?> execPolicyClass = getRMIClass(execPolicyClassName);
-                    execPolicy = execPolicyClass.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object tmp = execPolicyClass.newInstance();
+                    execPolicy = tmp;
                     execPolicyMethod =
                         execPolicyClass.getMethod("checkExecCommand",
                                                   ActivationGroupDesc.class,
--- a/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -111,8 +111,9 @@
                 type = "PC/SC";
                 Provider sun = Security.getProvider("SunPCSC");
                 if (sun == null) {
-                    Class<?> clazz = Class.forName("sun.security.smartcardio.SunPCSC");
-                    sun = (Provider)clazz.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object o = Class.forName("sun.security.smartcardio.SunPCSC").newInstance();
+                    sun = (Provider)o;
                 }
                 factory = TerminalFactory.getInstance(type, null, sun);
             } catch (Exception e) {
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/CachedRowSetImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/CachedRowSetImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -2962,7 +2962,9 @@
                 SQLData obj = null;
                 try {
                     ReflectUtil.checkPackageAccess(c);
-                    obj = (SQLData) c.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object tmp = c.newInstance();
+                    obj = (SQLData) tmp;
                 } catch(Exception ex) {
                     throw new SQLException("Unable to Instantiate: ", ex);
                 }
@@ -5710,7 +5712,9 @@
                 SQLData obj = null;
                 try {
                     ReflectUtil.checkPackageAccess(c);
-                    obj = (SQLData) c.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object tmp = c.newInstance();
+                    obj = (SQLData) tmp;
                 } catch(Exception ex) {
                     throw new SQLException("Unable to Instantiate: ", ex);
                 }
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java	Wed Jul 05 21:40:37 2017 +0200
@@ -574,7 +574,9 @@
                         SQLData obj = null;
                         try {
                             ReflectUtil.checkPackageAccess(c);
-                            obj = (SQLData)c.newInstance();
+                            @SuppressWarnings("deprecation")
+                            Object tmp = c.newInstance();
+                            obj = (SQLData)tmp;
                         } catch (Exception ex) {
                             throw new SQLException("Unable to Instantiate: ", ex);
                         }
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -136,8 +136,9 @@
                 }
                 // getFactoryClass takes care of adding the read edge if
                 // necessary
-                Class<?> c = getFactoryClass(factoryClassName, null, false);
-                factory = (RowSetFactory) c.newInstance();
+                @SuppressWarnings("deprecation")
+                Object o = getFactoryClass(factoryClassName, null, false).newInstance();
+                factory = (RowSetFactory) o;
             }
         } catch (Exception e) {
             throw new SQLException( "RowSetFactory: " + factoryClassName +
@@ -202,6 +203,7 @@
             // getFactoryClass takes care of adding the read edge if
             // necessary
             Class<?> providerClass = getFactoryClass(factoryClassName, cl, false);
+            @SuppressWarnings("deprecation")
             RowSetFactory instance = (RowSetFactory) providerClass.newInstance();
             if (debug) {
                 trace("Created new instance of " + providerClass +
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SQLInputImpl.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SQLInputImpl.java	Wed Jul 05 21:40:37 2017 +0200
@@ -478,7 +478,9 @@
                 SQLData obj = null;
                 try {
                     ReflectUtil.checkPackageAccess(c);
-                    obj = (SQLData)c.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object tmp = c.newInstance();
+                    obj = (SQLData)tmp;
                 } catch (Exception ex) {
                     throw new SQLException("Unable to Instantiate: ", ex);
                 }
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/spi/SyncFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/spi/SyncFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -582,14 +582,12 @@
              * there.
              **/
             c = Class.forName(providerID, true, cl);
-            return (SyncProvider) c.newInstance();
+            @SuppressWarnings("deprecation")
+            Object result =  c.newInstance();
+            return (SyncProvider)result;
 
-        } catch (IllegalAccessException e) {
+        } catch (IllegalAccessException | InstantiationException | ClassNotFoundException e) {
             throw new SyncFactoryException("IllegalAccessException: " + e.getMessage());
-        } catch (InstantiationException e) {
-            throw new SyncFactoryException("InstantiationException: " + e.getMessage());
-        } catch (ClassNotFoundException e) {
-            throw new SyncFactoryException("ClassNotFoundException: " + e.getMessage());
         }
     }
 
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java	Wed Jul 05 21:40:37 2017 +0200
@@ -152,7 +152,9 @@
                 log.log(java.util.logging.Level.FINE, "Create URI \"" + algorithmURI + "\" class \""
                    + implementingClass + "\"");
             }
-            return implementingClass.newInstance();
+            @SuppressWarnings("deprecation")
+            SignatureAlgorithmSpi result = implementingClass.newInstance();
+            return result;
         }  catch (IllegalAccessException ex) {
             Object exArgs[] = { algorithmURI, ex.getMessage() };
             throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, ex);
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java	Wed Jul 05 21:40:37 2017 +0200
@@ -115,7 +115,9 @@
             Class<? extends CanonicalizerSpi> implementingClass =
                 canonicalizerHash.get(algorithmURI);
 
-            canonicalizerSpi = implementingClass.newInstance();
+            @SuppressWarnings("deprecation")
+            CanonicalizerSpi tmp = implementingClass.newInstance();
+            canonicalizerSpi = tmp;
             canonicalizerSpi.reset = true;
         } catch (Exception e) {
             Object exArgs[] = { algorithmURI };
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java	Wed Jul 05 21:40:37 2017 +0200
@@ -182,6 +182,7 @@
     public static void register(String className, boolean globalResolver)
         throws ClassNotFoundException, IllegalAccessException, InstantiationException {
         JavaUtils.checkRegisterPermission();
+        @SuppressWarnings("deprecation")
         KeyResolverSpi keyResolverSpi =
             (KeyResolverSpi) Class.forName(className).newInstance();
         keyResolverSpi.setGlobalResolver(globalResolver);
@@ -207,7 +208,9 @@
         KeyResolverSpi keyResolverSpi = null;
         Exception ex = null;
         try {
-            keyResolverSpi = (KeyResolverSpi) Class.forName(className).newInstance();
+            @SuppressWarnings("deprecation")
+            Object tmp = Class.forName(className).newInstance();
+            keyResolverSpi = (KeyResolverSpi) tmp;
         } catch (ClassNotFoundException e) {
             ex = e;
         } catch (IllegalAccessException e) {
@@ -272,6 +275,7 @@
         JavaUtils.checkRegisterPermission();
         List<KeyResolver> keyResolverList = new ArrayList<KeyResolver>(classNames.size());
         for (String className : classNames) {
+            @SuppressWarnings("deprecation")
             KeyResolverSpi keyResolverSpi =
                 (KeyResolverSpi) Class.forName(className).newInstance();
             keyResolverSpi.setGlobalResolver(false);
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverSpi.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverSpi.java	Wed Jul 05 21:40:37 2017 +0200
@@ -110,7 +110,9 @@
         KeyResolverSpi tmp = this;
         if (globalResolver) {
             try {
-                tmp = getClass().newInstance();
+                @SuppressWarnings("deprecation")
+                KeyResolverSpi krs = getClass().newInstance();
+                tmp = krs;
             } catch (InstantiationException e) {
                 throw new KeyResolverException("", e);
             } catch (IllegalAccessException e) {
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java	Wed Jul 05 21:40:37 2017 +0200
@@ -160,7 +160,9 @@
             throw new InvalidTransformException("signature.Transform.UnknownTransform", exArgs);
         }
         try {
-            transformSpi = transformSpiClass.newInstance();
+            @SuppressWarnings("deprecation")
+            TransformSpi tmp = transformSpiClass.newInstance();
+            transformSpi = tmp;
         } catch (InstantiationException ex) {
             Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException(
@@ -345,7 +347,9 @@
         }
         TransformSpi newTransformSpi = null;
         try {
-            newTransformSpi = transformSpiClass.newInstance();
+            @SuppressWarnings("deprecation")
+            TransformSpi tmp = transformSpiClass.newInstance();
+            newTransformSpi = tmp;
         } catch (InstantiationException ex) {
             Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException(
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java	Wed Jul 05 21:40:37 2017 +0200
@@ -99,8 +99,10 @@
                 ResourceResolver resolverTmp = resolver;
                 if (!resolver.resolverSpi.engineIsThreadSafe()) {
                     try {
-                        resolverTmp =
-                            new ResourceResolver(resolver.resolverSpi.getClass().newInstance());
+                        @SuppressWarnings("deprecation")
+                        ResourceResolver tmp = new ResourceResolver(resolver.resolverSpi.getClass().newInstance());
+                        resolverTmp = tmp;
+                            ;
                     } catch (InstantiationException e) {
                         throw new ResourceResolverException("", e, context.attr, context.baseUri);
                     } catch (IllegalAccessException e) {
@@ -246,6 +248,7 @@
     public static void register(Class<? extends ResourceResolverSpi> className, boolean start) {
         JavaUtils.checkRegisterPermission();
         try {
+            @SuppressWarnings("deprecation")
             ResourceResolverSpi resourceResolverSpi = className.newInstance();
             register(resourceResolverSpi, start);
         } catch (IllegalAccessException e) {
--- a/jdk/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/Translator.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/Translator.java	Wed Jul 05 21:40:37 2017 +0200
@@ -121,6 +121,7 @@
             Class<?> translatorClass = getTranslatorClass(o.getClass());
             if (translatorClass != null) {
                 try {
+                    @SuppressWarnings("deprecation")
                     Translator t = (Translator)translatorClass.newInstance();
                     t.setSource(o);
                     a = t;
--- a/jdk/src/jdk.charsets/share/classes/sun/nio/cs/ext/AbstractCharsetProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.charsets/share/classes/sun/nio/cs/ext/AbstractCharsetProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -148,6 +148,7 @@
                                        true,
                                        this.getClass().getClassLoader());
 
+            @SuppressWarnings("deprecation")
             Charset cs = (Charset)c.newInstance();
             cache.put(csn, new SoftReference<Charset>(cs));
             return cs;
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Util.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Util.java	Wed Jul 05 21:40:37 2017 +0200
@@ -88,8 +88,9 @@
         p = Security.getProvider(providerName);
         if (p == null) {
             try {
-                Class<?> clazz = Class.forName(className);
-                p = (Provider)clazz.newInstance();
+                @SuppressWarnings("deprecation")
+                Object o = Class.forName(className).newInstance();
+                p = (Provider)o;
             } catch (Exception e) {
                 throw new ProviderException
                         ("Could not find provider " + providerName, e);
--- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1446,7 +1446,9 @@
                             }
                             return null;
                         }
-                        return (CallbackHandler)c.newInstance();
+                        @SuppressWarnings("deprecation")
+                        Object result = c.newInstance();
+                        return (CallbackHandler)result;
                     }
                 });
                 // save it
--- a/jdk/src/jdk.crypto.ucrypto/solaris/native/libj2ucrypto/nativeCrypto.c	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/native/libj2ucrypto/nativeCrypto.c	Wed Jul 05 21:40:37 2017 +0200
@@ -650,6 +650,7 @@
   unsigned char *bufIn;
   unsigned char *bufOut;
   int outLen, rv = 0;
+  jint rc;
 
   context = (crypto_ctx_t *) contextID;
 
@@ -668,22 +669,20 @@
   }
   rv = CipherFinal(context, encrypt, bufOut, 0, &outLen);
   if (rv) {
-    free(context);
-    if (outLen != 0) {
-      free(bufOut);
-    }
-    return -rv;
+    rc = -rv;
   } else {
-    if (bufOut != NULL && outLen != 0) {
+    if (outLen > 0) {
       (*env)->SetByteArrayRegion(env, out, outOfs, outLen, (jbyte *)bufOut);
-      free(bufOut);
     }
-    free(context);
-    return outLen;
+    rc = outLen;
   }
+  free(context);
+  if (bufOut != (unsigned char *)(&outLen)) {
+    free(bufOut);
+  }
+  return rc;
 }
 
-
 /*
  * Class:     com_oracle_security_ucrypto_NativeKey
  * Method:    nativeFree
--- a/jdk/src/jdk.httpserver/share/classes/com/sun/net/httpserver/spi/HttpServerProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.httpserver/share/classes/com/sun/net/httpserver/spi/HttpServerProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -89,9 +89,10 @@
         if (cn == null)
             return false;
         try {
-            Class<?> c = Class.forName(cn, true,
-                                       ClassLoader.getSystemClassLoader());
-            provider = (HttpServerProvider)c.newInstance();
+            @SuppressWarnings("deprecation")
+            Object o = Class.forName(cn, true,
+                                     ClassLoader.getSystemClassLoader()).newInstance();
+            provider = (HttpServerProvider)o;
             return true;
         } catch (ClassNotFoundException |
                  IllegalAccessException |
--- a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/TerminalFactory.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/TerminalFactory.java	Wed Jul 05 21:40:37 2017 +0200
@@ -82,7 +82,9 @@
                 }
                 else {
                     try {
-                        t = (Terminal) Thread.currentThread().getContextClassLoader().loadClass(type).newInstance();
+                        @SuppressWarnings("deprecation")
+                        Object o = Thread.currentThread().getContextClassLoader().loadClass(type).newInstance();
+                        t = (Terminal) o;
                     }
                     catch (Exception e) {
                         throw new IllegalArgumentException(MessageFormat.format("Invalid terminal type: {0}", type), e);
--- a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/WindowsTerminal.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/WindowsTerminal.java	Wed Jul 05 21:40:37 2017 +0200
@@ -370,7 +370,10 @@
                 }
             } else {
                 // virtual keycodes: http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
-                // just add support for basic editing keys (no control state, no numpad keys)
+                // xterm escape codes: E. Moy, S. Gildea and T. Dickey, "XTerm Control Sequences":
+                // http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
+                // http://xorg.freedesktop.org/releases/X11R6.8.1/PDF/ctlseqs.pdf
+                // just add support for basic editing keys and function keys
                 String escapeSequence = null;
                 switch (keyEvent.keyCode) {
                 case 0x21: // VK_PRIOR PageUp
@@ -403,6 +406,42 @@
                 case 0x2E: // VK_DELETE
                     escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[3~", "\u001B[3;%d~");
                     break;
+                case 0x70: // VK_F1
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001BOP", "\u001BO%dP");
+                    break;
+                case 0x71: // VK_F2
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001BOQ", "\u001BO%dQ");
+                    break;
+                case 0x72: // VK_F3
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001BOR", "\u001BO%dR");
+                    break;
+                case 0x73: // VK_F4
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001BOS", "\u001BO%dS");
+                    break;
+                case 0x74: // VK_F5
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[15~", "\u001B[15;%d~");
+                    break;
+                case 0x75: // VK_F6
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[17~", "\u001B[17;%d~");
+                    break;
+                case 0x76: // VK_F7
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[18~", "\u001B[18;%d~");
+                    break;
+                case 0x77: // VK_F8
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[19~", "\u001B[19;%d~");
+                    break;
+                case 0x78: // VK_F9
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[20~", "\u001B[20;%d~");
+                    break;
+                case 0x79: // VK_F10
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[21~", "\u001B[21;%d~");
+                    break;
+                case 0x7A: // VK_F11
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[23~", "\u001B[23;%d~");
+                    break;
+                case 0x7B: // VK_F12
+                    escapeSequence = escapeSequence(keyEvent.controlKeyState, "\u001B[24~", "\u001B[24;%d~");
+                    break;
                 default:
                     break;
                 }
--- a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/internal/ConsoleRunner.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/internal/ConsoleRunner.java	Wed Jul 05 21:40:37 2017 +0200
@@ -61,6 +61,7 @@
         List<Completer> completorList = new ArrayList<Completer>();
 
         for (StringTokenizer tok = new StringTokenizer(completors, ","); tok.hasMoreTokens();) {
+            @SuppressWarnings("deprecation")
             Object obj = Class.forName(tok.nextToken()).newInstance();
             completorList.add((Completer) obj);
         }
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java	Wed Jul 05 21:40:37 2017 +0200
@@ -136,10 +136,10 @@
                     jartool.moduleVersion = Version.parse(arg);
                 }
             },
-            new Option(true, OptionType.CREATE_UPDATE, "--hash-dependencies") {
+            new Option(true, OptionType.CREATE_UPDATE, "--hash-modules") {
                 void process(Main jartool, String opt, String arg) throws BadArgs {
                     try {
-                        jartool.dependenciesToHash = Pattern.compile(arg);
+                        jartool.modulesToHash = Pattern.compile(arg);
                     } catch (PatternSyntaxException e) {
                         throw new BadArgs("err.badpattern", arg).showUsage(true);
                     }
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,21 +26,25 @@
 package sun.tools.jar;
 
 import java.io.*;
+import java.lang.module.Configuration;
 import java.lang.module.ModuleDescriptor;
 import java.lang.module.ModuleDescriptor.Exports;
 import java.lang.module.ModuleDescriptor.Provides;
 import java.lang.module.ModuleDescriptor.Requires;
 import java.lang.module.ModuleDescriptor.Version;
 import java.lang.module.ModuleFinder;
+import java.lang.module.ModuleReader;
 import java.lang.module.ModuleReference;
-import java.lang.reflect.Method;
+import java.lang.module.ResolutionException;
+import java.lang.module.ResolvedModule;
 import java.net.URI;
 import java.nio.file.Path;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.*;
 import java.util.function.Consumer;
-import java.util.regex.Matcher;
+import java.util.function.Function;
+import java.util.function.Supplier;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.zip.*;
@@ -49,9 +53,12 @@
 import java.util.jar.Manifest;
 import java.text.MessageFormat;
 
-import jdk.internal.module.Hasher;
+import jdk.internal.misc.JavaLangModuleAccess;
+import jdk.internal.misc.SharedSecrets;
+import jdk.internal.module.ModuleHashes;
 import jdk.internal.module.ModuleInfoExtender;
 import jdk.internal.util.jar.JarIndex;
+
 import static jdk.internal.util.jar.JarIndex.INDEX_NAME;
 import static java.util.jar.JarFile.MANIFEST_NAME;
 import static java.util.stream.Collectors.joining;
@@ -117,7 +124,7 @@
     /* Modular jar related options */
     boolean printModuleDescriptor;
     Version moduleVersion;
-    Pattern dependenciesToHash;
+    Pattern modulesToHash;
     ModuleFinder moduleFinder = ModuleFinder.empty();
 
     private static final String MODULE_INFO = "module-info.class";
@@ -241,7 +248,7 @@
                 if (isModularJar()) {
                     moduleInfoBytes = addExtendedModuleAttributes(
                             readModuleInfo(moduleInfo));
-                } else if (moduleVersion != null || dependenciesToHash != null) {
+                } else if (moduleVersion != null || modulesToHash != null) {
                     error(getMsg("error.module.options.without.info"));
                     return false;
                 }
@@ -801,7 +808,7 @@
                 }
             } else if (isModuleInfoEntry
                        && ((newModuleInfoBytes != null) || (ename != null)
-                           || moduleVersion != null || dependenciesToHash != null)) {
+                           || moduleVersion != null || modulesToHash != null)) {
                 if (newModuleInfoBytes == null) {
                     // Update existing module-info.class
                     newModuleInfoBytes = readModuleInfo(zis);
@@ -861,7 +868,7 @@
             if (!updateModuleInfo(newModuleInfoBytes, zos)) {
                 updateOk = false;
             }
-        } else if (moduleVersion != null || dependenciesToHash != null) {
+        } else if (moduleVersion != null || modulesToHash != null) {
             error(getMsg("error.module.options.without.info"));
             updateOk = false;
         }
@@ -1642,70 +1649,60 @@
         return false;
     }
 
-    @SuppressWarnings("unchecked")
+    static <T> String toString(Set<T> set) {
+        if (set.isEmpty()) { return ""; }
+        return set.stream().map(e -> e.toString().toLowerCase(Locale.ROOT))
+                  .collect(joining(" "));
+    }
+
+    private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
+
     private void printModuleDescriptor(InputStream entryInputStream)
         throws IOException
     {
         ModuleDescriptor md = ModuleDescriptor.read(entryInputStream);
         StringBuilder sb = new StringBuilder();
-        sb.append("\nName:\n  " + md.toNameAndVersion());
-
-        Set<Requires> requires = md.requires();
-        if (!requires.isEmpty()) {
-            sb.append("\nRequires:");
-            requires.forEach(r ->
-                    sb.append("\n  ").append(r.name())
-                            .append(toString(r.modifiers(), " [ ", " ]")));
-        }
+        sb.append("\n").append(md.toNameAndVersion());
 
-        Set<String> s = md.uses();
-        if (!s.isEmpty()) {
-            sb.append("\nUses: ");
-            s.forEach(sv -> sb.append("\n  ").append(sv));
-        }
+        md.requires().stream()
+            .sorted(Comparator.comparing(Requires::name))
+            .forEach(r -> {
+                sb.append("\n  requires ");
+                if (!r.modifiers().isEmpty())
+                    sb.append(toString(r.modifiers())).append(" ");
+                sb.append(r.name());
+            });
 
-        Set<Exports> exports = md.exports();
-        if (!exports.isEmpty()) {
-            sb.append("\nExports:");
-            exports.forEach(sv -> sb.append("\n  ").append(sv));
-        }
+        md.uses().stream().sorted()
+            .forEach(p -> sb.append("\n  uses ").append(p));
+
+        md.exports().stream()
+            .sorted(Comparator.comparing(Exports::source))
+            .forEach(p -> sb.append("\n  exports ").append(p));
+
+        md.conceals().stream().sorted()
+            .forEach(p -> sb.append("\n  conceals ").append(p));
 
-        Map<String,Provides> provides = md.provides();
-        if (!provides.isEmpty()) {
-            sb.append("\nProvides: ");
-            provides.values().forEach(p ->
-                    sb.append("\n  ").append(p.service())
-                      .append(" with ")
-                      .append(toString(p.providers(), "", "")));
-        }
+        md.provides().values().stream()
+            .sorted(Comparator.comparing(Provides::service))
+            .forEach(p -> sb.append("\n  provides ").append(p.service())
+                            .append(" with ")
+                            .append(toString(p.providers())));
 
-        Optional<String> mc = md.mainClass();
-        if (mc.isPresent())
-            sb.append("\nMain class:\n  " + mc.get());
+        md.mainClass().ifPresent(v -> sb.append("\n  main-class " + v));
+
+        md.osName().ifPresent(v -> sb.append("\n  operating-system-name " + v));
 
-        s = md.conceals();
-        if (!s.isEmpty()) {
-            sb.append("\nConceals:");
-            s.forEach(p -> sb.append("\n  ").append(p));
-        }
+        md.osArch().ifPresent(v -> sb.append("\n  operating-system-architecture " + v));
 
-        try {
-            Method m = ModuleDescriptor.class.getDeclaredMethod("hashes");
-            m.setAccessible(true);
-            Optional<Hasher.DependencyHashes> optHashes =
-                    (Optional<Hasher.DependencyHashes>) m.invoke(md);
+        md.osVersion().ifPresent(v -> sb.append("\n  operating-system-version " + v));
 
-            if (optHashes.isPresent()) {
-                Hasher.DependencyHashes hashes = optHashes.get();
-                sb.append("\nHashes:");
-                sb.append("\n  Algorithm: " + hashes.algorithm());
-                hashes.names().stream().forEach(mod ->
-                        sb.append("\n  ").append(mod)
-                          .append(": ").append(hashes.hashFor(mod)));
-            }
-        } catch (ReflectiveOperationException x) {
-            throw new InternalError(x);
-        }
+        JLMA.hashes(md).ifPresent(hashes ->
+                hashes.names().stream().sorted().forEach(
+                    mod -> sb.append("\n  hashes ").append(mod).append(" ")
+                             .append(hashes.algorithm()).append(" ")
+                             .append(hashes.hashFor(mod))));
+
         output(sb.toString());
     }
 
@@ -1751,7 +1748,6 @@
             md = ModuleDescriptor.read(in);
         }
         String name = md.name();
-        Set<ModuleDescriptor.Requires> dependences = md.requires();
         Set<String> exported = md.exports()
                                  .stream()
                                  .map(ModuleDescriptor.Exports::source)
@@ -1778,9 +1774,17 @@
             if (moduleVersion != null)
                 extender.version(moduleVersion);
 
-            // --hash-dependencies
-            if (dependenciesToHash != null)
-                extender.hashes(hashDependences(name, dependences));
+            // --hash-modules
+            if (modulesToHash != null) {
+                Hasher hasher = new Hasher(md, fname);
+                ModuleHashes moduleHashes = hasher.computeHashes(name);
+                if (moduleHashes != null) {
+                    extender.hashes(moduleHashes);
+                } else {
+                    // should it issue warning or silent?
+                    System.out.println("warning: no module is recorded in hash in " + name);
+                }
+            }
 
             extender.write(baos);
             return baos.toByteArray();
@@ -1788,36 +1792,156 @@
     }
 
     /**
-     * Examines the module dependences of the given module and computes the
-     * hash of any module that matches the pattern {@code dependenciesToHash}.
+     * Compute and record hashes
      */
-    private Hasher.DependencyHashes
-    hashDependences(String name,
-                    Set<ModuleDescriptor.Requires> moduleDependences)
-        throws IOException
-    {
-        Map<String, Path> map = new HashMap<>();
-        Matcher matcher = dependenciesToHash.matcher("");
-        for (ModuleDescriptor.Requires md: moduleDependences) {
-            String dn = md.name();
-            if (matcher.reset(dn).find()) {
-                Optional<ModuleReference> omref = moduleFinder.find(dn);
-                if (!omref.isPresent()) {
-                    throw new IOException(formatMsg2("error.hash.dep", name , dn));
-                }
-                map.put(dn, modRefToPath(omref.get()));
+    private class Hasher {
+        final ModuleFinder finder;
+        final Map<String, Path> moduleNameToPath;
+        final Set<String> modules;
+        final Configuration configuration;
+        Hasher(ModuleDescriptor descriptor, String fname) throws IOException {
+            // Create a module finder that finds the modular JAR
+            // being created/updated
+            URI uri = Paths.get(fname).toUri();
+            ModuleReference mref = new ModuleReference(descriptor, uri,
+                new Supplier<>() {
+                    @Override
+                    public ModuleReader get() {
+                        throw new UnsupportedOperationException("should not reach here");
+                    }
+                });
+
+            // Compose a module finder with the module path and
+            // the modular JAR being created or updated
+            this.finder = ModuleFinder.compose(moduleFinder,
+                new ModuleFinder() {
+                    @Override
+                    public Optional<ModuleReference> find(String name) {
+                        if (descriptor.name().equals(name))
+                            return Optional.of(mref);
+                        else
+                            return Optional.empty();
+                    }
+
+                    @Override
+                    public Set<ModuleReference> findAll() {
+                        return Collections.singleton(mref);
+                    }
+                });
+
+            // Determine the modules that matches the modulesToHash pattern
+            this.modules = moduleFinder.findAll().stream()
+                .map(moduleReference -> moduleReference.descriptor().name())
+                .filter(mn -> modulesToHash.matcher(mn).find())
+                .collect(Collectors.toSet());
+
+            // a map from a module name to Path of the modular JAR
+            this.moduleNameToPath = moduleFinder.findAll().stream()
+                .map(ModuleReference::descriptor)
+                .map(ModuleDescriptor::name)
+                .collect(Collectors.toMap(Function.identity(), mn -> moduleToPath(mn)));
+
+            Configuration config = null;
+            try {
+                config = Configuration.empty()
+                    .resolveRequires(ModuleFinder.ofSystem(), finder, modules);
+            } catch (ResolutionException e) {
+                // should it throw an error?  or emit a warning
+                System.out.println("warning: " + e.getMessage());
             }
+            this.configuration = config;
         }
 
-        if (map.size() == 0) {
-            return null;
-        } else {
-            return Hasher.generate(map, "SHA-256");
+        /**
+         * Compute hashes of the modules that depend upon the specified
+         * module directly or indirectly.
+         */
+        ModuleHashes computeHashes(String name) {
+            // the transposed graph includes all modules in the resolved graph
+            Map<String, Set<String>> graph = transpose();
+
+            // find the modules that transitively depend upon the specified name
+            Deque<String> deque = new ArrayDeque<>();
+            deque.add(name);
+            Set<String> mods = visitNodes(graph, deque);
+
+            // filter modules matching the pattern specified --hash-modules
+            // as well as itself as the jmod file is being generated
+            Map<String, Path> modulesForHash = mods.stream()
+                .filter(mn -> !mn.equals(name) && modules.contains(mn))
+                .collect(Collectors.toMap(Function.identity(), moduleNameToPath::get));
+
+            if (modulesForHash.isEmpty())
+                return null;
+
+            return ModuleHashes.generate(modulesForHash, "SHA-256");
+        }
+
+        /**
+         * Returns all nodes traversed from the given roots.
+         */
+        private Set<String> visitNodes(Map<String, Set<String>> graph,
+                                       Deque<String> roots) {
+            Set<String> visited = new HashSet<>();
+            while (!roots.isEmpty()) {
+                String mn = roots.pop();
+                if (!visited.contains(mn)) {
+                    visited.add(mn);
+
+                    // the given roots may not be part of the graph
+                    if (graph.containsKey(mn)) {
+                        for (String dm : graph.get(mn)) {
+                            if (!visited.contains(dm))
+                                roots.push(dm);
+                        }
+                    }
+                }
+            }
+            return visited;
+        }
+
+        /**
+         * Returns a transposed graph from the resolved module graph.
+         */
+        private Map<String, Set<String>> transpose() {
+            Map<String, Set<String>> transposedGraph = new HashMap<>();
+            Deque<String> deque = new ArrayDeque<>(modules);
+
+            Set<String> visited = new HashSet<>();
+            while (!deque.isEmpty()) {
+                String mn = deque.pop();
+                if (!visited.contains(mn)) {
+                    visited.add(mn);
+
+                    // add an empty set
+                    transposedGraph.computeIfAbsent(mn, _k -> new HashSet<>());
+
+                    ResolvedModule resolvedModule = configuration.findModule(mn).get();
+                    for (ResolvedModule dm : resolvedModule.reads()) {
+                        String name = dm.name();
+                        if (!visited.contains(name)) {
+                            deque.push(name);
+                        }
+                        // reverse edge
+                        transposedGraph.computeIfAbsent(name, _k -> new HashSet<>())
+                                       .add(mn);
+                    }
+                }
+            }
+            return transposedGraph;
+        }
+
+        private Path moduleToPath(String name) {
+            ModuleReference mref = moduleFinder.find(name).orElseThrow(
+                () -> new InternalError(formatMsg2("error.hash.dep",name , name)));
+
+            URI uri = mref.location().get();
+            Path path = Paths.get(uri);
+            String fn = path.getFileName().toString();
+            if (!fn.endsWith(".jar")) {
+                throw new UnsupportedOperationException(path + " is not a modular JAR");
+            }
+            return path;
         }
     }
-
-    private static Path modRefToPath(ModuleReference mref) {
-        URI location = mref.location().get();
-        return Paths.get(location);
-    }
 }
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties	Wed Jul 05 21:40:37 2017 +0200
@@ -57,7 +57,7 @@
 error.hash.dep=\
         Hashing module {0} dependences, unable to find module {1} on module path
 error.module.options.without.info=\
-        One of --module-version or --hash-dependencies without module-info.class
+        One of --module-version or --hash-modules without module-info.class
 error.unexpected.module-info=\
         Unexpected module descriptor {0}
 error.module.descriptor.not.found=\
@@ -178,11 +178,11 @@
 main.help.opt.create.update.module-version=\
 \      --module-version=VERSION    The module version, when creating a modular\n\
 \                             jar, or updating a non-modular jar
-main.help.opt.create.update.hash-dependencies=\
-\      --hash-dependencies=PATTERN  Compute and record the hashes of module\n\
-\                             dependencies matched by the given pattern, when\n\
-\                             creating a modular jar, or updating a non-modular\n\
-\                             jar
+main.help.opt.create.update.hash-modules=\
+\      --hash-modules=PATTERN Compute and record the hashes of modules \n\
+\                             matched by the given pattern and that depend upon\n\
+\                             directly or indirectly on a modular jar being\n\
+\                             created or a non-modular jar being updated
 main.help.opt.create.update.modulepath=\
 \      --modulepath           Location of module dependence for generating
 \                             the hash
@@ -201,7 +201,7 @@
 \ located in the root of the given directories, or the root of the jar archive\n\
 \ itself. The following operations are only valid when creating a modular jar,\n\
 \ or updating an existing non-modular jar: '--module-version',\n\
-\ '--hash-dependencies', and '--modulepath'.\n\
+\ '--hash-modules', and '--modulepath'.\n\
 \n\
 \ Mandatory or optional arguments to long options are also mandatory or optional\n\
 \ for any corresponding short options.
\ No newline at end of file
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/ProcessAttachingConnector.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/ProcessAttachingConnector.java	Wed Jul 05 21:40:37 2017 +0200
@@ -128,7 +128,9 @@
             if (lib.equals("dt_shmem")) {
                 try {
                     Class<?> c = Class.forName("com.sun.tools.jdi.SharedMemoryTransportService");
-                    ts = (TransportService)c.newInstance();
+                    @SuppressWarnings("deprecation")
+                    Object tmp = c.newInstance();
+                    ts = (TransportService)tmp;
                 } catch (Exception x) { }
             }
         }
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/RawCommandLineLauncher.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/RawCommandLineLauncher.java	Wed Jul 05 21:40:37 2017 +0200
@@ -53,17 +53,19 @@
         super();
 
         try {
-            Class<?> c = Class.forName("com.sun.tools.jdi.SharedMemoryTransportService");
-            transportService = (TransportService)c.newInstance();
+            @SuppressWarnings("deprecation")
+            Object o =
+                Class.forName("com.sun.tools.jdi.SharedMemoryTransportService").newInstance();
+            transportService = (TransportService)o;
             transport = new Transport() {
                 public String name() {
                     return "dt_shmem";
                 }
             };
-        } catch (ClassNotFoundException x) {
-        } catch (UnsatisfiedLinkError x) {
-        } catch (InstantiationException x) {
-        } catch (IllegalAccessException x) {
+        } catch (ClassNotFoundException |
+                 UnsatisfiedLinkError |
+                 InstantiationException |
+                 IllegalAccessException x) {
         };
 
         if (transportService == null) {
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java	Wed Jul 05 21:40:37 2017 +0200
@@ -64,18 +64,20 @@
          * transport or the socket transport
          */
         try {
-            Class<?> c = Class.forName("com.sun.tools.jdi.SharedMemoryTransportService");
-            transportService = (TransportService)c.newInstance();
+            @SuppressWarnings("deprecation")
+            Object o =
+                Class.forName("com.sun.tools.jdi.SharedMemoryTransportService").newInstance();
+            transportService = (TransportService)o;
             transport = new Transport() {
                 public String name() {
                     return "dt_shmem";
                 }
             };
             usingSharedMemory = true;
-        } catch (ClassNotFoundException x) {
-        } catch (UnsatisfiedLinkError x) {
-        } catch (InstantiationException x) {
-        } catch (IllegalAccessException x) {
+        } catch (ClassNotFoundException |
+                 UnsatisfiedLinkError |
+                 InstantiationException |
+                 IllegalAccessException x) {
         };
         if (transportService == null) {
             transportService = new SocketTransportService();
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -95,27 +95,23 @@
 
     private final Path root;
     private final Path mdir;
-    private final boolean genBom;
     private final Set<String> modules = new HashSet<>();
 
     /**
      * Default image builder constructor.
      *
-     * @param genBom true, generates a bom file.
      * @param root The image root directory.
      * @throws IOException
      */
-    public DefaultImageBuilder(boolean genBom, Path root) throws IOException {
+    public DefaultImageBuilder(Path root) throws IOException {
         Objects.requireNonNull(root);
 
-        this.genBom = genBom;
-
         this.root = root;
         this.mdir = root.resolve("lib");
         Files.createDirectories(mdir);
     }
 
-    private void storeFiles(Set<String> modules, String bom, Properties release) throws IOException {
+    private void storeFiles(Set<String> modules, Properties release) throws IOException {
         if (release != null) {
             addModules(release, modules);
             File r = new File(root.toFile(), "release");
@@ -123,11 +119,6 @@
                 release.store(fo, null);
             }
         }
-        // Generate bom
-        if (genBom) {
-            File bomFile = new File(root.toFile(), "bom");
-            createUtf8File(bomFile, bom);
-        }
     }
 
     private void addModules(Properties release, Set<String> modules) throws IOException {
@@ -144,7 +135,7 @@
     }
 
     @Override
-    public void storeFiles(Pool files, String bom, Properties release) {
+    public void storeFiles(Pool files, Properties release) {
         try {
             for (ModuleData f : files.getContent()) {
                if (!f.getType().equals(Pool.ModuleDataType.CLASS_OR_RESOURCE)) {
@@ -161,7 +152,7 @@
                     modules.add(m.getName());
                 }
             }
-            storeFiles(modules, bom, release);
+            storeFiles(modules, release);
 
             if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) {
                 // launchers in the bin directory need execute permission
@@ -190,8 +181,8 @@
     }
 
     @Override
-    public void storeFiles(Pool files, String bom) {
-        storeFiles(files, bom, new Properties());
+    public void storeFiles(Pool files) {
+        storeFiles(files, new Properties());
     }
 
     /**
@@ -213,28 +204,48 @@
             mainClass = ModuleDescriptor.read(stream).mainClass();
             if (mainClass.isPresent()) {
                 Path cmd = root.resolve("bin").resolve(module);
-                if (!Files.exists(cmd)) {
-                    StringBuilder sb = new StringBuilder();
-                    sb.append("#!/bin/sh")
-                            .append("\n");
-                    sb.append("JLINK_VM_OPTIONS=")
-                            .append("\n");
-                    sb.append("DIR=`dirname $0`")
-                            .append("\n");
-                    sb.append("$DIR/java $JLINK_VM_OPTIONS -m ")
+                // generate shell script for Unix platforms
+                StringBuilder sb = new StringBuilder();
+                sb.append("#!/bin/sh")
+                        .append("\n");
+                sb.append("JLINK_VM_OPTIONS=")
+                        .append("\n");
+                sb.append("DIR=`dirname $0`")
+                        .append("\n");
+                sb.append("$DIR/java $JLINK_VM_OPTIONS -m ")
+                        .append(module).append('/')
+                        .append(mainClass.get())
+                        .append(" $@\n");
+
+                try (BufferedWriter writer = Files.newBufferedWriter(cmd,
+                        StandardCharsets.ISO_8859_1,
+                        StandardOpenOption.CREATE_NEW)) {
+                    writer.write(sb.toString());
+                }
+                if (Files.getFileStore(root.resolve("bin"))
+                        .supportsFileAttributeView(PosixFileAttributeView.class)) {
+                    setExecutable(cmd);
+                }
+                // generate .bat file for Windows
+                if (isWindows()) {
+                    Path bat = root.resolve("bin").resolve(module + ".bat");
+                    sb = new StringBuilder();
+                    sb.append("@echo off")
+                            .append("\r\n");
+                    sb.append("set JLINK_VM_OPTIONS=")
+                            .append("\r\n");
+                    sb.append("set DIR=%~dp0")
+                            .append("\r\n");
+                    sb.append("\"%DIR%\\java\" %JLINK_VM_OPTIONS% -m ")
                             .append(module).append('/')
                             .append(mainClass.get())
-                            .append(" $@\n");
+                            .append(" %*\r\n");
 
-                    try (BufferedWriter writer = Files.newBufferedWriter(cmd,
+                    try (BufferedWriter writer = Files.newBufferedWriter(bat,
                             StandardCharsets.ISO_8859_1,
                             StandardOpenOption.CREATE_NEW)) {
                         writer.write(sb.toString());
                     }
-                    if (Files.getFileStore(root.resolve("bin"))
-                            .supportsFileAttributeView(PosixFileAttributeView.class)) {
-                        setExecutable(cmd);
-                    }
                 }
             }
         }
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/ImageBuilder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/ImageBuilder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -42,22 +42,20 @@
      * Store the external files.
      *
      * @param content Pool of module content.
-     * @param bom The options used to build the image file.
      * @param release the release properties
      * @throws PluginException
      */
-    public default void storeFiles(Pool content, String bom, Properties release) {
-        storeFiles(content, bom);
+    public default void storeFiles(Pool content, Properties release) {
+        storeFiles(content);
     }
 
     /**
      * Store the external files.
      *
      * @param content Pool of module content.
-     * @param bom The options used to build the image file.
      * @throws PluginException
      */
-    public default void storeFiles(Pool content, String bom) {
+    public default void storeFiles(Pool content) {
         throw new UnsupportedOperationException("storeFiles");
     }
 
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java	Wed Jul 05 21:40:37 2017 +0200
@@ -88,7 +88,7 @@
             ByteOrder byteOrder)
             throws IOException {
         return ImageFileCreator.create(archives, byteOrder,
-                new ImagePluginStack(null));
+                new ImagePluginStack());
     }
 
     public static ExecutableImage create(Set<Archive> archives,
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java	Wed Jul 05 21:40:37 2017 +0200
@@ -68,20 +68,13 @@
     private ImagePluginConfiguration() {
     }
 
-    public static ImagePluginStack parseConfiguration(Jlink.PluginsConfiguration plugins)
-            throws Exception {
-        return parseConfiguration(plugins, null);
-    }
-
     /*
      * Create a stack of plugins from a a configuration.
-     *
      */
-    public static ImagePluginStack parseConfiguration(Jlink.PluginsConfiguration pluginsConfiguration,
-            String bom)
+    public static ImagePluginStack parseConfiguration(Jlink.PluginsConfiguration pluginsConfiguration)
             throws Exception {
         if (pluginsConfiguration == null) {
-            return new ImagePluginStack(bom);
+            return new ImagePluginStack();
         }
         Map<Plugin.CATEGORY, List<Plugin>> plugins = new LinkedHashMap<>();
         for (Plugin.CATEGORY cat : CATEGORIES_ORDER) {
@@ -150,7 +143,7 @@
                 }
 
                 @Override
-                public void storeFiles(Pool files, String bom) {
+                public void storeFiles(Pool files) {
                     throw new PluginException("No directory setup to store files");
                 }
             };
@@ -158,6 +151,6 @@
 
         PluginContext ctxt = pluginsConfiguration.getPluginContext();
         return new ImagePluginStack(builder, transformerPlugins,
-                lastSorter, postProcessingPlugins, ctxt, bom);
+                lastSorter, postProcessingPlugins, ctxt);
     }
 }
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java	Wed Jul 05 21:40:37 2017 +0200
@@ -167,28 +167,25 @@
 
     private final ImageBuilder imageBuilder;
     private final Properties release;
-    private final String bom;
+
+    public ImagePluginStack() {
+        this(null, Collections.emptyList(), null,
+                Collections.emptyList(), null);
+    }
 
-    public ImagePluginStack(String bom) {
-        this(null, Collections.emptyList(), null,
-                Collections.emptyList(), null, bom);
+    public ImagePluginStack(ImageBuilder imageBuilder,
+            List<TransformerPlugin> contentPlugins,
+            Plugin lastSorter,
+            List<PostProcessorPlugin> postprocessingPlugins) {
+        this(imageBuilder, contentPlugins, lastSorter,
+            postprocessingPlugins, null);
     }
 
     public ImagePluginStack(ImageBuilder imageBuilder,
             List<TransformerPlugin> contentPlugins,
             Plugin lastSorter,
             List<PostProcessorPlugin> postprocessingPlugins,
-            String bom) {
-        this(imageBuilder, contentPlugins, lastSorter,
-            postprocessingPlugins, null, bom);
-    }
-
-    public ImagePluginStack(ImageBuilder imageBuilder,
-            List<TransformerPlugin> contentPlugins,
-            Plugin lastSorter,
-            List<PostProcessorPlugin> postprocessingPlugins,
-            PluginContext ctxt,
-            String bom) {
+            PluginContext ctxt) {
         Objects.requireNonNull(contentPlugins);
         this.lastSorter = lastSorter;
         for (TransformerPlugin p : contentPlugins) {
@@ -204,7 +201,6 @@
         }
         this.imageBuilder = imageBuilder;
         this.release = ctxt != null? ctxt.getReleaseProperties() : new Properties();
-        this.bom = bom;
     }
 
     public void operate(ImageProvider provider) throws Exception {
@@ -479,7 +475,7 @@
         } catch (Exception ignored) {
         }
 
-        imageBuilder.storeFiles(new LastPool(transformed), bom, release);
+        imageBuilder.storeFiles(new LastPool(transformed), release);
     }
 
     public ExecutableImage getExecutableImage() throws IOException {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java	Wed Jul 05 21:40:37 2017 +0200
@@ -70,6 +70,7 @@
  * ## Should use jdk.joptsimple some day.
  */
 public class JlinkTask {
+    private static final boolean DEBUG = Boolean.getBoolean("jlink.debug");
 
     private static <T extends Throwable> void fail(Class<T> type,
             String format,
@@ -142,9 +143,6 @@
             }
             task.options.packagedModulesPath = path;
         }, true, "--keep-packaged-modules"),
-        new Option<JlinkTask>(false, (task, opt, arg) -> {
-            task.options.genbom = true;
-        }, true, "--genbom"),
         new Option<JlinkTask>(true, (task, opt, arg) -> {
             task.options.saveoptsfile = arg;
         }, "--saveopts"),
@@ -175,7 +173,6 @@
 
     static class OptionsValues {
         boolean help;
-        boolean genbom;
         String  saveoptsfile;
         boolean version;
         boolean fullVersion;
@@ -219,18 +216,24 @@
             }
 
             return EXIT_OK;
-        } catch (UncheckedIOException | PluginException | IOException | ResolutionException e) {
+        } catch (UncheckedIOException | PluginException | IllegalArgumentException |
+                 IOException | ResolutionException e) {
             log.println(taskHelper.getMessage("error.prefix") + " " + e.getMessage());
-            log.println(taskHelper.getMessage("main.usage.summary", PROGNAME));
+            if (DEBUG) {
+                e.printStackTrace(log);
+            }
             return EXIT_ERROR;
         } catch (BadArgs e) {
             taskHelper.reportError(e.key, e.args);
             if (e.showUsage) {
                 log.println(taskHelper.getMessage("main.usage.summary", PROGNAME));
             }
+            if (DEBUG) {
+                e.printStackTrace(log);
+            }
             return EXIT_CMDERR;
         } catch (Throwable x) {
-            log.println(taskHelper.getMessage("main.msg.bug"));
+            log.println(taskHelper.getMessage("error.prefix") + " " + x.getMessage());
             x.printStackTrace(log);
             return EXIT_ABNORMAL;
         } finally {
@@ -238,16 +241,6 @@
         }
     }
 
-    private static Map<String, Path> modulesToPath(Configuration cf) {
-        Map<String, Path> modPaths = new HashMap<>();
-        for (ResolvedModule resolvedModule : cf.modules()) {
-            ModuleReference mref = resolvedModule.reference();
-            URI uri = mref.location().get();
-            modPaths.put(mref.descriptor().name(), Paths.get(uri));
-        }
-        return modPaths;
-    }
-
     /*
      * Jlink API entry point.
      */
@@ -275,8 +268,7 @@
                                       null);
 
         // Then create the Plugin Stack
-        ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(plugins,
-                genBOMContent(config, plugins));
+        ImagePluginStack stack = ImagePluginConfiguration.parseConfiguration(plugins);
 
         //Ask the stack to proceed;
         stack.operate(imageProvider);
@@ -297,7 +289,7 @@
     }
 
     private void postProcessOnly(Path existingImage) throws Exception {
-        PluginsConfiguration config = taskHelper.getPluginsConfig(null, false);
+        PluginsConfiguration config = taskHelper.getPluginsConfig(null);
         ExecutableImage img = DefaultImageBuilder.getExecutableImage(existingImage);
         if (img == null) {
             throw taskHelper.newBadArgs("err.existing.image.invalid");
@@ -327,8 +319,7 @@
 
         // Then create the Plugin Stack
         ImagePluginStack stack = ImagePluginConfiguration.
-                parseConfiguration(taskHelper.getPluginsConfig(options.output, options.genbom),
-                        genBOMContent());
+                parseConfiguration(taskHelper.getPluginsConfig(options.output));
 
         //Ask the stack to proceed
         stack.operate(imageProvider);
@@ -358,6 +349,15 @@
         return finder;
     }
 
+
+    private static Path toPathLocation(ResolvedModule m) {
+        Optional<URI> ouri = m.reference().location();
+        if (!ouri.isPresent())
+            throw new InternalError(m + " does not have a location");
+        URI uri = ouri.get();
+        return Paths.get(uri);
+    }
+
     private static ImageProvider createImageProvider(ModuleFinder finder,
                                                      Set<String> addMods,
                                                      Set<String> limitMods,
@@ -374,7 +374,8 @@
                                  ModuleFinder.empty(),
                                  addMods);
 
-        Map<String, Path> mods = modulesToPath(cf);
+        Map<String, Path> mods = cf.modules().stream()
+            .collect(Collectors.toMap(ResolvedModule::name, JlinkTask::toPathLocation));
         return new ImageHelper(cf, mods, order, retainModulesPath);
     }
 
@@ -399,21 +400,15 @@
             map.put(mref.descriptor().name(), mref);
         });
 
+        // add the other modules
+        otherMods.stream()
+            .map(finder::find)
+            .flatMap(Optional::stream)
+            .forEach(mref -> map.putIfAbsent(mref.descriptor().name(), mref));
+
         // set of modules that are observable
         Set<ModuleReference> mrefs = new HashSet<>(map.values());
 
-        // add the other modules
-        for (String mod : otherMods) {
-            Optional<ModuleReference> omref = finder.find(mod);
-            if (omref.isPresent()) {
-                ModuleReference mref = omref.get();
-                map.putIfAbsent(mod, mref);
-                mrefs.add(mref);
-            } else {
-                // no need to fail
-            }
-        }
-
         return new ModuleFinder() {
             @Override
             public Optional<ModuleReference> find(String name) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Wed Jul 05 21:40:37 2017 +0200
@@ -337,8 +337,8 @@
             return null;
         }
 
-        private PluginsConfiguration getPluginsConfig(Path output,
-                boolean genbom) throws IOException, BadArgs {
+        private PluginsConfiguration getPluginsConfig(Path output
+                    ) throws IOException, BadArgs {
             if (output != null) {
                 if (Files.exists(output)) {
                     throw new PluginException(PluginsResourceBundle.
@@ -367,7 +367,7 @@
             // recreate or postprocessing don't require an output directory.
             ImageBuilder builder = null;
             if (output != null) {
-                builder = new DefaultImageBuilder(genbom, output);
+                builder = new DefaultImageBuilder(output);
 
             }
             return new Jlink.PluginsConfiguration(pluginsList,
@@ -676,9 +676,9 @@
                 + bundleHelper.getMessage(key, args));
     }
 
-    public PluginsConfiguration getPluginsConfig(Path output, boolean genbom)
+    public PluginsConfiguration getPluginsConfig(Path output)
             throws IOException, BadArgs {
-        return pluginOptions.getPluginsConfig(output, genbom);
+        return pluginOptions.getPluginsConfig(output);
     }
 
     public Path getExistingImage() {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -139,7 +139,7 @@
 
         // build the image
         Jlink.PluginsConfiguration pluginConfig = new Jlink.PluginsConfiguration(
-            plugins, new DefaultImageBuilder(true, outputDir), null);
+            plugins, new DefaultImageBuilder(outputDir), null);
         Jlink jlink = new Jlink();
         jlink.build(jlinkConfig, pluginConfig);
     }
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java	Wed Jul 05 21:40:37 2017 +0200
@@ -125,7 +125,7 @@
                         zip = new ZipPlugin(resFilter);
                         break;
                     default:
-                        throw new PluginException("Invalid level " + level);
+                        throw new IllegalArgumentException("Invalid compression level " + level);
                 }
             } else {
                 ss = new StringSharingPlugin(resFilter);
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java	Wed Jul 05 21:40:37 2017 +0200
@@ -208,7 +208,7 @@
                     break;
                 }
                 default: {
-                    throw new PluginException("Unknown option " + value);
+                    throw new IllegalArgumentException("Unknown exclude VM option: " + value);
                 }
             }
             predicate = new ResourceFilter(Utils.listParser.apply(exclude), true);
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java	Wed Jul 05 21:40:37 2017 +0200
@@ -164,7 +164,7 @@
                 try {
                     return new Locale.LanguageRange(s);
                 } catch (IllegalArgumentException iae) {
-                    throw new PluginException(String.format(
+                    throw new IllegalArgumentException(String.format(
                         PluginsResourceBundle.getMessage(NAME + ".invalidtag"), s));
                 }
             })
@@ -177,24 +177,28 @@
         Pool.Module module = resources.getModule(MODULENAME);
 
         // jdk.localedata module validation
-        Set<String> packages = module.getAllPackages();
-        if (!packages.containsAll(LOCALEDATA_PACKAGES)) {
-            throw new PluginException(PluginsResourceBundle.getMessage(NAME + ".missingpackages") +
-                LOCALEDATA_PACKAGES.stream()
-                    .filter(pn -> !packages.contains(pn))
-                    .collect(Collectors.joining(",\n\t")));
-        }
+        if (module != null) {
+            Set<String> packages = module.getAllPackages();
+            if (!packages.containsAll(LOCALEDATA_PACKAGES)) {
+                throw new PluginException(PluginsResourceBundle.getMessage(NAME + ".missingpackages") +
+                    LOCALEDATA_PACKAGES.stream()
+                        .filter(pn -> !packages.contains(pn))
+                        .collect(Collectors.joining(",\n\t")));
+            }
 
-        available = Stream.concat(module.getContent().stream()
-                                    .map(md -> p.matcher(md.getPath()))
-                                    .filter(m -> m.matches())
-                                    .map(m -> m.group("tag").replaceAll("_", "-")),
-                                Stream.concat(Stream.of(jaJPJPTag), Stream.of(thTHTHTag)))
-            .distinct()
-            .sorted()
-            .map(IncludeLocalesPlugin::tagToLocale)
-            .collect(Collectors.toList());
-
+            available = Stream.concat(module.getContent().stream()
+                                        .map(md -> p.matcher(md.getPath()))
+                                        .filter(m -> m.matches())
+                                        .map(m -> m.group("tag").replaceAll("_", "-")),
+                                    Stream.concat(Stream.of(jaJPJPTag), Stream.of(thTHTHTag)))
+                .distinct()
+                .sorted()
+                .map(IncludeLocalesPlugin::tagToLocale)
+                .collect(Collectors.toList());
+        } else {
+            // jdk.localedata is not added.
+            throw new PluginException(PluginsResourceBundle.getMessage(NAME + ".localedatanotfound"));
+        }
         filtered = filterLocales(available);
 
         if (filtered.isEmpty()) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java	Wed Jul 05 21:40:37 2017 +0200
@@ -273,7 +273,7 @@
             } else if (s.equals(FORNAME_REMOVAL)) {
                 optimizers.add(new ForNameFolding());
             } else {
-                throw new PluginException("Unknown optimization");
+                throw new IllegalArgumentException("Unknown optimization: " + s);
             }
         }
         String f = config.get(LOG);
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java	Wed Jul 05 21:40:37 2017 +0200
@@ -39,6 +39,8 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import jdk.internal.misc.JavaLangModuleAccess;
+import jdk.internal.misc.SharedSecrets;
 import jdk.internal.module.Checks;
 import jdk.internal.module.ModuleInfoExtender;
 import jdk.internal.module.SystemModules;
@@ -50,6 +52,7 @@
 import jdk.tools.jlink.plugin.PluginException;
 import jdk.tools.jlink.plugin.Pool;
 import jdk.tools.jlink.plugin.TransformerPlugin;
+import jdk.tools.jlink.internal.plugins.SystemModuleDescriptorPlugin.Builder.*;
 
 /**
  * Jlink plugin to reconstitute module descriptors for installed modules.
@@ -63,6 +66,8 @@
  * @see SystemModules
  */
 public final class SystemModuleDescriptorPlugin implements TransformerPlugin {
+    private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
+
     // TODO: packager has the dependency on the plugin name
     // Keep it as "--installed-modules" until packager removes such
     // dependency (should not need to specify this plugin since it
@@ -118,7 +123,8 @@
             Pool.ModuleData data = module.get("module-info.class");
             if (data == null) {
                 // automatic module not supported yet
-                throw new PluginException("module-info.class not found for " + module.getName() + " module");
+                throw new PluginException("module-info.class not found for " +
+                                          module.getName() + " module");
             }
             assert module.getName().equals(data.getModule());
             try {
@@ -126,15 +132,20 @@
                 ModuleDescriptor md = ModuleDescriptor.read(bain);
                 validateNames(md);
 
-                Builder.ModuleDescriptorBuilder mbuilder = builder.module(md, module.getAllPackages());
+                ModuleDescriptorBuilder mbuilder = builder.module(md, module.getAllPackages());
+                int packages = md.exports().size() + md.conceals().size();
                 if (md.conceals().isEmpty() &&
-                        (md.exports().size() + md.conceals().size()) != module.getAllPackages().size()) {
+                        packages != module.getAllPackages().size()) {
                     // add ConcealedPackages attribute if not exist
                     bain.reset();
-                    ModuleInfoRewriter minfoWriter = new ModuleInfoRewriter(bain, mbuilder.conceals());
+                    ModuleInfoRewriter minfoWriter =
+                        new ModuleInfoRewriter(bain, mbuilder.conceals());
                     // replace with the overridden version
-                    data = new Pool.ModuleData(data.getModule(), data.getPath(), data.getType(),
-                                               minfoWriter.stream(), minfoWriter.size());
+                    data = new Pool.ModuleData(data.getModule(),
+                                               data.getPath(),
+                                               data.getType(),
+                                               minfoWriter.stream(),
+                                               minfoWriter.size());
                 }
                 out.add(data);
             } catch (IOException e) {
@@ -151,8 +162,12 @@
 
             if (builder.isOverriddenClass(data.getPath())) {
                 byte[] bytes = cwriter.toByteArray();
-                Pool.ModuleData ndata = new Pool.ModuleData(data.getModule(), data.getPath(), data.getType(),
-                                                            new ByteArrayInputStream(bytes), bytes.length);
+                Pool.ModuleData ndata =
+                    new Pool.ModuleData(data.getModule(),
+                                        data.getPath(),
+                                        data.getType(),
+                                        new ByteArrayInputStream(bytes),
+                                        bytes.length);
                 out.add(ndata);
             } else {
                 out.add(data);
@@ -230,6 +245,7 @@
 
         // static variables in SystemModules class
         private static final String MODULE_NAMES = "MODULE_NAMES";
+        private static final String MODULES_TO_HASH = "MODULES_TO_HASH";
         private static final String PACKAGE_COUNT = "PACKAGES_IN_BOOT_LAYER";
 
         private static final int BUILDER_VAR    = 0;
@@ -246,6 +262,9 @@
         // list of all ModuleDescriptorBuilders, invoked in turn when building.
         private final List<ModuleDescriptorBuilder> builders = new ArrayList<>();
 
+        // module name to hash
+        private final Map<String, String> modulesToHash = new HashMap<>();
+
         // map Set<String> to a specialized builder to allow them to be
         // deduplicated as they are requested
         private final Map<Set<String>, StringSetBuilder> stringSets = new HashMap<>();
@@ -268,6 +287,11 @@
                     "[Ljava/lang/String;", null, null)
                     .visitEnd();
 
+            // public static String[] MODULES_TO_HASH = new String[] {....};
+            cw.visitField(ACC_PUBLIC+ACC_FINAL+ACC_STATIC, MODULES_TO_HASH,
+                "[Ljava/lang/String;", null, null)
+                .visitEnd();
+
             // public static int PACKAGES_IN_BOOT_LAYER;
             cw.visitField(ACC_PUBLIC+ACC_FINAL+ACC_STATIC, PACKAGE_COUNT,
                     "I", null, numPackages)
@@ -283,15 +307,35 @@
 
             int index = 0;
             for (ModuleDescriptorBuilder builder : builders) {
-                mv.visitInsn(DUP);       // arrayref
+                mv.visitInsn(DUP);                  // arrayref
                 pushInt(index++);
-                mv.visitLdcInsn(builder.md.name());      // value
+                mv.visitLdcInsn(builder.md.name()); // value
                 mv.visitInsn(AASTORE);
             }
 
             mv.visitFieldInsn(PUTSTATIC, CLASSNAME, MODULE_NAMES,
                     "[Ljava/lang/String;");
 
+            // create the MODULES_TO_HASH array
+            pushInt(numModules);
+            mv.visitTypeInsn(ANEWARRAY, "java/lang/String");
+
+            index = 0;
+            for (ModuleDescriptorBuilder builder : builders) {
+                String mn = builder.md.name();
+                String recordedHash = modulesToHash.get(mn);
+                if (recordedHash != null) {
+                    mv.visitInsn(DUP);              // arrayref
+                    pushInt(index);
+                    mv.visitLdcInsn(recordedHash);  // value
+                    mv.visitInsn(AASTORE);
+                }
+                index++;
+            }
+
+            mv.visitFieldInsn(PUTSTATIC, CLASSNAME, MODULES_TO_HASH,
+                    "[Ljava/lang/String;");
+
             mv.visitInsn(RETURN);
             mv.visitMaxs(0, 0);
             mv.visitEnd();
@@ -315,15 +359,19 @@
                 }
             }
 
-            // provides
+            // provides (preserve iteration order)
             for (ModuleDescriptor.Provides p : md.provides().values()) {
-                stringSets.computeIfAbsent(p.providers(), s -> new StringSetBuilder(s))
+                stringSets.computeIfAbsent(p.providers(), s -> new StringSetBuilder(s, true))
                           .increment();
             }
 
             // uses
             stringSets.computeIfAbsent(md.uses(), s -> new StringSetBuilder(s))
                       .increment();
+
+            // hashes
+            JLMA.hashes(md).ifPresent(mh -> modulesToHash.putAll(mh.hashes()));
+
             return builder;
         }
 
@@ -484,13 +532,17 @@
                     conceals(pn);
                 }
 
-                if (md.version().isPresent()) {
-                    version(md.version().get());
-                }
+                // version
+                md.version().ifPresent(this::version);
+
+                // main class
+                md.mainClass().ifPresent(this::mainClass);
 
-                if (md.mainClass().isPresent()) {
-                    mainClass(md.mainClass().get());
-                }
+                // hashes
+                JLMA.hashes(md).ifPresent(mh -> {
+                    algorithm(mh.algorithm());
+                    mh.names().forEach(mn -> moduleHash(mn, mh.hashFor(mn)));
+                });
 
                 putModuleDescriptor();
             }
@@ -603,7 +655,7 @@
             /*
              * Invoke Builder.provides(String service, Set<String> providers)
              *
-             * Set<String> providers = new HashSet<>();
+             * Set<String> providers = new LinkedHashSet<>();
              * providers.add(impl);
              * :
              * :
@@ -652,6 +704,22 @@
                 mv.visitInsn(POP);
             }
 
+            void algorithm(String alg) {
+                mv.visitVarInsn(ALOAD, BUILDER_VAR);
+                mv.visitLdcInsn(alg);
+                mv.visitMethodInsn(INVOKEVIRTUAL, MODULE_DESCRIPTOR_BUILDER,
+                    "algorithm", STRING_SIG, false);
+                mv.visitInsn(POP);
+            }
+
+            void moduleHash(String name, String hashString) {
+                mv.visitVarInsn(ALOAD, BUILDER_VAR);
+                mv.visitLdcInsn(name);
+                mv.visitLdcInsn(hashString);
+                mv.visitMethodInsn(INVOKEVIRTUAL, MODULE_DESCRIPTOR_BUILDER,
+                    "moduleHash", STRING_STRING_SIG, false);
+                mv.visitInsn(POP);
+            }
         }
 
         /*
@@ -663,10 +731,17 @@
          */
         class StringSetBuilder {
             final Set<String> names;
+            final boolean linked;
             int refCount;
             int localVarIndex;
+
+            StringSetBuilder(Set<String> names, boolean linked) {
+                this.names = names;
+                this.linked = linked;
+            }
+
             StringSetBuilder(Set<String> names) {
-                this.names = names;
+                this(names, false);
             }
 
             void increment() {
@@ -704,11 +779,11 @@
                                 "singleton", "(Ljava/lang/Object;)Ljava/util/Set;", false);
                         mv.visitVarInsn(ASTORE, index);
                     } else {
-                        mv.visitTypeInsn(NEW, "java/util/HashSet");
+                        String cn = linked ? "java/util/LinkedHashSet" : "java/util/HashSet";
+                        mv.visitTypeInsn(NEW, cn);
                         mv.visitInsn(DUP);
                         pushInt(initialCapacity(names.size()));
-                        mv.visitMethodInsn(INVOKESPECIAL, "java/util/HashSet",
-                                "<init>", "(I)V", false);
+                        mv.visitMethodInsn(INVOKESPECIAL, cn, "<init>", "(I)V", false);
 
                         mv.visitVarInsn(ASTORE, index);
                         for (String t : names) {
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java	Wed Jul 05 21:40:37 2017 +0200
@@ -201,6 +201,8 @@
      * This method is called prior to invoke the plugin.
      *
      * @param config The plugin configuration.
+     * @throws IllegalArgumentException if a mandatory argument is missing or
+     * if an argument has invalid value.
      */
     public default void configure(Map<String, String> config) {
     }
@@ -211,6 +213,9 @@
      *
      * @param config The plugin configuration.
      * @param ctx The plugin context
+     * @throws IllegalArgumentException if a mandatory argument is missing or
+     * if an argument has invalid value.
+     *
      */
     public default void configure(Map<String, String> config, PluginContext ctx) {
         configure(config);
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Wed Jul 05 21:40:37 2017 +0200
@@ -33,9 +33,6 @@
 main.opt.endian=\
 \  --endian <little|big>             Byte order of generated jimage (default:native)
 
-main.opt.genbom=\
-\  --genbom                          Generate a bom file containing jlink info
-
 main.opt.saveopts=\
 \  --saveopts <filename>             Save jlink options in the given file
 
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties	Wed Jul 05 21:40:37 2017 +0200
@@ -89,6 +89,9 @@
 include-locales.invalidtag=\
 Invalid language tag: %s
 
+include-locales.localedatanotfound=\
+jdk.localedata module was not specified with --addmods option
+
 main.status.ok=Functional.
 
 main.status.not.ok= Not functional.
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,6 +26,7 @@
 package jdk.tools.jmod;
 
 import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -34,14 +35,17 @@
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.io.UncheckedIOException;
-import java.lang.module.FindException;
+import java.lang.module.Configuration;
+import java.lang.module.ModuleReader;
 import java.lang.module.ModuleReference;
 import java.lang.module.ModuleFinder;
+import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleDescriptor.Exports;
+import java.lang.module.ModuleDescriptor.Provides;
 import java.lang.module.ModuleDescriptor.Requires;
-import java.lang.module.ModuleDescriptor;
 import java.lang.module.ModuleDescriptor.Version;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
+import java.lang.module.ResolutionException;
+import java.lang.module.ResolvedModule;
 import java.net.URI;
 import java.nio.file.FileSystems;
 import java.nio.file.FileVisitResult;
@@ -51,13 +55,16 @@
 import java.nio.file.PathMatcher;
 import java.nio.file.Paths;
 import java.nio.file.SimpleFileVisitor;
+import java.nio.file.StandardCopyOption;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.text.MessageFormat;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Formatter;
+import java.util.Comparator;
+import java.util.Deque;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -68,6 +75,7 @@
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 import java.util.jar.JarEntry;
@@ -89,16 +97,14 @@
 import jdk.internal.joptsimple.OptionSet;
 import jdk.internal.joptsimple.OptionSpec;
 import jdk.internal.joptsimple.ValueConverter;
+import jdk.internal.misc.JavaLangModuleAccess;
+import jdk.internal.misc.SharedSecrets;
 import jdk.internal.module.ConfigurableModuleFinder;
 import jdk.internal.module.ConfigurableModuleFinder.Phase;
-import jdk.internal.module.Hasher;
-import jdk.internal.module.Hasher.DependencyHashes;
+import jdk.internal.module.ModuleHashes;
 import jdk.internal.module.ModuleInfoExtender;
 
-import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.joining;
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toMap;
 
 /**
  * Implementation for the jmod tool.
@@ -127,21 +133,6 @@
         }
     }
 
-    static <T extends Throwable> void fail(Class<T> type,
-                                           String format,
-                                           Object... args) throws T {
-        String msg = new Formatter().format(format, args).toString();
-        try {
-            T t = type.getConstructor(String.class).newInstance(msg);
-            throw t;
-        } catch (InstantiationException |
-                 InvocationTargetException |
-                 NoSuchMethodException |
-                 IllegalAccessException e) {
-            throw new InternalError("Unable to create an instance of " + type, e);
-        }
-    }
-
     private static final String PROGNAME = "jmod";
     private static final String MODULE_INFO = "module-info.class";
 
@@ -161,7 +152,8 @@
     enum Mode {
         CREATE,
         LIST,
-        DESCRIBE
+        DESCRIBE,
+        HASH
     };
 
     static class Options {
@@ -179,7 +171,8 @@
         String osName;
         String osArch;
         String osVersion;
-        Pattern dependenciesToHash;
+        Pattern modulesToHash;
+        boolean dryrun;
         List<PathMatcher> excludes;
     }
 
@@ -211,6 +204,9 @@
                 case DESCRIBE:
                     ok = describe();
                     break;
+                case HASH:
+                    ok = hashModules();
+                    break;
                 default:
                     throw new AssertionError("Unknown mode: " + options.mode.name());
             }
@@ -248,26 +244,8 @@
         }
     }
 
-    private Map<String, Path> modulesToPath(Set<ModuleDescriptor> modules) {
-        ModuleFinder finder = options.moduleFinder;
-
-        Map<String,Path> modPaths = new HashMap<>();
-        for (ModuleDescriptor m : modules) {
-            String name = m.name();
-
-            Optional<ModuleReference> omref = finder.find(name);
-            if (!omref.isPresent()) {
-                // this should not happen, module path bug?
-                fail(InternalError.class,
-                     "Selected module %s not on module path",
-                     name);
-            }
-
-            URI uri = omref.get().location().get();
-            modPaths.put(name, Paths.get(uri));
-
-        }
-        return modPaths;
+    private boolean hashModules() {
+        return new Hasher(options.moduleFinder).run();
     }
 
     private boolean describe() throws IOException {
@@ -297,6 +275,8 @@
                   .collect(joining(" "));
     }
 
+    private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
+
     private boolean printModuleDescriptor(InputStream in)
         throws IOException
     {
@@ -311,74 +291,45 @@
                     StringBuilder sb = new StringBuilder();
                     sb.append("\n").append(md.toNameAndVersion());
 
-                    List<Requires> requires = md.requires().stream().sorted().collect(toList());
-                    if (!requires.isEmpty()) {
-                        requires.forEach(r -> {
-                                sb.append("\n  requires ");
-                                if (!r.modifiers().isEmpty())
-                                  sb.append(toString(r.modifiers())).append(" ");
-                                sb.append(r.name());
-                            });
-                    }
-
-                    List<String> l = md.uses().stream().sorted().collect(toList());
-                    if (!l.isEmpty()) {
-                        l.forEach(sv -> sb.append("\n  uses ").append(sv));
-                    }
+                    md.requires().stream()
+                        .sorted(Comparator.comparing(Requires::name))
+                        .forEach(r -> {
+                            sb.append("\n  requires ");
+                            if (!r.modifiers().isEmpty())
+                                sb.append(toString(r.modifiers())).append(" ");
+                            sb.append(r.name());
+                        });
 
-                    List<ModuleDescriptor.Exports> exports = sortExports(md.exports());
-                    if (!exports.isEmpty()) {
-                        exports.forEach(ex -> sb.append("\n  exports ").append(ex));
-                    }
+                    md.uses().stream().sorted()
+                        .forEach(s -> sb.append("\n  uses ").append(s));
 
-                    l = md.conceals().stream().sorted().collect(toList());
-                    if (!l.isEmpty()) {
-                        l.forEach(p -> sb.append("\n  conceals ").append(p));
-                    }
+                    md.exports().stream()
+                        .sorted(Comparator.comparing(Exports::source))
+                        .forEach(p -> sb.append("\n  exports ").append(p));
 
-                    Map<String, ModuleDescriptor.Provides> provides = md.provides();
-                    if (!provides.isEmpty()) {
-                        provides.values().forEach(p ->
-                                sb.append("\n  provides ").append(p.service())
-                                  .append(" with ")
-                                  .append(toString(p.providers())));
-                    }
+                    md.conceals().stream().sorted()
+                        .forEach(p -> sb.append("\n  conceals ").append(p));
 
-                    Optional<String> mc = md.mainClass();
-                    if (mc.isPresent())
-                        sb.append("\n  main-class " + mc.get());
-
-
+                    md.provides().values().stream()
+                        .sorted(Comparator.comparing(Provides::service))
+                        .forEach(p -> sb.append("\n  provides ").append(p.service())
+                                        .append(" with ")
+                                        .append(toString(p.providers())));
 
-                    Optional<String> osname = md.osName();
-                    if (osname.isPresent())
-                        sb.append("\n  operating-system-name " + osname.get());
+                    md.mainClass().ifPresent(v -> sb.append("\n  main-class " + v));
 
-                    Optional<String> osarch = md.osArch();
-                    if (osarch.isPresent())
-                        sb.append("\n  operating-system-architecture " + osarch.get());
-
-                    Optional<String> osversion = md.osVersion();
-                    if (osversion.isPresent())
-                        sb.append("\n  operating-system-version " + osversion.get());
+                    md.osName().ifPresent(v -> sb.append("\n  operating-system-name " + v));
 
-                    try {
-                        Method m = ModuleDescriptor.class.getDeclaredMethod("hashes");
-                        m.setAccessible(true);
-                        @SuppressWarnings("unchecked")
-                        Optional<Hasher.DependencyHashes> optHashes =
-                                (Optional<Hasher.DependencyHashes>) m.invoke(md);
+                    md.osArch().ifPresent(v -> sb.append("\n  operating-system-architecture " + v));
+
+                    md.osVersion().ifPresent(v -> sb.append("\n  operating-system-version " + v));
 
-                        if (optHashes.isPresent()) {
-                            Hasher.DependencyHashes hashes = optHashes.get();
-                            hashes.names().stream().forEach(mod ->
-                                    sb.append("\n  hashes ").append(mod).append(" ")
-                                      .append(hashes.algorithm()).append(" ")
-                                      .append(hashes.hashFor(mod)));
-                        }
-                    } catch (ReflectiveOperationException x) {
-                        throw new InternalError(x);
-                    }
+                    JLMA.hashes(md).ifPresent(
+                            hashes -> hashes.names().stream().sorted().forEach(
+                                    mod -> sb.append("\n  hashes ").append(mod).append(" ")
+                                             .append(hashes.algorithm()).append(" ")
+                                             .append(hashes.hashFor(mod))));
+
                     out.println(sb.toString());
                     return true;
                 }
@@ -387,21 +338,6 @@
         return false;
     }
 
-    static List<ModuleDescriptor.Exports> sortExports(Set<ModuleDescriptor.Exports> exports) {
-        Map<String,ModuleDescriptor.Exports> map =
-                exports.stream()
-                       .collect(toMap(ModuleDescriptor.Exports::source,
-                                      identity()));
-        List<String> sources = exports.stream()
-                                      .map(ModuleDescriptor.Exports::source)
-                                      .sorted()
-                                      .collect(toList());
-
-        List<ModuleDescriptor.Exports> l = new ArrayList<>();
-        sources.forEach(e -> l.add(map.get(e)));
-        return l;
-    }
-
     private boolean create() throws IOException {
         JmodFileWriter jmod = new JmodFileWriter();
 
@@ -410,8 +346,9 @@
         Path target = options.jmodFile;
         Path tempTarget = target.resolveSibling(target.getFileName() + ".tmp");
         try {
-            try (OutputStream out = Files.newOutputStream(tempTarget)) {
-                jmod.write(out);
+            try (OutputStream out = Files.newOutputStream(tempTarget);
+                 BufferedOutputStream bos = new BufferedOutputStream(out)) {
+                jmod.write(bos);
             }
             Files.move(tempTarget, target);
         } catch (Exception e) {
@@ -428,7 +365,6 @@
     }
 
     private class JmodFileWriter {
-        final ModuleFinder moduleFinder = options.moduleFinder;
         final List<Path> cmds = options.cmds;
         final List<Path> libs = options.libs;
         final List<Path> configs = options.configs;
@@ -438,8 +374,8 @@
         final String osName = options.osName;
         final String osArch = options.osArch;
         final String osVersion = options.osVersion;
-        final Pattern dependenciesToHash = options.dependenciesToHash;
         final List<PathMatcher> excludes = options.excludes;
+        final Hasher hasher = hasher();
 
         JmodFileWriter() { }
 
@@ -545,11 +481,13 @@
                 if (moduleVersion != null)
                     extender.version(moduleVersion);
 
-                // --hash-dependencies
-                if (dependenciesToHash != null) {
-                    String name = descriptor.name();
-                    Set<Requires> dependences = descriptor.requires();
-                    extender.hashes(hashDependences(name, dependences));
+                if (hasher != null) {
+                    ModuleHashes moduleHashes = hasher.computeHashes(descriptor.name());
+                    if (moduleHashes != null) {
+                        extender.hashes(moduleHashes);
+                    } else {
+                        warning("warn.no.module.hashes", descriptor.name());
+                    }
                 }
 
                 // write the (possibly extended or modified) module-info.class
@@ -561,38 +499,56 @@
             }
         }
 
-        /**
-         * Examines the module dependences of the given module
-         * and computes the hash of any module that matches the
-         * pattern {@code dependenciesToHash}.
+        /*
+         * Hasher resolves a module graph using the --hash-modules PATTERN
+         * as the roots.
+         *
+         * The jmod file is being created and does not exist in the
+         * given modulepath.
          */
-        DependencyHashes hashDependences(String name, Set<Requires> moduleDependences)
-            throws IOException
-        {
-            Set<ModuleDescriptor> descriptors = new HashSet<>();
-            for (Requires md: moduleDependences) {
-                String dn = md.name();
-                if (dependenciesToHash.matcher(dn).find()) {
-                    try {
-                        Optional<ModuleReference> omref = moduleFinder.find(dn);
-                        if (!omref.isPresent()) {
-                            throw new RuntimeException("Hashing module " + name
-                                + " dependencies, unable to find module " + dn
-                                + " on module path");
+        private Hasher hasher() {
+            if (options.modulesToHash == null)
+                return null;
+
+            try {
+                Supplier<InputStream> miSupplier = newModuleInfoSupplier();
+                if (miSupplier == null) {
+                    throw new IOException(MODULE_INFO + " not found");
+                }
+
+                ModuleDescriptor descriptor;
+                try (InputStream in = miSupplier.get()) {
+                    descriptor = ModuleDescriptor.read(in);
+                }
+
+                URI uri = options.jmodFile.toUri();
+                ModuleReference mref = new ModuleReference(descriptor, uri, new Supplier<>() {
+                    @Override
+                    public ModuleReader get() {
+                        throw new UnsupportedOperationException();
+                    }
+                });
+
+                // compose a module finder with the module path and also
+                // a module finder that can find the jmod file being created
+                ModuleFinder finder = ModuleFinder.compose(options.moduleFinder,
+                    new ModuleFinder() {
+                        @Override
+                        public Optional<ModuleReference> find(String name) {
+                            if (descriptor.name().equals(name))
+                                return Optional.of(mref);
+                            else return Optional.empty();
                         }
-                        descriptors.add(omref.get().descriptor());
-                    } catch (FindException x) {
-                        throw new IOException("error reading module path", x);
-                    }
-                }
-            }
 
-            Map<String, Path> map = modulesToPath(descriptors);
-            if (map.size() == 0) {
-                return null;
-            } else {
-                // use SHA-256 for now, easy to make this configurable if needed
-                return Hasher.generate(map, "SHA-256");
+                        @Override
+                        public Set<ModuleReference> findAll() {
+                            return Collections.singleton(mref);
+                        }
+                    });
+
+                return new Hasher(finder);
+            } catch (IOException e) {
+                throw new UncheckedIOException(e);
             }
         }
 
@@ -765,6 +721,273 @@
         }
     }
 
+    /**
+     * Compute and record hashes
+     */
+    private class Hasher {
+        final ModuleFinder moduleFinder;
+        final Map<String, Path> moduleNameToPath;
+        final Set<String> modules;
+        final Configuration configuration;
+        final boolean dryrun = options.dryrun;
+        Hasher(ModuleFinder finder) {
+            this.moduleFinder = finder;
+            // Determine the modules that matches the pattern {@code modulesToHash}
+            this.modules = moduleFinder.findAll().stream()
+                .map(mref -> mref.descriptor().name())
+                .filter(mn -> options.modulesToHash.matcher(mn).find())
+                .collect(Collectors.toSet());
+
+            // a map from a module name to Path of the packaged module
+            this.moduleNameToPath = moduleFinder.findAll().stream()
+                .map(mref -> mref.descriptor().name())
+                .collect(Collectors.toMap(Function.identity(), mn -> moduleToPath(mn)));
+
+            // get a resolved module graph
+            Configuration config = null;
+            try {
+                config = Configuration.empty()
+                    .resolveRequires(ModuleFinder.ofSystem(), moduleFinder, modules);
+            } catch (ResolutionException e) {
+                warning("warn.module.resolution.fail", e.getMessage());
+            }
+            this.configuration = config;
+        }
+
+        /**
+         * This method is for jmod hash command.
+         *
+         * Identify the base modules in the module graph, i.e. no outgoing edge
+         * to any of the modules to be hashed.
+         *
+         * For each base module M, compute the hashes of all modules that depend
+         * upon M directly or indirectly.  Then update M's module-info.class
+         * to record the hashes.
+         */
+        boolean run() {
+            if (configuration == null)
+                return false;
+
+            // transposed graph containing the the packaged modules and
+            // its transitive dependences matching --hash-modules
+            Map<String, Set<String>> graph = new HashMap<>();
+            for (String root : modules) {
+                Deque<String> deque = new ArrayDeque<>();
+                deque.add(root);
+                Set<String> visited = new HashSet<>();
+                while (!deque.isEmpty()) {
+                    String mn = deque.pop();
+                    if (!visited.contains(mn)) {
+                        visited.add(mn);
+
+                        if (modules.contains(mn))
+                            graph.computeIfAbsent(mn, _k -> new HashSet<>());
+
+                        ResolvedModule resolvedModule = configuration.findModule(mn).get();
+                        for (ResolvedModule dm : resolvedModule.reads()) {
+                            String name = dm.name();
+                            if (!visited.contains(name)) {
+                                deque.push(name);
+                            }
+
+                            // reverse edge
+                            if (modules.contains(name) && modules.contains(mn)) {
+                                graph.computeIfAbsent(name, _k -> new HashSet<>()).add(mn);
+                            }
+                        }
+                    }
+                }
+            }
+
+            if (dryrun)
+                out.println("Dry run:");
+
+            // each node in a transposed graph is a matching packaged module
+            // in which the hash of the modules that depend upon it is recorded
+            graph.entrySet().stream()
+                .filter(e -> !e.getValue().isEmpty())
+                .forEach(e -> {
+                    String mn = e.getKey();
+                    Map<String, Path> modulesForHash = e.getValue().stream()
+                            .collect(Collectors.toMap(Function.identity(),
+                                                      moduleNameToPath::get));
+                    ModuleHashes hashes = ModuleHashes.generate(modulesForHash, "SHA-256");
+                    if (dryrun) {
+                        out.format("%s%n", mn);
+                        hashes.names().stream()
+                              .sorted()
+                              .forEach(name -> out.format("  hashes %s %s %s%n",
+                                  name, hashes.algorithm(), hashes.hashFor(name)));
+                    } else {
+                        try {
+                            updateModuleInfo(mn, hashes);
+                        } catch (IOException ex) {
+                            throw new UncheckedIOException(ex);
+                        }
+                    }
+                });
+            return true;
+        }
+
+        /**
+         * Compute hashes of the specified module.
+         *
+         * It records the hashing modules that depend upon the specified
+         * module directly or indirectly.
+         */
+        ModuleHashes computeHashes(String name) {
+            if (configuration == null)
+                return null;
+
+            // the transposed graph includes all modules in the resolved graph
+            Map<String, Set<String>> graph = transpose();
+
+            // find the modules that transitively depend upon the specified name
+            Deque<String> deque = new ArrayDeque<>();
+            deque.add(name);
+            Set<String> mods = visitNodes(graph, deque);
+
+            // filter modules matching the pattern specified --hash-modules
+            // as well as itself as the jmod file is being generated
+            Map<String, Path> modulesForHash = mods.stream()
+                .filter(mn -> !mn.equals(name) && modules.contains(mn))
+                .collect(Collectors.toMap(Function.identity(), moduleNameToPath::get));
+
+            if (modulesForHash.isEmpty())
+                return null;
+
+           return ModuleHashes.generate(modulesForHash, "SHA-256");
+        }
+
+        /**
+         * Returns all nodes traversed from the given roots.
+         */
+        private Set<String> visitNodes(Map<String, Set<String>> graph,
+                                       Deque<String> roots) {
+            Set<String> visited = new HashSet<>();
+            while (!roots.isEmpty()) {
+                String mn = roots.pop();
+                if (!visited.contains(mn)) {
+                    visited.add(mn);
+                    // the given roots may not be part of the graph
+                    if (graph.containsKey(mn)) {
+                        for (String dm : graph.get(mn)) {
+                            if (!visited.contains(dm)) {
+                                roots.push(dm);
+                            }
+                        }
+                    }
+                }
+            }
+            return visited;
+        }
+
+        /**
+         * Returns a transposed graph from the resolved module graph.
+         */
+        private Map<String, Set<String>> transpose() {
+            Map<String, Set<String>> transposedGraph = new HashMap<>();
+            Deque<String> deque = new ArrayDeque<>(modules);
+
+            Set<String> visited = new HashSet<>();
+            while (!deque.isEmpty()) {
+                String mn = deque.pop();
+                if (!visited.contains(mn)) {
+                    visited.add(mn);
+
+                    transposedGraph.computeIfAbsent(mn, _k -> new HashSet<>());
+
+                    ResolvedModule resolvedModule = configuration.findModule(mn).get();
+                    for (ResolvedModule dm : resolvedModule.reads()) {
+                        String name = dm.name();
+                        if (!visited.contains(name)) {
+                            deque.push(name);
+                        }
+
+                        // reverse edge
+                        transposedGraph.computeIfAbsent(name, _k -> new HashSet<>())
+                                .add(mn);
+                    }
+                }
+            }
+            return transposedGraph;
+        }
+
+        /**
+         * Reads the given input stream of module-info.class and write
+         * the extended module-info.class with the given ModuleHashes
+         *
+         * @param in       InputStream of module-info.class
+         * @param out      OutputStream to write the extended module-info.class
+         * @param hashes   ModuleHashes
+         */
+        private void recordHashes(InputStream in, OutputStream out, ModuleHashes hashes)
+            throws IOException
+        {
+            ModuleInfoExtender extender = ModuleInfoExtender.newExtender(in);
+            extender.hashes(hashes);
+            extender.write(out);
+        }
+
+        private void updateModuleInfo(String name, ModuleHashes moduleHashes)
+            throws IOException
+        {
+            Path target = moduleNameToPath.get(name);
+            Path tempTarget = target.resolveSibling(target.getFileName() + ".tmp");
+            ZipFile zip = new ZipFile(target.toFile());
+            try {
+                try (OutputStream out = Files.newOutputStream(tempTarget);
+                     ZipOutputStream zos = new ZipOutputStream(out)) {
+                    zip.stream().forEach(e -> {
+                        try {
+                            InputStream in = zip.getInputStream(e);
+                            if (e.getName().equals(MODULE_INFO) ||
+                                e.getName().equals(Section.CLASSES.jmodDir() + "/" + MODULE_INFO)) {
+                                ZipEntry ze = new ZipEntry(e.getName());
+                                ze.setTime(System.currentTimeMillis());
+                                zos.putNextEntry(ze);
+                                recordHashes(in, zos, moduleHashes);
+                                zos.closeEntry();
+                            } else {
+                                zos.putNextEntry(e);
+                                zos.write(in.readAllBytes());
+                                zos.closeEntry();
+                            }
+                        } catch (IOException x) {
+                            throw new UncheckedIOException(x);
+                        }
+                    });
+                }
+            } catch (IOException|RuntimeException e) {
+                if (Files.exists(tempTarget)) {
+                    try {
+                        Files.delete(tempTarget);
+                    } catch (IOException ioe) {
+                        e.addSuppressed(ioe);
+                    }
+                }
+                throw e;
+            } finally {
+                zip.close();
+            }
+            out.println(getMessage("module.hashes.recorded", name));
+            Files.move(tempTarget, target, StandardCopyOption.REPLACE_EXISTING);
+        }
+
+        private Path moduleToPath(String name) {
+            ModuleReference mref = moduleFinder.find(name).orElseThrow(
+                () -> new InternalError("Selected module " + name + " not on module path"));
+
+            URI uri = mref.location().get();
+            Path path = Paths.get(uri);
+            String fn = path.getFileName().toString();
+            if (!fn.endsWith(".jar") && !fn.endsWith(".jmod")) {
+                throw new InternalError(path + " is not a modular JAR or jmod file");
+            }
+            return path;
+        }
+    }
+
     enum Section {
         NATIVE_LIBS("native"),
         NATIVE_CMDS("bin"),
@@ -921,7 +1144,8 @@
             builder.append("\n").append(" Main operation modes:\n  ");
             builder.append(getMessage("main.opt.mode.create")).append("\n  ");
             builder.append(getMessage("main.opt.mode.list")).append("\n  ");
-            builder.append(getMessage("main.opt.mode.describe")).append("\n\n");
+            builder.append(getMessage("main.opt.mode.describe")).append("\n  ");
+            builder.append(getMessage("main.opt.mode.hash")).append("\n\n");
 
             String cmdfile = null;
             String[] lines = content.split("\n");
@@ -964,13 +1188,16 @@
                         .withValuesSeparatedBy(File.pathSeparatorChar)
                         .withValuesConvertedBy(DirPathConverter.INSTANCE);
 
+        OptionSpec<Void> dryrun
+            = parser.accepts("dry-run", getMessage("main.opt.dry-run"));
+
         OptionSpec<PathMatcher> excludes
                 = parser.accepts("exclude", getMessage("main.opt.exclude"))
                         .withRequiredArg()
                         .withValuesConvertedBy(new GlobConverter());
 
-        OptionSpec<Pattern> hashDependencies
-                = parser.accepts("hash-dependencies", getMessage("main.opt.hash-dependencies"))
+        OptionSpec<Pattern> hashModules
+                = parser.accepts("hash-modules", getMessage("main.opt.hash-modules"))
                         .withRequiredArg()
                         .withValuesConvertedBy(new PatternConverter());
 
@@ -1049,6 +1276,8 @@
                 options.cmds = opts.valuesOf(cmds);
             if (opts.has(config))
                 options.configs = opts.valuesOf(config);
+            if (opts.has(dryrun))
+                options.dryrun = true;
             if (opts.has(excludes))
                 options.excludes = opts.valuesOf(excludes);
             if (opts.has(libs))
@@ -1069,27 +1298,39 @@
                 options.osArch = opts.valueOf(osArch);
             if (opts.has(osVersion))
                 options.osVersion = opts.valueOf(osVersion);
-            if (opts.has(hashDependencies)) {
-                options.dependenciesToHash = opts.valueOf(hashDependencies);
-                // if storing hashes of dependencies then the module path is required
+            if (opts.has(hashModules)) {
+                options.modulesToHash = opts.valueOf(hashModules);
+                // if storing hashes then the module path is required
                 if (options.moduleFinder == null)
-                    throw new CommandException("err.modulepath.must.be.specified").showUsage(true);
+                    throw new CommandException("err.modulepath.must.be.specified")
+                            .showUsage(true);
             }
 
-            if (words.size() <= 1)
-                throw new CommandException("err.jmod.must.be.specified").showUsage(true);
-            Path path = Paths.get(words.get(1));
-            if (options.mode.equals(Mode.CREATE) && Files.exists(path))
-                throw new CommandException("err.file.already.exists", path);
-            else if ((options.mode.equals(Mode.LIST) ||
-                          options.mode.equals(Mode.DESCRIBE))
-                      && Files.notExists(path))
-                throw new CommandException("err.jmod.not.found", path);
-            options.jmodFile = path;
+            if (options.mode.equals(Mode.HASH)) {
+                if (options.moduleFinder == null || options.modulesToHash == null)
+                    throw new CommandException("err.modulepath.must.be.specified")
+                            .showUsage(true);
+            } else {
+                if (words.size() <= 1)
+                    throw new CommandException("err.jmod.must.be.specified").showUsage(true);
+                Path path = Paths.get(words.get(1));
 
-            if (words.size() > 2)
-                throw new CommandException("err.unknown.option",
-                        words.subList(2, words.size())).showUsage(true);
+                if (options.mode.equals(Mode.CREATE) && Files.exists(path))
+                    throw new CommandException("err.file.already.exists", path);
+                else if ((options.mode.equals(Mode.LIST) ||
+                            options.mode.equals(Mode.DESCRIBE))
+                         && Files.notExists(path))
+                    throw new CommandException("err.jmod.not.found", path);
+
+                if (options.dryrun) {
+                    throw new CommandException("err.invalid.dryrun.option");
+                }
+                options.jmodFile = path;
+
+                if (words.size() > 2)
+                    throw new CommandException("err.unknown.option",
+                            words.subList(2, words.size())).showUsage(true);
+            }
 
             if (options.mode.equals(Mode.CREATE) && options.classpath == null)
                 throw new CommandException("err.classpath.must.be.specified").showUsage(true);
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties	Wed Jul 05 21:40:37 2017 +0200
@@ -1,9 +1,9 @@
 main.usage.summary=\
-Usage: {0} (create|list|describe) <OPTIONS> <jmod-file>\n\
+Usage: {0} (create|list|describe|hash) <OPTIONS> <jmod-file>\n\
 use --help for a list of possible options
 
 main.usage=\
-Usage: {0} (create|list|describe) <OPTIONS> <jmod-file>
+Usage: {0} (create|list|describe|hash) <OPTIONS> <jmod-file>
 
 error.prefix=Error:
 warn.prefix=Warning:
@@ -14,6 +14,8 @@
 \list      - Prints the names of all the entries
 main.opt.mode.describe=\
 \describe  - Prints the module details
+main.opt.mode.hash=\
+\hash      - Records hashes of tied modules.
 
 main.opt.help=Print this usage message
 main.opt.version=Version information
@@ -21,9 +23,9 @@
 main.opt.libs=Location of native libraries
 main.opt.cmds=Location of native commands
 main.opt.config=Location of user-editable config files
+main.opt.dry-run=Dry run of hash mode
 main.opt.exclude=Exclude files, given as a PATTERN
 main.opt.module-version= Module version
-main.opt.modulepath=Module path
 main.opt.main-class=Main class
 main.opt.main-class.arg=class-name
 main.opt.os-name=Operating system name
@@ -32,18 +34,25 @@
 main.opt.os-arch.arg=os-arch
 main.opt.os-version=Operating system version
 main.opt.os-version.arg=os-version
-main.opt.hash-dependencies=Compute and record hashes of dependencies matched by the pattern
+main.opt.modulepath=Module path
+main.opt.hash-modules=Compute and record hashes to tie a packaged module\
+\ with modules matching the given pattern and depending upon it directly\
+\ or indirectly. The hashes are recorded in the JMOD file being created, or\
+\ a JMOD file or modular JAR on the module path specified the jmod hash command.
+
 main.opt.cmdfile=Read options from the specified file
 
-err.missing.mode=one of create, list, or describe must be specified
-err.invalid.mode=mode must be one of create, list, or describe: {0}
+module.hashes.recorded=Hashes are recorded in module {0}
+
+err.missing.mode=one of create, list, describe, or hash must be specified
+err.invalid.mode=mode must be one of create, list, describe, or hash: {0}
 err.classpath.must.be.specified=--class-path must be specified
 err.jmod.must.be.specified=jmod-file must be specified
 err.invalid.version=invalid module version {0}
-err.output.must.be.specified:--output must be specified
-err.mods.must.be.specified:--mods must be specified
-err.modulepath.must.be.specified:--module-path must be specified when hashing dependencies
-err.invalid.main-class:invalid main-class name: {0}
+err.output.must.be.specified=--output must be specified
+err.mods.must.be.specified=--mods must be specified
+err.modulepath.must.be.specified=--module-path must be specified when hashing modules
+err.invalid.main-class=invalid main-class name: {0}
 err.path.not.found=path not found: {0}
 err.path.not.valid=invalid path: {0}
 err.path.not.a.dir=path must be a directory: {0}
@@ -54,5 +63,9 @@
 err.unknown.option=unknown option(s): {0}
 err.missing.arg=no value given for {0}
 err.internal.error=internal error: {0} {1} {2}
+err.invalid.dryrun.option=--dry-run can only be used with hash mode
 err.module.descriptor.not.found=Module descriptor not found
 warn.invalid.arg=Invalid classname or pathname not exist: {0}
+warn.no.module.hashes=No hashes recorded: no module specified for hashing depends on {0}
+warn.module.resolution.fail=No hashes recorded: {0}
+
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/LocaleDataProvider.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/LocaleDataProvider.java	Wed Jul 05 21:40:37 2017 +0200
@@ -46,7 +46,7 @@
         Class<?> c = Class.forName(LocaleDataProvider.class.getModule(), bundleName);
         if (c != null && ResourceBundle.class.isAssignableFrom(c)) {
             try {
-                @SuppressWarnings("unchecked")
+                @SuppressWarnings({"unchecked", "deprecation"})
                 ResourceBundle rb = ((Class<ResourceBundle>) c).newInstance();
                 return rb;
             } catch (InstantiationException | IllegalAccessException e) {
--- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java	Wed Jul 05 21:40:37 2017 +0200
@@ -52,10 +52,10 @@
     private Function<byte[],byte[]> lookup;
 
     @Override
-    Entry getEntry(byte[] path) throws IOException {
+    IndexNode getInode(byte[] path) {
         // check for an alias to a versioned entry
         byte[] versionedPath = lookup.apply(path);
-        return versionedPath == null ? super.getEntry(path) : super.getEntry(versionedPath);
+        return versionedPath == null ? super.getInode(path) : super.getInode(versionedPath);
     }
 
     JarFileSystem(ZipFileSystemProvider provider, Path zfpath, Map<String,?> env)
@@ -87,7 +87,7 @@
     }
 
     private boolean isMultiReleaseJar() {
-        try (InputStream is = newInputStream(getBytes("META-INF/MANIFEST.MF"))) {
+        try (InputStream is = newInputStream(getBytes("/META-INF/MANIFEST.MF"))) {
             return (new Manifest(is)).getMainAttributes()
                     .containsKey(new Attributes.Name("Multi-Release"));
             // fixme change line above after JarFile integration to contain Attributes.Name.MULTI_RELEASE
@@ -108,7 +108,7 @@
      */
     private Function<byte[],byte[]> createVersionedLinks(int version) {
         HashMap<IndexNode,byte[]> aliasMap = new HashMap<>();
-        getVersionMap(version, getInode(getBytes("META-INF/versions"))).values()
+        getVersionMap(version, getInode(getBytes("/META-INF/versions"))).values()
                 .forEach(versionNode -> {   // for each META-INF/versions/{n} directory
                     // put all the leaf inodes, i.e. entries, into the alias map
                     // possibly shadowing lower versioned entries
@@ -176,7 +176,7 @@
      *   returns foo/bar.class
      */
     private byte[] getRootName(IndexNode prefix, IndexNode inode) {
-        int offset = prefix.name.length;
+        int offset = prefix.name.length - 1;
         byte[] fullName = inode.name;
         return Arrays.copyOfRange(fullName, offset, fullName.length);
     }
--- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileAttributes.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileAttributes.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,122 +26,17 @@
 package jdk.nio.zipfs;
 
 import java.nio.file.attribute.BasicFileAttributes;
-import java.nio.file.attribute.FileTime;
-import java.util.Arrays;
-import java.util.Formatter;
-import static jdk.nio.zipfs.ZipUtils.*;
 
 /**
  *
  * @author  Xueming Shen, Rajendra Gutupalli,Jaya Hangal
  */
 
-class ZipFileAttributes implements BasicFileAttributes
-{
-    private final ZipFileSystem.Entry e;
-
-    ZipFileAttributes(ZipFileSystem.Entry e) {
-        this.e = e;
-    }
-
-    ///////// basic attributes ///////////
-    @Override
-    public FileTime creationTime() {
-        if (e.ctime != -1)
-            return FileTime.fromMillis(e.ctime);
-        return null;
-    }
-
-    @Override
-    public boolean isDirectory() {
-        return e.isDir();
-    }
-
-    @Override
-    public boolean isOther() {
-        return false;
-    }
-
-    @Override
-    public boolean isRegularFile() {
-        return !e.isDir();
-    }
-
-    @Override
-    public FileTime lastAccessTime() {
-        if (e.atime != -1)
-            return FileTime.fromMillis(e.atime);
-        return null;
-    }
-
-    @Override
-    public FileTime lastModifiedTime() {
-        return FileTime.fromMillis(e.mtime);
-    }
-
-    @Override
-    public long size() {
-        return e.size;
-    }
-
-    @Override
-    public boolean isSymbolicLink() {
-        return false;
-    }
-
-    @Override
-    public Object fileKey() {
-        return null;
-    }
-
-    ///////// zip entry attributes ///////////
-    public long compressedSize() {
-        return e.csize;
-    }
-
-    public long crc() {
-        return e.crc;
-    }
-
-    public int method() {
-        return e.method;
-    }
-
-    public byte[] extra() {
-        if (e.extra != null)
-            return Arrays.copyOf(e.extra, e.extra.length);
-        return null;
-    }
-
-    public byte[] comment() {
-        if (e.comment != null)
-            return Arrays.copyOf(e.comment, e.comment.length);
-        return null;
-    }
-
-    public String toString() {
-        StringBuilder sb = new StringBuilder(1024);
-        Formatter fm = new Formatter(sb);
-        if (creationTime() != null)
-            fm.format("    creationTime    : %tc%n", creationTime().toMillis());
-        else
-            fm.format("    creationTime    : null%n");
-
-        if (lastAccessTime() != null)
-            fm.format("    lastAccessTime  : %tc%n", lastAccessTime().toMillis());
-        else
-            fm.format("    lastAccessTime  : null%n");
-        fm.format("    lastModifiedTime: %tc%n", lastModifiedTime().toMillis());
-        fm.format("    isRegularFile   : %b%n", isRegularFile());
-        fm.format("    isDirectory     : %b%n", isDirectory());
-        fm.format("    isSymbolicLink  : %b%n", isSymbolicLink());
-        fm.format("    isOther         : %b%n", isOther());
-        fm.format("    fileKey         : %s%n", fileKey());
-        fm.format("    size            : %d%n", size());
-        fm.format("    compressedSize  : %d%n", compressedSize());
-        fm.format("    crc             : %x%n", crc());
-        fm.format("    method          : %d%n", method());
-        fm.close();
-        return sb.toString();
-    }
+interface ZipFileAttributes extends BasicFileAttributes {
+    public long compressedSize();
+    public long crc();
+    public int method();
+    public byte[] extra();
+    public byte[] comment();
+    public String toString();
 }
--- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java	Wed Jul 05 21:40:37 2017 +0200
@@ -68,36 +68,29 @@
 class ZipFileSystem extends FileSystem {
 
     private final ZipFileSystemProvider provider;
-    private final ZipPath defaultdir;
-    private boolean readOnly = false;
     private final Path zfpath;
     private final ZipCoder zc;
-
+    private final boolean noExtt;        // see readExtra()
+    private final ZipPath rootdir;
     // configurable by env map
-    private final String  defaultDir;    // default dir for the file system
-    private final String  nameEncoding;  // default encoding for name/comment
     private final boolean useTempFile;   // use a temp file for newOS, default
                                          // is to use BAOS for better performance
-    private final boolean createNew;     // create a new zip if not exists
+    private boolean readOnly = false;    // readonly file system
     private static final boolean isWindows = AccessController.doPrivileged(
             (PrivilegedAction<Boolean>) () -> System.getProperty("os.name")
                                                     .startsWith("Windows"));
 
     ZipFileSystem(ZipFileSystemProvider provider,
                   Path zfpath,
-                  Map<String, ?> env)
-        throws IOException
+                  Map<String, ?> env)  throws IOException
     {
-        // configurable env setup
-        this.createNew    = "true".equals(env.get("create"));
-        this.nameEncoding = env.containsKey("encoding") ?
-                            (String)env.get("encoding") : "UTF-8";
+        // create a new zip if not exists
+        boolean createNew = "true".equals(env.get("create"));
+        // default encoding for name/comment
+        String nameEncoding = env.containsKey("encoding") ?
+                              (String)env.get("encoding") : "UTF-8";
+        this.noExtt = "false".equals(env.get("zipinfo-time"));
         this.useTempFile  = TRUE.equals(env.get("useTempFile"));
-        this.defaultDir   = env.containsKey("default.dir") ?
-                            (String)env.get("default.dir") : "/";
-        if (this.defaultDir.charAt(0) != '/')
-            throw new IllegalArgumentException("default dir should be absolute");
-
         this.provider = provider;
         this.zfpath = zfpath;
         if (Files.notExists(zfpath)) {
@@ -113,10 +106,9 @@
         zfpath.getFileSystem().provider().checkAccess(zfpath, AccessMode.READ);
         boolean writeable = AccessController.doPrivileged(
             (PrivilegedAction<Boolean>) () ->  Files.isWritable(zfpath));
-        if (!writeable)
-            this.readOnly = true;
+        this.readOnly = !writeable;
         this.zc = ZipCoder.get(nameEncoding);
-        this.defaultdir = new ZipPath(this, getBytes(defaultDir));
+        this.rootdir = new ZipPath(this, new byte[]{'/'});
         this.ch = Files.newByteChannel(zfpath, READ);
         try {
             this.cen = initCEN();
@@ -161,33 +153,29 @@
 
     @Override
     public Iterable<Path> getRootDirectories() {
-        ArrayList<Path> pathArr = new ArrayList<>();
-        pathArr.add(new ZipPath(this, new byte[]{'/'}));
-        return pathArr;
+        return List.of(rootdir);
     }
 
-    ZipPath getDefaultDir() {  // package private
-        return defaultdir;
+    ZipPath getRootDir() {
+        return rootdir;
     }
 
     @Override
     public ZipPath getPath(String first, String... more) {
-        String path;
         if (more.length == 0) {
-            path = first;
-        } else {
-            StringBuilder sb = new StringBuilder();
-            sb.append(first);
-            for (String segment: more) {
-                if (segment.length() > 0) {
-                    if (sb.length() > 0)
-                        sb.append('/');
-                    sb.append(segment);
+            return new ZipPath(this, getBytes(first));
+        }
+        StringBuilder sb = new StringBuilder();
+        sb.append(first);
+        for (String path : more) {
+            if (path.length() > 0) {
+                if (sb.length() > 0) {
+                    sb.append('/');
                 }
+                sb.append(path);
             }
-            path = sb.toString();
         }
-        return new ZipPath(this, getBytes(path));
+        return new ZipPath(this, getBytes(sb.toString()));
     }
 
     @Override
@@ -206,14 +194,11 @@
 
     @Override
     public Iterable<FileStore> getFileStores() {
-        ArrayList<FileStore> list = new ArrayList<>(1);
-        list.add(new ZipFileStore(new ZipPath(this, new byte[]{'/'})));
-        return list;
+        return List.of(new ZipFileStore(rootdir));
     }
 
     private static final Set<String> supportedFileAttributeViews =
-            Collections.unmodifiableSet(
-                new HashSet<String>(Arrays.asList("basic", "zip")));
+            Set.of("basic", "zip");
 
     @Override
     public Set<String> supportedFileAttributeViews() {
@@ -331,12 +316,26 @@
                     return null;
                 e = new Entry(inode.name);       // pseudo directory
                 e.method = METHOD_STORED;        // STORED for dir
-                e.mtime = e.atime = e.ctime = -1;// -1 for all times
+                e.mtime = e.atime = e.ctime = zfsDefaultTimeStamp;
             }
         } finally {
             endRead();
         }
-        return new ZipFileAttributes(e);
+        return e;
+    }
+
+    void checkAccess(byte[] path) throws IOException {
+        beginRead();
+        try {
+            ensureOpen();
+            // is it necessary to readCEN as a sanity check?
+            if (getInode(path) == null) {
+                throw new NoSuchFileException(toString());
+            }
+
+        } finally {
+            endRead();
+        }
     }
 
     void setTimes(byte[] path, FileTime mtime, FileTime atime, FileTime ctime)
@@ -387,14 +386,6 @@
         }
     }
 
-    private ZipPath toZipPath(byte[] path) {
-        // make it absolute
-        byte[] p = new byte[path.length + 1];
-        p[0] = '/';
-        System.arraycopy(path, 0, p, 1, path.length);
-        return new ZipPath(this, p);
-    }
-
     // returns the list of child paths of "path"
     Iterator<Path> iteratorOf(byte[] path,
                               DirectoryStream.Filter<? super Path> filter)
@@ -409,7 +400,7 @@
             List<Path> list = new ArrayList<>();
             IndexNode child = inode.child;
             while (child != null) {
-                ZipPath zp = toZipPath(child.name);
+                ZipPath zp = new ZipPath(this, child.name);
                 if (filter == null || filter.accept(zp))
                     list.add(zp);
                 child = child.sibling;
@@ -450,6 +441,7 @@
         try {
             ensureOpen();
             Entry eSrc = getEntry(src);  // ensureOpen checked
+
             if (eSrc == null)
                 throw new NoSuchFileException(getString(src));
             if (eSrc.isDir()) {    // spec says to create dst dir
@@ -679,7 +671,7 @@
                     }
 
                     public SeekableByteChannel truncate(long size)
-                    throws IOException
+                        throws IOException
                     {
                         throw new NonWritableChannelException();
                     }
@@ -879,7 +871,8 @@
     private void checkParents(byte[] path) throws IOException {
         beginRead();
         try {
-            while ((path = getParent(path)) != null && path.length != 0) {
+            while ((path = getParent(path)) != null &&
+                    path != ROOTPATH) {
                 if (!inodes.containsKey(IndexNode.keyOf(path))) {
                     throw new NoSuchFileException(getString(path));
                 }
@@ -889,15 +882,20 @@
         }
     }
 
-    private static byte[] ROOTPATH = new byte[0];
+    private static byte[] ROOTPATH = new byte[] { '/' };
     private static byte[] getParent(byte[] path) {
+        int off = getParentOff(path);
+        if (off <= 1)
+            return ROOTPATH;
+        return Arrays.copyOf(path, off + 1);
+    }
+
+    private static int getParentOff(byte[] path) {
         int off = path.length - 1;
         if (off > 0 && path[off] == '/')  // isDirectory
             off--;
         while (off > 0 && path[off] != '/') { off--; }
-        if (off <= 0)
-            return ROOTPATH;
-        return Arrays.copyOf(path, off + 1);
+        return off;
     }
 
     private final void beginWrite() {
@@ -941,19 +939,6 @@
         close();
     }
 
-    private long getDataPos(Entry e) throws IOException {
-        if (e.locoff == -1) {
-            Entry e2 = getEntry(e.name);
-            if (e2 == null)
-                throw new ZipException("invalid loc for entry <" + e.name + ">");
-            e.locoff = e2.locoff;
-        }
-        byte[] buf = new byte[LOCHDR];
-        if (readFullyAt(buf, 0, buf.length, e.locoff) != buf.length)
-            throw new ZipException("invalid loc for entry <" + e.name + ">");
-        return locpos + e.locoff + LOCHDR + LOCNAM(buf) + LOCEXT(buf);
-    }
-
     // Reads len bytes of data from the specified offset into buf.
     // Returns the total number of bytes read.
     // Each/every byte read from here (except the cen, which is mapped).
@@ -1090,7 +1075,9 @@
             if (pos + CENHDR + nlen > limit) {
                 zerror("invalid CEN header (bad header size)");
             }
-            byte[] name = Arrays.copyOfRange(cen, pos + CENHDR, pos + CENHDR + nlen);
+            byte[] name = new byte[nlen + 1];
+            System.arraycopy(cen, pos + CENHDR, name, 1, nlen);
+            name[0] = '/';
             IndexNode inode = new IndexNode(name, pos);
             inodes.put(inode, inode);
             // skip ext and comment
@@ -1278,7 +1265,7 @@
                     if (inode.pos == -1) {
                         continue;               // pseudo directory node
                     }
-                    e = Entry.readCEN(this, inode.pos);
+                    e = Entry.readCEN(this, inode);
                     try {
                         written += copyLOCEntry(e, false, os, written, buf);
                         elist.add(e);
@@ -1320,13 +1307,6 @@
 
         Files.move(tmpFile, zfpath, REPLACE_EXISTING);
         hasUpdate = false;    // clear
-        /*
-        if (isOpen) {
-            ch = zfpath.newByteChannel(READ); // re-fresh "ch" and "cen"
-            cen = initCEN();
-        }
-         */
-        //System.out.printf("->sync(%s) done!%n", toString());
     }
 
     IndexNode getInode(byte[] path) {
@@ -1350,7 +1330,7 @@
             return (Entry)inode;
         if (inode == null || inode.pos == -1)
             return null;
-        return Entry.readCEN(this, inode.pos);
+        return Entry.readCEN(this, inode);
     }
 
     public void deleteFile(byte[] path, boolean failIfNotExists)
@@ -1432,7 +1412,6 @@
                 bufSize = 8192;
             final long size = e.size;
             eis = new InflaterInputStream(eis, getInflater(), (int)bufSize) {
-
                 private boolean isClosed = false;
                 public void close() throws IOException {
                     if (!isClosed) {
@@ -1493,10 +1472,20 @@
             this.zfch = zfch;
             rem = e.csize;
             size = e.size;
-            pos = getDataPos(e);
+            pos = e.locoff;
+            if (pos == -1) {
+                Entry e2 = getEntry(e.name);
+                if (e2 == null) {
+                    throw new ZipException("invalid loc for entry <" + e.name + ">");
+                }
+                pos = e2.locoff;
+            }
+            pos = -pos;  // lazy initialize the real data offset
         }
+
         public int read(byte b[], int off, int len) throws IOException {
             ensureOpen();
+            initDataPos();
             if (rem == 0) {
                 return -1;
             }
@@ -1523,6 +1512,7 @@
             }
             return (int)n;
         }
+
         public int read() throws IOException {
             byte[] b = new byte[1];
             if (read(b, 0, 1) == 1) {
@@ -1531,6 +1521,7 @@
                 return -1;
             }
         }
+
         public long skip(long n) throws IOException {
             ensureOpen();
             if (n > rem)
@@ -1542,16 +1533,30 @@
             }
             return n;
         }
+
         public int available() {
             return rem > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) rem;
         }
+
         public long size() {
             return size;
         }
+
         public void close() {
             rem = 0;
             streams.remove(this);
         }
+
+        private void initDataPos() throws IOException {
+            if (pos <= 0) {
+                pos = -pos + locpos;
+                byte[] buf = new byte[LOCHDR];
+                if (readFullyAt(buf, 0, buf.length, pos) != LOCHDR) {
+                    throw new ZipException("invalid loc " + pos + " for entry reading");
+                }
+                pos += LOCHDR + LOCNAM(buf) + LOCEXT(buf);
+            }
+        }
     }
 
     class EntryOutputStream extends DeflaterOutputStream
@@ -1701,8 +1706,9 @@
 
     // End of central directory record
     static class END {
-        int  disknum;
-        int  sdisknum;
+        // these 2 fields are not used by anyone and write() uses "0"
+        // int  disknum;
+        // int  sdisknum;
         int  endsub;     // endsub
         int  centot;     // 4 bytes
         long cenlen;     // 4 bytes
@@ -1711,9 +1717,9 @@
         byte[] comment;
 
         /* members of Zip64 end of central directory locator */
-        int diskNum;
+        // int diskNum;
         long endpos;
-        int disktot;
+        // int disktot;
 
         void write(OutputStream os, long offset) throws IOException {
             boolean hasZip64 = false;
@@ -1776,6 +1782,11 @@
         int    hashcode;  // node is hashable/hashed by its name
         int    pos = -1;  // position in cen table, -1 menas the
                           // entry does not exists in zip file
+        IndexNode(byte[] name) {
+            name(name);
+            this.pos = -1;
+        }
+
         IndexNode(byte[] name, int pos) {
             name(name);
             this.pos = pos;
@@ -1804,6 +1815,9 @@
             if (!(other instanceof IndexNode)) {
                 return false;
             }
+            if (other instanceof ParentLookup) {
+                return ((ParentLookup)other).equals(this);
+            }
             return Arrays.equals(name, ((IndexNode)other).name);
         }
 
@@ -1816,17 +1830,16 @@
         IndexNode child;  // 1st child
     }
 
-    static class Entry extends IndexNode {
+    static class Entry extends IndexNode implements ZipFileAttributes {
 
-        static final int CEN    = 1;    // entry read from cen
-        static final int NEW    = 2;    // updated contents in bytes or file
-        static final int FILECH = 3;    // fch update in "file"
-        static final int COPY   = 4;    // copy of a CEN entry
+        static final int CEN    = 1;  // entry read from cen
+        static final int NEW    = 2;  // updated contents in bytes or file
+        static final int FILECH = 3;  // fch update in "file"
+        static final int COPY   = 4;  // copy of a CEN entry
 
-
-        byte[] bytes;      // updated content bytes
-        Path   file;       // use tmp file to store bytes;
-        int    type = CEN; // default is the entry read from cen
+        byte[] bytes;                 // updated content bytes
+        Path   file;                  // use tmp file to store bytes;
+        int    type = CEN;            // default is the entry read from cen
 
         // entry attributes
         int    version;
@@ -1841,10 +1854,12 @@
         byte[] extra;
 
         // cen
-        int    versionMade;
-        int    disk;
-        int    attrs;
-        long   attrsEx;
+
+        // these fields are not used by anyone and writeCEN uses "0"
+        // int    versionMade;
+        // int    disk;
+        // int    attrs;
+        // long   attrsEx;
         long   locoff;
         byte[] comment;
 
@@ -1875,10 +1890,12 @@
             this.csize     = e.csize;
             this.method    = e.method;
             this.extra     = e.extra;
+            /*
             this.versionMade = e.versionMade;
             this.disk      = e.disk;
             this.attrs     = e.attrs;
             this.attrsEx   = e.attrsEx;
+            */
             this.locoff    = e.locoff;
             this.comment   = e.comment;
             this.type      = type;
@@ -1899,19 +1916,19 @@
         }
 
         ///////////////////// CEN //////////////////////
-        static Entry readCEN(ZipFileSystem zipfs, int pos)
+        static Entry readCEN(ZipFileSystem zipfs, IndexNode inode)
             throws IOException
         {
-            return new Entry().cen(zipfs, pos);
+            return new Entry().cen(zipfs, inode);
         }
 
-        private Entry cen(ZipFileSystem zipfs, int pos)
+        private Entry cen(ZipFileSystem zipfs, IndexNode inode)
             throws IOException
         {
             byte[] cen = zipfs.cen;
+            int pos = inode.pos;
             if (!cenSigAt(cen, pos))
                 zerror("invalid CEN header (bad signature)");
-            versionMade = CENVEM(cen, pos);
             version     = CENVER(cen, pos);
             flag        = CENFLG(cen, pos);
             method      = CENHOW(cen, pos);
@@ -1922,13 +1939,16 @@
             int nlen    = CENNAM(cen, pos);
             int elen    = CENEXT(cen, pos);
             int clen    = CENCOM(cen, pos);
+            /*
+            versionMade = CENVEM(cen, pos);
             disk        = CENDSK(cen, pos);
             attrs       = CENATT(cen, pos);
             attrsEx     = CENATX(cen, pos);
+            */
             locoff      = CENOFF(cen, pos);
-
             pos += CENHDR;
-            name(Arrays.copyOfRange(cen, pos, pos + nlen));
+            this.name = inode.name;
+            this.hashcode = inode.hashcode;
 
             pos += nlen;
             if (elen > 0) {
@@ -1955,7 +1975,8 @@
             boolean foundExtraTime = false;  // if time stamp NTFS, EXTT present
 
             // confirm size/length
-            int nlen = (name != null) ? name.length : 0;
+
+            int nlen = (name != null) ? name.length - 1 : 0;  // name has [0] as "slash"
             int elen = (extra != null) ? extra.length : 0;
             int eoff = 0;
             int clen = (comment != null) ? comment.length : 0;
@@ -2004,7 +2025,7 @@
             writeInt(os, crc);               // crc-32
             writeInt(os, csize0);            // compressed size
             writeInt(os, size0);             // uncompressed size
-            writeShort(os, name.length);
+            writeShort(os, nlen);
             writeShort(os, elen + elen64 + elenNTFS + elenEXTT);
 
             if (comment != null) {
@@ -2016,7 +2037,7 @@
             writeShort(os, 0);              // internal file attributes (unused)
             writeInt(os, 0);                // external file attributes (unused)
             writeInt(os, locoff0);          // relative offset of local header
-            writeBytes(os, name);
+            writeBytes(os, name, 1, nlen);
             if (elen64 != 0) {
                 writeShort(os, EXTID_ZIP64);// Zip64 extra
                 writeShort(os, elen64 - 4); // size of "this" extra block
@@ -2086,8 +2107,9 @@
             int nlen = LOCNAM(buf);
             int elen = LOCEXT(buf);
 
-            name = new byte[nlen];
-            if (zipfs.readFullyAt(name, 0, nlen, pos + LOCHDR) != nlen) {
+            name = new byte[nlen + 1];
+            name[0] = '/';
+            if (zipfs.readFullyAt(name, 1, nlen, pos + LOCHDR) != nlen) {
                 throw new ZipException("loc: name reading failed");
             }
             if (elen > 0) {
@@ -2130,12 +2152,10 @@
             return this;
         }
 
-        int writeLOC(OutputStream os)
-            throws IOException
-        {
+        int writeLOC(OutputStream os) throws IOException {
             writeInt(os, LOCSIG);               // LOC header signature
             int version = version();
-            int nlen = (name != null) ? name.length : 0;
+            int nlen = (name != null) ? name.length - 1 : 0; // [0] is slash
             int elen = (extra != null) ? extra.length : 0;
             boolean foundExtraTime = false;     // if extra timestamp present
             int eoff = 0;
@@ -2192,9 +2212,9 @@
                         elenEXTT += 4;
                 }
             }
-            writeShort(os, name.length);
+            writeShort(os, nlen);
             writeShort(os, elen + elen64 + elenNTFS + elenEXTT);
-            writeBytes(os, name);
+            writeBytes(os, name, 1, nlen);
             if (elen64 != 0) {
                 writeShort(os, EXTID_ZIP64);
                 writeShort(os, 16);
@@ -2229,13 +2249,11 @@
             if (extra != null) {
                 writeBytes(os, extra);
             }
-            return LOCHDR + name.length + elen + elen64 + elenNTFS + elenEXTT;
+            return LOCHDR + nlen + elen + elen64 + elenNTFS + elenEXTT;
         }
 
         // Data Descriptior
-        int writeEXT(OutputStream os)
-            throws IOException
-        {
+        int writeEXT(OutputStream os) throws IOException {
             writeInt(os, EXTSIG);           // EXT header signature
             writeInt(os, crc);              // crc-32
             if (csize >= ZIP64_MINVAL || size >= ZIP64_MINVAL) {
@@ -2301,7 +2319,15 @@
                     break;
                 case EXTID_EXTT:
                     // spec says the Extened timestamp in cen only has mtime
-                    // need to read the loc to get the extra a/ctime
+                    // need to read the loc to get the extra a/ctime, if flag
+                    // "zipinfo-time" is not specified to false;
+                    // there is performance cost (move up to loc and read) to
+                    // access the loc table foreach entry;
+                    if (zipfs.noExtt) {
+                        if (sz == 5)
+                            mtime = unixToJavaTime(LG(extra, pos + 1));
+                         break;
+                    }
                     byte[] buf = new byte[LOCHDR];
                     if (zipfs.readFullyAt(buf, 0, buf.length , locoff)
                         != buf.length)
@@ -2309,7 +2335,6 @@
                     if (!locSigAt(buf, 0))
                         throw new ZipException("loc: wrong sig ->"
                                            + Long.toString(getSig(buf, 0), 16));
-
                     int locElen = LOCEXT(buf);
                     if (locElen < 9)    // EXTT is at lease 9 bytes
                         break;
@@ -2354,6 +2379,96 @@
             else
                 extra = null;
         }
+
+        ///////// basic file attributes ///////////
+        @Override
+        public FileTime creationTime() {
+            return FileTime.fromMillis(ctime == -1 ? mtime : ctime);
+        }
+
+        @Override
+        public boolean isDirectory() {
+            return isDir();
+        }
+
+        @Override
+        public boolean isOther() {
+            return false;
+        }
+
+        @Override
+        public boolean isRegularFile() {
+            return !isDir();
+        }
+
+        @Override
+        public FileTime lastAccessTime() {
+            return FileTime.fromMillis(atime == -1 ? mtime : atime);
+        }
+
+        @Override
+        public FileTime lastModifiedTime() {
+            return FileTime.fromMillis(mtime);
+        }
+
+        @Override
+        public long size() {
+            return size;
+        }
+
+        @Override
+        public boolean isSymbolicLink() {
+            return false;
+        }
+
+        @Override
+        public Object fileKey() {
+            return null;
+        }
+
+        ///////// zip entry attributes ///////////
+        public long compressedSize() {
+            return csize;
+        }
+
+        public long crc() {
+            return crc;
+        }
+
+        public int method() {
+            return method;
+        }
+
+        public byte[] extra() {
+            if (extra != null)
+                return Arrays.copyOf(extra, extra.length);
+            return null;
+        }
+
+        public byte[] comment() {
+            if (comment != null)
+                return Arrays.copyOf(comment, comment.length);
+            return null;
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder(1024);
+            Formatter fm = new Formatter(sb);
+            fm.format("    creationTime    : %tc%n", creationTime().toMillis());
+            fm.format("    lastAccessTime  : %tc%n", lastAccessTime().toMillis());
+            fm.format("    lastModifiedTime: %tc%n", lastModifiedTime().toMillis());
+            fm.format("    isRegularFile   : %b%n", isRegularFile());
+            fm.format("    isDirectory     : %b%n", isDirectory());
+            fm.format("    isSymbolicLink  : %b%n", isSymbolicLink());
+            fm.format("    isOther         : %b%n", isOther());
+            fm.format("    fileKey         : %s%n", fileKey());
+            fm.format("    size            : %d%n", size());
+            fm.format("    compressedSize  : %d%n", compressedSize());
+            fm.format("    crc             : %x%n", crc());
+            fm.format("    method          : %d%n", method());
+            fm.close();
+            return sb.toString();
+        }
     }
 
     private static class ExChannelCloser  {
@@ -2379,25 +2494,8 @@
     // implemented below.
     private IndexNode root;
 
-    private void addToTree(IndexNode inode, HashSet<IndexNode> dirs) {
-        if (dirs.contains(inode)) {
-            return;
-        }
-        IndexNode parent;
-        byte[] name = inode.name;
-        byte[] pname = getParent(name);
-        if (inodes.containsKey(LOOKUPKEY.as(pname))) {
-            parent = inodes.get(LOOKUPKEY);
-        } else {    // pseudo directory entry
-            parent = new IndexNode(pname, -1);
-            inodes.put(parent, parent);
-        }
-        addToTree(parent, dirs);
-        inode.sibling = parent.child;
-        parent.child = inode;
-        if (name[name.length -1] == '/')
-            dirs.add(inode);
-    }
+    // default time stamp for pseudo entries
+    private long zfsDefaultTimeStamp = System.currentTimeMillis();
 
     private void removeFromTree(IndexNode inode) {
         IndexNode parent = inodes.get(LOOKUPKEY.as(getParent(inode.name)));
@@ -2417,15 +2515,69 @@
         }
     }
 
+    // purely for parent lookup, so we don't have to copy the parent
+    // name every time
+    static class ParentLookup extends IndexNode {
+        int len;
+        ParentLookup() {}
+
+        final ParentLookup as(byte[] name, int len) { // as a lookup "key"
+            name(name, len);
+            return this;
+        }
+
+        void name(byte[] name, int len) {
+            this.name = name;
+            this.len = len;
+            // calculate the hashcode the same way as Arrays.hashCode() does
+            int result = 1;
+            for (int i = 0; i < len; i++)
+                result = 31 * result + name[i];
+            this.hashcode = result;
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (!(other instanceof IndexNode)) {
+                return false;
+            }
+            byte[] oname = ((IndexNode)other).name;
+            return Arrays.equals(name, 0, len,
+                                 oname, 0, oname.length);
+        }
+
+    }
+
     private void buildNodeTree() throws IOException {
         beginWrite();
         try {
-            HashSet<IndexNode> dirs = new HashSet<>();
-            IndexNode root = new IndexNode(ROOTPATH, -1);
+            IndexNode root = new IndexNode(ROOTPATH);
+            IndexNode[] nodes = inodes.keySet().toArray(new IndexNode[0]);
             inodes.put(root, root);
-            dirs.add(root);
-            for (IndexNode node : inodes.keySet().toArray(new IndexNode[0])) {
-                addToTree(node, dirs);
+            ParentLookup lookup = new ParentLookup();
+            for (IndexNode node : nodes) {
+                IndexNode parent;
+                while (true) {
+                    int off = getParentOff(node.name);
+                    if (off <= 1) {    // parent is root
+                        node.sibling = root.child;
+                        root.child = node;
+                        break;
+                    }
+                    lookup = lookup.as(node.name, off + 1);
+                    if (inodes.containsKey(lookup)) {
+                        parent = inodes.get(lookup);
+                        node.sibling = parent.child;
+                        parent.child = node;
+                        break;
+                    }
+                    // add new pseudo directory entry
+                    parent = new IndexNode(Arrays.copyOf(node.name, off + 1));
+                    inodes.put(parent, parent);
+                    node.sibling = parent.child;
+                    parent.child = node;
+                    node = parent;
+                }
             }
         } finally {
             endWrite();
--- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipPath.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipPath.java	Wed Jul 05 21:40:37 2017 +0200
@@ -41,7 +41,7 @@
  * @author  Xueming Shen, Rajendra Gutupalli,Jaya Hangal
  */
 
-class ZipPath implements Path {
+final class ZipPath implements Path {
 
     private final ZipFileSystem zfs;
     private final byte[] path;
@@ -64,7 +64,7 @@
     @Override
     public ZipPath getRoot() {
         if (this.isAbsolute())
-            return new ZipPath(zfs, new byte[]{path[0]});
+            return zfs.getRootDir();
         else
             return null;
     }
@@ -145,7 +145,15 @@
 
     @Override
     public ZipPath toRealPath(LinkOption... options) throws IOException {
-        ZipPath realPath = new ZipPath(zfs, getResolvedPath()).toAbsolutePath();
+        ZipPath realPath;
+        byte[] resolved = getResolvedPath();
+        // resolved is always absolute and normalized
+        if (resolved == path) {
+            realPath = this;
+        } else {
+            realPath = new ZipPath(zfs, resolved, true);
+            realPath.resolved = resolved;
+        }
         realPath.checkAccess();
         return realPath;
     }
@@ -159,20 +167,11 @@
         if (isAbsolute()) {
             return this;
         } else {
-            //add / bofore the existing path
-            byte[] defaultdir = zfs.getDefaultDir().path;
-            int defaultlen = defaultdir.length;
-            boolean endsWith = (defaultdir[defaultlen - 1] == '/');
-            byte[] t = null;
-            if (endsWith)
-                t = new byte[defaultlen + path.length];
-            else
-                t = new byte[defaultlen + 1 + path.length];
-            System.arraycopy(defaultdir, 0, t, 0, defaultlen);
-            if (!endsWith)
-                t[defaultlen++] = '/';
-            System.arraycopy(path, 0, t, defaultlen, path.length);
-            return new ZipPath(zfs, t, true);  // normalized
+            // add '/' before the existing path
+            byte[] tmp = new byte[path.length + 1];
+            System.arraycopy(path, 0, tmp, 1, path.length);
+            tmp[0] = '/';
+            return new ZipPath(zfs, tmp, true);  // normalized
         }
     }
 
@@ -217,11 +216,15 @@
     public Path relativize(Path other) {
         final ZipPath o = checkPath(other);
         if (o.equals(this))
-            return new ZipPath(getFileSystem(), new byte[0], true);
-        if (/* this.getFileSystem() != o.getFileSystem() || */
-            this.isAbsolute() != o.isAbsolute()) {
+            return new ZipPath(zfs, new byte[0], true);
+        if (this.path.length == 0)
+            return o;
+        if (this.zfs != o.zfs || this.isAbsolute() != o.isAbsolute())
             throw new IllegalArgumentException();
-        }
+        if (this.path.length == 1 && this.path[0] == '/')
+            return new ZipPath(zfs,
+                               Arrays.copyOfRange(o.path, 1, o.path.length),
+                               true);
         int mc = this.getNameCount();
         int oc = o.getNameCount();
         int n = Math.min(mc, oc);
@@ -249,7 +252,7 @@
             System.arraycopy(o.path, o.offsets[i],
                              result, pos,
                              o.path.length - o.offsets[i]);
-        return new ZipPath(getFileSystem(), result);
+        return new ZipPath(zfs, result);
     }
 
     @Override
@@ -265,26 +268,29 @@
     @Override
     public ZipPath resolve(Path other) {
         final ZipPath o = checkPath(other);
-        if (o.isAbsolute())
+        int tlen = this.path.length;
+        if (tlen == 0 || o.isAbsolute())
             return o;
+        int olen = o.path.length;
+        if (olen == 0)
+            return this;
         byte[] resolved = null;
-        if (this.path[path.length - 1] == '/') {
-            resolved = new byte[path.length + o.path.length];
-            System.arraycopy(path, 0, resolved, 0, path.length);
-            System.arraycopy(o.path, 0, resolved, path.length, o.path.length);
+        if (this.path[tlen - 1] == '/') {
+            resolved = new byte[tlen + olen];
+            System.arraycopy(path, 0, resolved, 0, tlen);
+            System.arraycopy(o.path, 0, resolved, tlen, olen);
         } else {
-            resolved = new byte[path.length + 1 + o.path.length];
-            System.arraycopy(path, 0, resolved, 0, path.length);
-            resolved[path.length] = '/';
-            System.arraycopy(o.path, 0, resolved, path.length + 1, o.path.length);
+            resolved = new byte[tlen + 1 + olen];
+            System.arraycopy(path, 0, resolved, 0, tlen);
+            resolved[tlen] = '/';
+            System.arraycopy(o.path, 0, resolved, tlen + 1, olen);
         }
         return new ZipPath(zfs, resolved);
     }
 
     @Override
     public Path resolveSibling(Path other) {
-        if (other == null)
-            throw new NullPointerException();
+        Objects.requireNonNull(other, "other");
         Path parent = getParent();
         return (parent == null) ? other : parent.resolve(other);
     }
@@ -330,22 +336,22 @@
 
     @Override
     public ZipPath resolve(String other) {
-        return resolve(getFileSystem().getPath(other));
+        return resolve(zfs.getPath(other));
     }
 
     @Override
     public final Path resolveSibling(String other) {
-        return resolveSibling(getFileSystem().getPath(other));
+        return resolveSibling(zfs.getPath(other));
     }
 
     @Override
     public final boolean startsWith(String other) {
-        return startsWith(getFileSystem().getPath(other));
+        return startsWith(zfs.getPath(other));
     }
 
     @Override
     public final boolean endsWith(String other) {
-        return endsWith(getFileSystem().getPath(other));
+        return endsWith(zfs.getPath(other));
     }
 
     @Override
@@ -357,8 +363,7 @@
     }
 
     private ZipPath checkPath(Path path) {
-        if (path == null)
-            throw new NullPointerException();
+        Objects.requireNonNull(path, "path");
         if (!(path instanceof ZipPath))
             throw new ProviderMismatchException();
         return (ZipPath) path;
@@ -410,8 +415,6 @@
                 r = getResolved();
             else
                 r = toAbsolutePath().getResolvedPath();
-            if (r[0] == '/')
-                r = Arrays.copyOfRange(r, 1, r.length);
             resolved = r;
         }
         return resolved;
@@ -425,13 +428,10 @@
         byte prevC = 0;
         for (int i = 0; i < path.length; i++) {
             byte c = path[i];
-            if (c == '\\')
+            if (c == '\\' || c == '\u0000')
                 return normalize(path, i);
             if (c == (byte)'/' && prevC == '/')
                 return normalize(path, i - 1);
-            if (c == '\u0000')
-                throw new InvalidPathException(zfs.getString(path),
-                                               "Path: nul character not allowed");
             prevC = c;
         }
         return path;
@@ -465,12 +465,10 @@
 
     // Remove DotSlash(./) and resolve DotDot (..) components
     private byte[] getResolved() {
-        if (path.length == 0)
-            return path;
         for (int i = 0; i < path.length; i++) {
-            byte c = path[i];
-            if (c == (byte)'.')
+            if (path[i] == (byte)'.') {
                 return resolve0();
+            }
         }
         return path;
     }
@@ -612,7 +610,6 @@
 
     /////////////////////////////////////////////////////////////////////
 
-
     void createDirectory(FileAttribute<?>... attrs)
         throws IOException
     {
@@ -749,20 +746,13 @@
                     throw new UnsupportedOperationException();
             }
         }
-        ZipFileAttributes attrs = zfs.getFileAttributes(getResolvedPath());
-        if (attrs == null && (path.length != 1 || path[0] != '/'))
-            throw new NoSuchFileException(toString());
-        if (w) {
-            if (zfs.isReadOnly())
-                throw new AccessDeniedException(toString());
+        zfs.checkAccess(getResolvedPath());
+        if ((w && zfs.isReadOnly()) || x) {
+            throw new AccessDeniedException(toString());
         }
-        if (x)
-            throw new AccessDeniedException(toString());
     }
 
     boolean exists() {
-        if (path.length == 1 && path[0] == '/')
-            return true;
         try {
             return zfs.exists(getResolvedPath());
         } catch (IOException x) {}
--- a/jdk/test/ProblemList.txt	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/ProblemList.txt	Wed Jul 05 21:40:37 2017 +0200
@@ -181,6 +181,8 @@
 
 java/nio/charset/coders/BashStreams.java                        8149712 generic-all
 
+java/nio/file/WatchService/DeleteInterference.java              8156511 linux-all
+
 ############################################################################
 
 # jdk_rmi
--- a/jdk/test/TEST.ROOT	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/TEST.ROOT	Wed Jul 05 21:40:37 2017 +0200
@@ -26,9 +26,12 @@
 # Allow querying of sun.arch.data.model in @requires clauses
 requires.properties=sun.arch.data.model 
 
-# Tests using jtreg 4.2 b01 features
-requiredVersion=4.2 b01
+# Tests using jtreg 4.2 b02 features
+requiredVersion=4.2 b02
 
 # Path to libraries in the topmost test directory. This is needed so @library
 # does not need ../../ notation to reach them
 external.lib.roots = ../../
+
+# Use new form of -Xpatch
+useNewXpatch=true
--- a/jdk/test/TEST.groups	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/TEST.groups	Wed Jul 05 21:40:37 2017 +0200
@@ -29,7 +29,6 @@
     :jdk_lang \
     -java/lang/ProcessHandle/TreeTest.java \
     :jdk_util \
-    -java/util/WeakHashMap/GCDuringIteration.java \
     -java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \
     -java/util/concurrent/forkjoin/FJExceptionTableLeak.java \
     sun/nio/cs/ISO8859x.java \
@@ -39,7 +38,6 @@
 
 tier2 = \
     java/lang/ProcessHandle/TreeTest.java \
-    java/util/WeakHashMap/GCDuringIteration.java \
     java/util/concurrent/ThreadPoolExecutor/ConfigChanges.java \
     java/util/concurrent/forkjoin/FJExceptionTableLeak.java \
     :jdk_io \
--- a/jdk/test/com/sun/corba/5036554/TestCorbaBug.sh	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/com/sun/corba/5036554/TestCorbaBug.sh	Wed Jul 05 21:40:37 2017 +0200
@@ -81,9 +81,9 @@
 
 chmod -fR 777 bug
 
-${COMPILEJAVA}${FS}bin${FS}javac -d . bug${FS}*.java
+${COMPILEJAVA}${FS}bin${FS}javac -addmods java.corba -d . bug${FS}*.java
 
-${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -cp . bug/JavaBug > test.out 2>&1 
+${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -addmods java.corba -cp . bug/JavaBug > test.out 2>&1 
 
 grep "NullPointerException" test.out
 
--- a/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,7 +27,8 @@
  * @summary Four helper classes missing in Sun JDK
  * @library /lib/testlibrary
  * @build jdk.testlibrary.*
- * @run main CorbaExceptionsCompileTest
+ * @compile -addmods java.corba CorbaExceptionsCompileTest.java
+ * @run main/othervm -addmods java.corba CorbaExceptionsCompileTest
  */
 
 import java.io.*;
--- a/jdk/test/com/sun/corba/se/impl/io/HookPutFieldsTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/com/sun/corba/se/impl/io/HookPutFieldsTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,6 +25,8 @@
  * @test
  * @bug 7095856
  * @summary OutputStreamHook doesn't handle null values
+ * @compile -addmods java.corba HookPutFieldsTest.java
+ * @run main/othervm -addmods java.corba HookPutFieldsTest
  */
 
 import java.net.InetAddress;
--- a/jdk/test/com/sun/corba/se/impl/orb/SetDefaultORBTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/com/sun/corba/se/impl/orb/SetDefaultORBTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,8 @@
  * @test
  * @bug 8028215
  * @summary SetDefaultORBTest setting ORB impl via properties test
- * @run main/othervm SetDefaultORBTest
+ * @compile -addmods java.corba SetDefaultORBTest.java
+ * @run main/othervm -addmods java.corba SetDefaultORBTest
  *
  */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Mac/HmacSHA512.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2016, 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 jdk.testlibrary.Asserts;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Arrays;
+
+/**
+ * @test
+ * @bug 8051408
+ * @library /lib/testlibrary
+ * @summary testing HmacSHA512/224 and HmacSHA512/256.
+ */
+public class HmacSHA512 {
+    public static void main(String[] args) throws Exception {
+
+        Mac mac;
+
+        // Test vectors obtained from
+        // https://groups.google.com/d/msg/sci.crypt/OolWgsgQD-8/IUR2KhCcfEkJ
+        mac = Mac.getInstance("HmacSHA512/224");
+        mac.init(new SecretKeySpec(xeh("4a656665"), "HmacSHA512/224"));
+        mac.update("what do ya want for nothing?".getBytes());
+        Asserts.assertTrue(Arrays.equals(mac.doFinal(),
+                xeh("4a530b31a79ebcce36916546317c45f247d83241dfb818fd37254bde")));
+
+        mac = Mac.getInstance("HmacSHA512/256");
+        mac.init(new SecretKeySpec(xeh("4a656665"), "HmacSHA512/256"));
+        mac.update("what do ya want for nothing?".getBytes());
+        Asserts.assertTrue(Arrays.equals(mac.doFinal(),
+                xeh("6df7b24630d5ccb2ee335407081a87188c221489768fa2020513b2d593359456")));
+
+        mac = Mac.getInstance("HmacSHA512/224");
+        mac.init(new SecretKeySpec(xeh("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
+                "HmacSHA512/224"));
+        mac.update("Hi There".getBytes());
+        Asserts.assertTrue(Arrays.equals(mac.doFinal(),
+                xeh("b244ba01307c0e7a8ccaad13b1067a4cf6b961fe0c6a20bda3d92039")));
+
+        mac = Mac.getInstance("HmacSHA512/256");
+        mac.init(new SecretKeySpec(xeh("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"),
+                "HmacSHA512/256"));
+        mac.update("Hi There".getBytes());
+        Asserts.assertTrue(Arrays.equals(mac.doFinal(),
+                xeh("9f9126c3d9c3c330d760425ca8a217e31feae31bfe70196ff81642b868402eab")));
+    }
+
+    static byte[] xeh(String in) {
+        in = in.replaceAll(" ", "");
+        int len = in.length() / 2;
+        byte[] out = new byte[len];
+        for (int i = 0; i < len; i++) {
+            out[i] = (byte)Integer.parseInt(in.substring(i * 2, i * 2 + 2), 16);
+        }
+        return out;
+    }
+}
--- a/jdk/test/com/sun/net/httpserver/bugs/B6373555.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/com/sun/net/httpserver/bugs/B6373555.java	Wed Jul 05 21:40:37 2017 +0200
@@ -29,7 +29,6 @@
 
 import java.net.*;
 import java.io.*;
-import javax.xml.soap.*;
 import java.util.*;
 import com.sun.net.httpserver.*;
 import java.util.concurrent.*;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Graphics2D/DrawString/AntialiasedTextArtifact.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2016, 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 8015070
+ * @summary Tests for artifacts around the edges of anti-aliased text
+ *          drawn over translucent background color.
+ */
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
+public class AntialiasedTextArtifact {
+    /* Image dimensions */
+    private static final int TEST_IMAGE_WIDTH  = 2800;
+    private static final int TEST_IMAGE_HEIGHT = 100;
+    private static final String TEST_STRING    =
+        "The quick brown fox jumps over the lazy dog. 0123456789.";
+
+    /*
+     * The artifacts appear when text is drawn ontop of translucent
+     * background. In other words, a background with alpha channel.
+     * Hence we test the algorithm for image types that contain either
+     * straight alpha channel or pre-multiplied alpha channel. In
+     * addition we test the images with other common pixel formats.
+     */
+    private static final int[] TYPES = {BufferedImage.TYPE_INT_ARGB,
+                                        BufferedImage.TYPE_INT_ARGB_PRE,
+                                        BufferedImage.TYPE_4BYTE_ABGR,
+                                        BufferedImage.TYPE_4BYTE_ABGR_PRE,
+                                        BufferedImage.TYPE_INT_RGB,
+                                        BufferedImage.TYPE_INT_BGR,
+                                        BufferedImage.TYPE_3BYTE_BGR};
+
+    public static void main(String[] args) throws IOException {
+        /* Iterate over different image types */
+        for (int type : TYPES) {
+            BufferedImage testImg = getBufferedImage(type);
+
+            /* Draw anti-aliased string and check for artifacts */
+            drawAntialiasedString(testImg);
+            checkArtifact(testImg);
+        }
+    }
+
+    private static BufferedImage getBufferedImage(int imageType) {
+        /* Create a Graphics2D object from the given image type */
+        BufferedImage image = new BufferedImage(TEST_IMAGE_WIDTH,
+                                                TEST_IMAGE_HEIGHT,
+                                                imageType);
+        return image;
+    }
+
+    private static void drawAntialiasedString(BufferedImage image) {
+        /* Create Graphics2D object */
+        Graphics2D graphics = (Graphics2D) image.getGraphics();
+
+        /* Fill the image with translucent color */
+        graphics.setColor(new Color(127, 127, 127, 127));
+        graphics.fillRect(0, 0, TEST_IMAGE_WIDTH, TEST_IMAGE_HEIGHT);
+
+        /* Drawstring with Antialiasing hint */
+        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
+                                  RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        Font font = new Font("Verdana" , Font.PLAIN, 60);
+        graphics.setFont(font);
+        graphics.setColor(new Color(255, 0, 0));
+        graphics.drawString(TEST_STRING, 10, 75);
+        graphics.dispose();
+    }
+
+    private static void checkArtifact(BufferedImage image) throws IOException {
+        int componentMask   = 0xff;
+        int colorThreshold  = 200;
+        int rowIndex = 0;
+        int colIndex = 0;
+
+        /* Loop through every pixel to check for possible artifact */
+        for (rowIndex = 0; rowIndex < image.getHeight(); rowIndex++) {
+            for (colIndex = 0; colIndex < image.getWidth(); colIndex++) {
+                /*
+                 * API: getRGB(x,y) returns color in INT_ARGB color space.
+                 * Extract individual color components with a simple mask.
+                 */
+                int colorValue = image.getRGB(colIndex, rowIndex);
+                int colorComponent1 = colorValue & componentMask;
+                int colorComponent2 = (colorValue>>8) & componentMask;
+                int colorComponent3 = (colorValue>>16) & componentMask;
+
+                /*
+                 * Artifacts are predominantly a subjective decision based on
+                 * the quality of the rendered image content. However, in the
+                 * current use-case, the artifacts around the edges of the anti
+                 * aliased text appear like spots of white pixels without any
+                 * relation to the color of foreground text or the background
+                 * translucent shape.
+                 *
+                 * To identify the artifact pixels, each color component from
+                 * the testImage is compared with a constant threshold. The
+                 * component threshold has been set based on observation from
+                 * different experiments on mulitple Java versions.
+                 */
+                if (colorComponent1 >= colorThreshold
+                        && colorComponent2 >= colorThreshold
+                        && colorComponent3 >= colorThreshold) {
+                    /* Artifact has been noticed. Report error. */
+                    throw new RuntimeException("Test Failed.");
+                }
+            }
+        }
+    }
+}
--- a/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, 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
@@ -23,11 +23,13 @@
 
 import java.io.FilePermission;
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Field;
 import java.lang.reflect.Module;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.InaccessibleObjectException;
+import java.lang.reflect.Layer;
 import java.lang.reflect.ReflectPermission;
 import java.net.URI;
 import java.nio.file.FileSystem;
@@ -68,7 +70,6 @@
  */
 public class FieldSetAccessibleTest {
 
-    static final List<String> skipped = new ArrayList<>();
     static final List<String> cantread = new ArrayList<>();
     static final List<String> failed = new ArrayList<>();
     static final AtomicLong classCount = new AtomicLong();
@@ -210,7 +211,6 @@
         long millis = (elapsed % 1000_000_000) / 1000_000;
         long nanos  = elapsed % 1000_000;
         System.out.println("Unreadable path elements: " + cantread);
-        System.out.println("Skipped path elements: " + skipped);
         System.out.println("Failed path elements: " + failed);
         printSummary(secs, millis, nanos);
 
@@ -247,37 +247,26 @@
     static class ClassNameJrtStreamBuilder implements Iterable<String>{
 
         final FileSystem jrt;
-        final List<Path> roots = new ArrayList<>();
+        final Path root;
         ClassNameJrtStreamBuilder() {
              jrt = FileSystems.getFileSystem(URI.create("jrt:/"));
-             for (Path root : jrt.getRootDirectories()) {
-                 roots.add(root);
-             }
-        }
-
-        Stream<String> build() {
-            return roots.stream().flatMap(this::toStream)
-                    .filter(x -> x.getNameCount() > 2)
-                    .map( x-> x.subpath(2, x.getNameCount()))
-                    .map( x -> x.toString())
-                    .filter(s -> s.endsWith(".class") && !s.endsWith("module-info.class"));
+             root = jrt.getPath("/modules");
         }
 
         @Override
         public Iterator<String> iterator() {
-            return build().iterator();
-        }
-
-        private Stream<Path> toStream(Path root) {
             try {
-                return Files.walk(root);
+                return Files.walk(root)
+                        .filter(p -> p.getNameCount() > 2)
+                        .filter(p -> Layer.boot().findModule(p.getName(1).toString()).isPresent())
+                        .map(p -> p.subpath(2, p.getNameCount()))
+                        .map(p -> p.toString())
+                        .filter(s -> s.endsWith(".class") && !s.endsWith("module-info.class"))
+                    .iterator();
             } catch(IOException x) {
-                x.printStackTrace(System.err);
-                skipped.add(root.toString());
+                throw new UncheckedIOException("Unable to walk \"/modules\"", x);
             }
-            return Collections.<Path>emptyList().stream();
         }
-
     }
 
     // Test with or without a security manager
--- a/jdk/test/java/lang/StackWalker/EmbeddedStackWalkTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/lang/StackWalker/EmbeddedStackWalkTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -140,8 +140,8 @@
                 s.limit(BIG_LOOP)
                  .filter(f -> c.getName().equals(f.getClassName()) && mn.equals(f.getMethodName()))
                  .forEach(f -> {
-                    assertEquals(f.getFileName().get(), fileName);
-                    int line = f.getLineNumber().getAsInt();
+                    assertEquals(f.getFileName(), fileName);
+                    int line = f.getLineNumber();
                     assertTrue(line >= BEGIN_LINE && line <= END_LINE);
 
                     StackTraceElement st = f.toStackTraceElement();
--- a/jdk/test/java/lang/StackWalker/StackRecorderUtil.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/lang/StackWalker/StackRecorderUtil.java	Wed Jul 05 21:40:37 2017 +0200
@@ -100,8 +100,8 @@
             }
             if (!Objects.equals(ste.getClassName(), sf.getClassName())
                 || !Objects.equals(ste.getMethodName(), sf.getMethodName())
-                || !Objects.equals(ste.getFileName(), sf.getFileName().orElse(null))
-                || !Objects.equals(ste.getLineNumber(), sf.getLineNumber().orElse(-1))
+                || !Objects.equals(ste.getFileName(), sf.getFileName())
+                || !Objects.equals(ste.getLineNumber(), sf.getLineNumber())
                 || !Objects.equals(ste.isNativeMethod(), sf.isNativeMethod())) {
                 throw new RuntimeException("StackFrame and StackTraceElement differ: " +
                         "sf=" + sf + ", ste=" + ste);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/StackWalker/TestBCI.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 2016, 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 8140450
+ * @summary Basic test for the StackWalker::getByteCodeIndex method
+ * @modules jdk.jdeps/com.sun.tools.classfile
+ * @run main TestBCI
+ */
+
+import com.sun.tools.classfile.Attribute;
+import com.sun.tools.classfile.ClassFile;
+import com.sun.tools.classfile.Code_attribute;
+import com.sun.tools.classfile.ConstantPoolException;
+import com.sun.tools.classfile.Descriptor;
+import com.sun.tools.classfile.LineNumberTable_attribute;
+import com.sun.tools.classfile.Method;
+
+import java.lang.StackWalker.StackFrame;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE;
+
+public class TestBCI {
+    public static void main(String... args) throws Exception {
+        TestBCI test = new TestBCI(Walker.class);
+        System.out.println("Line number table:");
+        test.methods.values().stream()
+            .sorted(Comparator.comparing(MethodInfo::name).reversed())
+            .forEach(System.out::println);
+
+        // walk the stack
+        test.walk();
+    }
+
+    private final Map<String, MethodInfo> methods;
+    private final Class<?> clazz;
+    TestBCI(Class<?> c) throws ConstantPoolException, IOException {
+        Map<String, MethodInfo> methods;
+        String filename = c.getName().replace('.', '/') + ".class";
+        try (InputStream in = c.getResourceAsStream(filename)) {
+            ClassFile cf = ClassFile.read(in);
+            methods = Arrays.stream(cf.methods)
+                .map(m -> new MethodInfo(cf, m))
+                .collect(Collectors.toMap(MethodInfo::name, Function.identity()));
+        }
+        this.clazz = c;
+        this.methods = methods;
+    }
+
+    void walk() {
+        Walker walker = new Walker();
+        walker.m1();
+    }
+
+    void verify(StackFrame frame) {
+        if (frame.getDeclaringClass() != clazz)
+            return;
+
+        int bci = frame.getByteCodeIndex();
+        int lineNumber = frame.getLineNumber();
+        System.out.format("%s.%s bci %d (%s:%d)%n",
+                          frame.getClassName(), frame.getMethodName(), bci,
+                          frame.getFileName(), lineNumber);
+
+        MethodInfo method = methods.get(frame.getMethodName());
+        SortedSet<Integer> values = method.findLineNumbers(bci).get();
+        if (!values.contains(lineNumber)) {
+            throw new RuntimeException("line number for bci: " + bci + " "
+                + lineNumber + " not matched line number table: " + values);
+        }
+    }
+
+    /*
+     * BCIs in the execution stack when StackWalker::forEach is invoked
+     * will cover BCI range in the line number table.
+     */
+    class Walker {
+        final StackWalker walker = StackWalker.getInstance(RETAIN_CLASS_REFERENCE);
+        void m1() {
+            int i = (int)Math.random()+2;
+            m2(i*2);
+        }
+
+        void m2(int i) {
+            i++;
+            m3(i);
+        }
+
+        void m3(int i) {
+            i++; m4(i++);
+        }
+
+        int m4(int i) {
+            walker.forEach(TestBCI.this::verify);
+            return i;
+        }
+    }
+
+    static class MethodInfo {
+        final Method method;
+        final String name;
+        final String paramTypes;
+        final String returnType;
+        final Map<Integer, SortedSet<Integer>> bciToLineNumbers = new HashMap<>();
+        MethodInfo(ClassFile cf, Method m) {
+            this.method = m;
+
+            String name;
+            String paramTypes;
+            String returnType;
+            LineNumberTable_attribute.Entry[] lineNumberTable;
+            try {
+                // method name
+                name = m.getName(cf.constant_pool);
+                // signature
+                paramTypes = m.descriptor.getParameterTypes(cf.constant_pool);
+                returnType = m.descriptor.getReturnType(cf.constant_pool);
+                Code_attribute codeAttr = (Code_attribute)
+                    m.attributes.get(Attribute.Code);
+                lineNumberTable = ((LineNumberTable_attribute)
+                    codeAttr.attributes.get(Attribute.LineNumberTable)).line_number_table;
+            } catch (ConstantPoolException|Descriptor.InvalidDescriptor e) {
+                throw new RuntimeException(e);
+            }
+            this.name = name;
+            this.paramTypes = paramTypes;
+            this.returnType = returnType;
+            Arrays.stream(lineNumberTable).forEach(entry ->
+                bciToLineNumbers.computeIfAbsent(entry.start_pc, _n -> new TreeSet<>())
+                    .add(entry.line_number));
+        }
+
+        String name() {
+            return name;
+        }
+
+        Optional<SortedSet<Integer>> findLineNumbers(int value) {
+            return bciToLineNumbers.entrySet().stream()
+                    .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder()))
+                    .filter(e -> e.getKey().intValue() <= value)
+                    .map(Map.Entry::getValue)
+                    .findFirst();
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append(name);
+            sb.append(paramTypes).append(returnType).append(" ");
+            bciToLineNumbers.entrySet().stream()
+                .sorted(Map.Entry.comparingByKey())
+                .forEach(entry -> sb.append("bci:").append(entry.getKey()).append(" ")
+                                    .append(entry.getValue()).append(" "));
+            return sb.toString();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/BootstrapClassPathAgent.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package p;
+
+import java.io.*;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.Instrumentation;
+import java.lang.reflect.Module;
+import java.security.ProtectionDomain;
+
+public class BootstrapClassPathAgent {
+
+    public static void premain(String args, Instrumentation inst) {
+        System.out.println("agent loader=" + BootstrapClassPathAgent.class.getClassLoader());
+        inst.addTransformer(new MyTransformer());
+    }
+
+    static class MyTransformer implements ClassFileTransformer {
+
+        public byte[] transform(Module module,
+                                String className,
+                                Class<?> classBeingRedefined,
+                                ProtectionDomain    protectionDomain,
+                                byte[] classfileBuffer) {
+            System.out.println(className + ", module=" + module);
+            return null;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/BootstrapClassPathSetUp.sh	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,68 @@
+#!/bin/sh
+
+#
+# Copyright (c) 2016, 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.
+#
+
+if [ "${TESTSRC}" = "" ]
+then
+  echo "TESTSRC not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+echo "TESTSRC=${TESTSRC}"
+
+if [ "${TESTJAVA}" = "" ]
+then
+  echo "TESTJAVA not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+echo "TESTJAVA=${TESTJAVA}"
+
+if [ "${COMPILEJAVA}" = "" ]
+then
+  COMPILEJAVA="${TESTJAVA}"
+fi
+echo "COMPILEJAVA=${COMPILEJAVA}"
+
+if [ "${TESTCLASSES}" = "" ]
+then
+  echo "TESTCLASSES not set.  Test cannot execute.  Failed."
+  exit 1
+fi
+
+echo "TESTCLASSES=${TESTCLASSES}"
+echo "CLASSPATH=${CLASSPATH}"
+
+JAVAC="${COMPILEJAVA}/bin/javac -g"
+JAR="${COMPILEJAVA}/bin/jar"
+
+mkdir agentclasses
+touch agent.mf
+echo "Manifest-Version: 1.0" >> agent.mf
+echo "Boot-Class-Path: agent.jar" >> agent.mf
+echo "Premain-Class: p.BootstrapClassPathAgent" >> agent.mf
+
+cp ${TESTSRC}/BootstrapClassPathAgent.java BootstrapClassPathAgent.java
+${JAVAC} ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d agentclasses BootstrapClassPathAgent.java
+echo "JAR=${JAR}"
+${JAR} ${TESTTOOLVMOPTS} cvfm agent.jar agent.mf -C agentclasses .
+rm -f BootstrapClassPathAgent.class BootstrapClassPathAgent.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/instrument/BootstrapClassPathTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, 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 8156147
+ * @summary simple test for the Boot-Class-Path agent
+ *
+ * @run build BootstrapClassPathTest
+ * @run shell BootstrapClassPathSetUp.sh
+ * @run main/othervm -javaagent:agent.jar BootstrapClassPathTest BootstrapClassPathTest
+ */
+
+import java.io.*;
+import java.lang.instrument.*;
+import java.lang.reflect.Module;
+import java.security.ProtectionDomain;
+
+public class BootstrapClassPathTest {
+
+    public static void main (String[] args) {
+    }
+}
--- a/jdk/test/java/lang/invoke/VarargsArrayTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/lang/invoke/VarargsArrayTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -37,7 +37,7 @@
  * @library /lib/testlibrary /lib/testlibrary/jsr292
  * @compile/module=java.base java/lang/invoke/MethodHandleHelper.java
  * @run main/bootclasspath VarargsArrayTest
- * @run main/bootclasspath -DVarargsArrayTest.MAX_ARITY=255 -DVarargsArrayTest.START_ARITY=250
+ * @run main/bootclasspath/othervm -DVarargsArrayTest.MAX_ARITY=255 -DVarargsArrayTest.START_ARITY=250
  *                         VarargsArrayTest
  */
 
--- a/jdk/test/java/lang/module/ModuleFinderTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/lang/module/ModuleFinderTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -340,7 +340,7 @@
      */
     public void testOfWithUnrecognizedEntry() throws Exception {
         Path dir = Files.createTempDirectory(USER_DIR, "mods");
-        Path mod = Files.createTempFile(dir, "m", "mod");
+        Path mod = Files.createTempFile(dir, "m", ".junk");
 
         ModuleFinder finder = ModuleFinder.of(mod);
         try {
@@ -361,6 +361,48 @@
 
 
     /**
+     * Test ModuleFinder.of with a file path to a directory containing a file
+     * that will not be recognized as a module.
+     */
+    public void testOfWithUnrecognizedEntryInDirectory() throws Exception {
+        Path dir = Files.createTempDirectory(USER_DIR, "mods");
+        Files.createTempFile(dir, "m", ".junk");
+
+        ModuleFinder finder = ModuleFinder.of(dir);
+        try {
+            finder.find("java.rhubarb");
+            assertTrue(false);
+        } catch (FindException e) {
+            // expected
+        }
+
+        finder = ModuleFinder.of(dir);
+        try {
+            finder.findAll();
+            assertTrue(false);
+        } catch (FindException e) {
+            // expected
+        }
+    }
+
+
+    /**
+     * Test ModuleFinder.of with a file path to a directory containing a file
+     * starting with ".", the file should be ignored.
+     */
+    public void testOfWithHiddenEntryInDirectory() throws Exception {
+        Path dir = Files.createTempDirectory(USER_DIR, "mods");
+        Files.createTempFile(dir, ".marker", "");
+
+        ModuleFinder finder = ModuleFinder.of(dir);
+        assertFalse(finder.find("java.rhubarb").isPresent());
+
+        finder = ModuleFinder.of(dir);
+        assertTrue(finder.findAll().isEmpty());
+    }
+
+
+    /**
      * Test ModuleFinder.of with a directory that contains two
      * versions of the same module
      */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/reflect/WeakPairMap/Driver.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2016, 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 8888888
+ * @summary Functional test for WeakPairMap
+ * @build java.base/java.lang.reflect.WeakPairMapTest
+ * @run main Driver
+ */
+public class Driver {
+    public static void main(String[] args) {
+        java.lang.reflect.WeakPairMapTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/reflect/WeakPairMap/java.base/java/lang/reflect/WeakPairMapTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package java.lang.reflect;
+
+import java.lang.ref.Reference;
+import java.util.Objects;
+
+/**
+ * Functional test for WeakPairMap
+ *
+ * @author Peter Levart
+ */
+public class WeakPairMapTest {
+    public static void main(String[] args) {
+        WeakPairMap<Object, Object, String> pm = new WeakPairMap<>();
+        Object key1 = new Object();
+        Object key2 = new Object();
+
+        // check for emptiness
+        assertEquals(pm.containsKeyPair(key1, key2), false);
+        assertEquals(pm.get(key1, key2), null);
+
+        // check for NPE(s)
+        for (Object k1 : new Object[]{null, key1}) {
+            for (Object k2 : new Object[]{null, key2}) {
+                for (String v : new String[]{null, "abc"}) {
+
+                    if (k1 != null && k2 != null && v != null) {
+                        // skip non-null args
+                        continue;
+                    }
+
+                    try {
+                        pm.put(k1, k2, v);
+                        throw new AssertionError("Unexpected code path, k1=" +
+                                                 k1 + ", k2=" + k2 + ", v=" + v);
+                    } catch (NullPointerException e) {
+                        // expected
+                    }
+
+                    try {
+                        pm.putIfAbsent(k1, k2, v);
+                        throw new AssertionError("Unexpected code path, k1=" +
+                                                 k1 + ", k2=" + k2 + ", v=" + v);
+                    } catch (NullPointerException e) {
+                        // expected
+                    }
+
+                    if (k1 != null && k2 != null) {
+                        // skip non-null args
+                        continue;
+                    }
+
+                    try {
+                        pm.computeIfAbsent(k1, k2, (_k1, _k2) -> v);
+                        throw new AssertionError("Unexpected code path, k1=" +
+                                                 k1 + ", k2=" + k2 + ", v=" + v);
+                    } catch (NullPointerException e) {
+                        // expected
+                    }
+
+                    try {
+                        pm.containsKeyPair(k1, k2);
+                        throw new AssertionError("Unexpected code path, k1=" +
+                                                 k1 + ", k2=" + k2);
+                    } catch (NullPointerException e) {
+                        // expected
+                    }
+
+                    try {
+                        pm.get(k1, k2);
+                        throw new AssertionError("Unexpected code path, k1=" +
+                                                 k1 + ", k2=" + k2);
+                    } catch (NullPointerException e) {
+                        // expected
+                    }
+                }
+            }
+        }
+
+        // how much to wait when it is expected for entry to be retained
+        final long retentionTimeout = 500L;
+        // how much to wait when it is expected for entry to be removed
+        final long cleanupTimeout = 30_000L;
+
+        // check insertion
+        assertEquals(pm.putIfAbsent(key1, key2, "abc"), null);
+        assertEquals(pm.get(key1, key2), "abc");
+
+        // check retention while both keys are still reachable
+        assertEquals(gcAndWaitRemoved(pm, "abc", retentionTimeout), false);
+        assertEquals(pm.get(key1, key2), "abc");
+
+        // check cleanup when both keys are unreachable
+        key1 = null;
+        key2 = null;
+        assertEquals(gcAndWaitRemoved(pm, "abc", cleanupTimeout), true);
+
+        // new insertion
+        key1 = new Object();
+        key2 = new Object();
+        assertEquals(pm.putIfAbsent(key1, key2, "abc"), null);
+        assertEquals(pm.get(key1, key2), "abc");
+
+        // check retention while both keys are still reachable
+        assertEquals(gcAndWaitRemoved(pm, "abc", retentionTimeout), false);
+        assertEquals(pm.get(key1, key2), "abc");
+
+        // check cleanup when 1st key is unreachable
+        key1 = null;
+        assertEquals(gcAndWaitRemoved(pm, "abc", cleanupTimeout), true);
+        Reference.reachabilityFence(key2);
+
+        // new insertion
+        key1 = new Object();
+        key2 = new Object();
+        assertEquals(pm.putIfAbsent(key1, key2, "abc"), null);
+        assertEquals(pm.get(key1, key2), "abc");
+
+        // check retention while both keys are still reachable
+        assertEquals(gcAndWaitRemoved(pm, "abc", retentionTimeout), false);
+        assertEquals(pm.get(key1, key2), "abc");
+
+        // check cleanup when 2nd key is unreachable
+        key2 = null;
+        assertEquals(gcAndWaitRemoved(pm, "abc", cleanupTimeout), true);
+        Reference.reachabilityFence(key1);
+    }
+
+    /**
+     * Trigger GC and wait for at most {@code millis} ms for given value to
+     * be removed from given WeakPairMap.
+     *
+     * @return true if element has been removed or false if not
+     */
+    static <V> boolean gcAndWaitRemoved(WeakPairMap<?, ?, V> pm, V value,
+                                        long millis) {
+        System.gc();
+        for (int i = 0; i < (millis + 99) / 100 && pm.values().contains(value); i++) {
+            try {
+                Thread.sleep(100L);
+            } catch (InterruptedException e) {
+                throw new AssertionError("Interrupted");
+            }
+        }
+        return !pm.values().contains(value);
+    }
+
+    static void assertEquals(Object actual, Object expected) {
+        if (!Objects.equals(actual, expected)) {
+            throw new AssertionError("Expected: " + expected + ", actual: " + actual);
+        }
+    }
+}
--- a/jdk/test/java/net/httpclient/QuickResponses.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/QuickResponses.java	Wed Jul 05 21:40:37 2017 +0200
@@ -71,6 +71,7 @@
     public static void main(String[] args) throws Exception {
         server = new Server(0);
         URI uri = new URI(server.getURL());
+        server.start();
 
         HttpRequest request = HttpRequest.create(uri)
                 .GET();
@@ -79,7 +80,6 @@
         Server.Connection s1 = server.activity();
         s1.send(entireResponse());
 
-
         HttpResponse r = cf1.join();
         if (r.statusCode()!= 200 || !r.body(HttpResponse.asString()).equals(responses[0]))
             throw new RuntimeException("Failed on first response");
--- a/jdk/test/java/net/httpclient/Server.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/Server.java	Wed Jul 05 21:40:37 2017 +0200
@@ -21,8 +21,6 @@
  * questions.
  */
 
-//package javaapplication16;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -32,6 +30,7 @@
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Iterator;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -44,13 +43,16 @@
 public class Server extends Thread {
 
     ServerSocket ss;
-    List<Connection> sockets;
+    private final List<Connection> sockets;
+    private final List<Connection> removals;
+    private final List<Connection> additions;
     AtomicInteger counter = new AtomicInteger(0);
 
     // waits up to 20 seconds for something to happen
     // dont use this unless certain activity coming.
     public Connection activity() {
         for (int i = 0; i < 80 * 100; i++) {
+            doRemovalsAndAdditions();
             for (Connection c : sockets) {
                 if (c.poll()) {
                     return c;
@@ -59,11 +61,26 @@
             try {
                 Thread.sleep(250);
             } catch (InterruptedException e) {
+                e.printStackTrace();
             }
         }
         return null;
     }
 
+    private void doRemovalsAndAdditions() {
+        if (removals.isEmpty() && additions.isEmpty())
+            return;
+        Iterator<Connection> i = removals.iterator();
+        while (i.hasNext())
+            sockets.remove(i.next());
+        removals.clear();
+
+        i = additions.iterator();
+        while (i.hasNext())
+            sockets.add(i.next());
+        additions.clear();
+    }
+
     // clears all current connections on Server.
     public void reset() {
         for (Connection c : sockets) {
@@ -84,7 +101,6 @@
             incoming = new ArrayBlockingQueue<>(100);
             setName("Server-Connection");
             setDaemon(true);
-            start();
         }
         final Socket socket;
         final int id;
@@ -210,16 +226,17 @@
             try {
                 socket.close();
             } catch (IOException e) {}
-            sockets.remove(this);
+            removals.add(this);
         }
     }
 
     Server(int port) throws IOException {
         ss = new ServerSocket(port);
         sockets = Collections.synchronizedList(new LinkedList<>());
+        removals = Collections.synchronizedList(new LinkedList<>());
+        additions = Collections.synchronizedList(new LinkedList<>());
         setName("Test-Server");
         setDaemon(true);
-        start();
     }
 
     Server() throws IOException {
@@ -238,6 +255,7 @@
         try {
             ss.close();
         } catch (IOException e) {
+            e.printStackTrace();
         }
         for (Connection c : sockets) {
             c.close();
@@ -250,8 +268,10 @@
             try {
                 Socket s = ss.accept();
                 Connection c = new Connection(s);
-                sockets.add(c);
+                c.start();
+                additions.add(c);
             } catch (IOException e) {
+                e.printStackTrace();
             }
         }
     }
--- a/jdk/test/java/net/httpclient/SplitResponse.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/SplitResponse.java	Wed Jul 05 21:40:37 2017 +0200
@@ -68,6 +68,7 @@
     public static void main(String[] args) throws Exception {
         server = new Server(0);
         URI uri = new URI(server.getURL());
+        server.start();
 
         HttpRequest request;
         HttpResponse r;
--- a/jdk/test/java/net/httpclient/http2/BasicTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/http2/BasicTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -98,6 +98,7 @@
             simpleTest(true);
             streamTest(false);
             streamTest(true);
+            paramsTest();
             Thread.sleep(1000 * 4);
         } finally {
             httpServer.stop();
@@ -180,6 +181,30 @@
         System.err.println("DONE");
     }
 
+    static void paramsTest() throws Exception {
+        Http2TestServer server = new Http2TestServer(true, 0, (t -> {
+            SSLSession s = t.getSSLSession();
+            String prot = s.getProtocol();
+            if (prot.equals("TLSv1.2")) {
+                t.sendResponseHeaders(200, -1);
+            } else {
+                System.err.printf("Protocols =%s\n", prot);
+                t.sendResponseHeaders(500, -1);
+            }
+        }), exec, sslContext);
+        server.start();
+        int port = server.getAddress().getPort();
+        URI u = new URI("https://127.0.0.1:"+port+"/foo");
+        HttpClient client = getClient();
+        HttpRequest req = client.request(u)
+            .GET();
+        HttpResponse resp = req.response();
+        int stat = resp.statusCode();
+        if (stat != 200) {
+            throw new RuntimeException("paramsTest failed "
+                + Integer.toString(stat));
+        }
+    }
 
     static void simpleTest(boolean secure) throws Exception {
         URI uri = getURI(secure);
--- a/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestExchange.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestExchange.java	Wed Jul 05 21:40:37 2017 +0200
@@ -5,6 +5,7 @@
 import java.io.IOException;
 import java.net.URI;
 import java.net.InetSocketAddress;
+import javax.net.ssl.SSLSession;
 
 public class Http2TestExchange {
 
@@ -14,6 +15,7 @@
     final String method;
     final InputStream is;
     final BodyOutputStream os;
+    final SSLSession sslSession;
     final int streamid;
     final boolean pushAllowed;
     final Http2TestServerConnection conn;
@@ -24,6 +26,7 @@
 
     Http2TestExchange(int streamid, String method, HttpHeadersImpl reqheaders,
             HttpHeadersImpl rspheaders, URI uri, InputStream is,
+            SSLSession sslSession,
             BodyOutputStream os, Http2TestServerConnection conn, boolean pushAllowed) {
         this.reqheaders = reqheaders;
         this.rspheaders = rspheaders;
@@ -32,6 +35,7 @@
         this.is = is;
         this.streamid = streamid;
         this.os = os;
+        this.sslSession = sslSession;
         this.pushAllowed = pushAllowed;
         this.conn = conn;
         this.server = conn.server;
@@ -53,6 +57,10 @@
         return method;
     }
 
+    public SSLSession getSSLSession() {
+        return sslSession;
+    }
+
     public void close() {
         try {
             is.close();
--- a/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestServerConnection.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestServerConnection.java	Wed Jul 05 21:40:37 2017 +0200
@@ -31,6 +31,8 @@
 import java.io.OutputStream;
 import java.net.Socket;
 import java.net.URI;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocket;
 import java.net.URISyntaxException;
 import static java.net.http.SettingsFrame.HEADER_TABLE_SIZE;
 import java.nio.ByteBuffer;
@@ -355,7 +357,8 @@
             URI uri = new URI(us);
             boolean pushAllowed = clientSettings.getParameter(SettingsFrame.ENABLE_PUSH) == 1;
             Http2TestExchange exchange = new Http2TestExchange(streamid, method,
-                    headers, rspheaders, uri, bis, bos, this, pushAllowed);
+                    headers, rspheaders, uri, bis, getSSLSession(),
+                    bos, this, pushAllowed);
 
             // give to user
             handler.handle(exchange);
@@ -368,6 +371,12 @@
         }
     }
 
+    private SSLSession getSSLSession() {
+        if (! (socket instanceof SSLSocket))
+            return null;
+        SSLSocket ssl = (SSLSocket)socket;
+        return ssl.getSession();
+    }
     // Runs in own thread
 
     @SuppressWarnings({"rawtypes","unchecked"})
--- a/jdk/test/java/net/httpclient/security/0.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/0.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -2,8 +2,7 @@
 
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- a/jdk/test/java/net/httpclient/security/1.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/1.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 1
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
@@ -13,7 +12,7 @@
 
 
     // permissions specific to this test
-    permission java.net.URLPermission "http://127.0.0.1:*/files/foo.txt", "GET";
+    permission java.net.URLPermission "http://127.0.0.1:${port.number}/files/foo.txt", "GET";
 };
 
 // For proxy only. Not being tested
--- a/jdk/test/java/net/httpclient/security/10.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/10.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 10
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
@@ -12,7 +11,7 @@
     permission java.lang.RuntimePermission "createClassLoader";
 
     // permissions specific to this test
-    permission java.net.URLPermission "http://127.0.0.1:*/files/foo.txt", "GET:*";
+    permission java.net.URLPermission "http://127.0.0.1:${port.number}/files/foo.txt", "GET:*";
 };
 
 // For proxy only. Not being tested
--- a/jdk/test/java/net/httpclient/security/11.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/11.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 11
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
@@ -12,8 +11,8 @@
     permission java.lang.RuntimePermission "createClassLoader";
 
     // permissions specific to this test
-    permission java.net.URLPermission "http://127.0.0.1:*/files/foo.txt", "GET:*";
-    permission java.net.URLPermission "socket://127.0.0.1:27301", "CONNECT";
+    permission java.net.URLPermission "http://127.0.0.1:${port.number}/files/foo.txt", "GET:*";
+    permission java.net.URLPermission "socket://127.0.0.1:${port.number1}", "CONNECT";
 };
 
 
--- a/jdk/test/java/net/httpclient/security/12.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/12.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 11
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
@@ -12,8 +11,8 @@
     permission java.lang.RuntimePermission "createClassLoader";
 
     // permissions specific to this test
-    permission java.net.URLPermission "http://127.0.0.1:*/files/foo.txt", "GET:*";
-    permission java.net.URLPermission "socket://127.0.0.1:27301", "CONNECT";
+    permission java.net.URLPermission "http://127.0.0.1:${port.number}/files/foo.txt", "GET:*";
+    permission java.net.URLPermission "socket://127.0.0.1:${port.number1}", "CONNECT";
 };
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/httpclient/security/14.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,23 @@
+// Policy 14
+grant {
+    // permissions common to all tests
+    permission java.util.PropertyPermission "*", "read";
+    permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
+    permission java.net.NetPermission "getDefaultHttpClient";
+    permission java.lang.RuntimePermission "modifyThread";
+    permission java.util.logging.LoggingPermission "control", "";
+    permission java.net.SocketPermission "localhost:1024-", "accept,listen";
+    permission java.io.FilePermission "${test.src}${/}docs${/}-", "read";
+    permission java.lang.RuntimePermission "createClassLoader";
+
+
+    // permissions specific to this test
+    permission java.net.URLPermission "http://127.0.0.1:*/files/foo.txt", "GET";
+};
+
+// For proxy only. Not being tested
+grant codebase "file:${test.classes}/proxydir/-" {
+    permission java.net.SocketPermission "localhost:1024-", "accept,listen,connect";
+    permission java.net.SocketPermission "127.0.0.1:1024-", "connect,resolve";
+};
+
--- a/jdk/test/java/net/httpclient/security/15.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/15.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 11
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
@@ -13,7 +12,6 @@
 
     // permissions specific to this test
     permission java.net.URLPermission "http://127.0.0.1:*/files/foo.txt", "GET:*";
-    permission java.net.URLPermission "socket://127.0.0.1:27301", "CONNECT";
 
     // Test checks for this explicitly
     permission java.net.RuntimePermission "foobar";
--- a/jdk/test/java/net/httpclient/security/2.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/2.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 2
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- a/jdk/test/java/net/httpclient/security/3.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/3.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 3
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- a/jdk/test/java/net/httpclient/security/4.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/4.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 4
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- a/jdk/test/java/net/httpclient/security/5.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/5.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 5
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- a/jdk/test/java/net/httpclient/security/6.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/6.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 6
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- a/jdk/test/java/net/httpclient/security/7.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/7.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 7
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- a/jdk/test/java/net/httpclient/security/8.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/8.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 8
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- a/jdk/test/java/net/httpclient/security/9.policy	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/9.policy	Wed Jul 05 21:40:37 2017 +0200
@@ -1,8 +1,7 @@
 // Policy 9
 grant {
     // permissions common to all tests
-    permission java.util.PropertyPermission "test.src", "read";
-    permission java.util.PropertyPermission "test.classes", "read";
+    permission java.util.PropertyPermission "*", "read";
     permission java.io.FilePermission "${test.classes}${/}-", "read,write,delete";
     permission java.net.NetPermission "getDefaultHttpClient";
     permission java.lang.RuntimePermission "modifyThread";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/httpclient/security/Driver.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2015, 2016, 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
+ */
+
+/**
+ * @test
+ * @bug 8087112
+ * @library /lib/testlibrary/
+ * @build jdk.testlibrary.SimpleSSLContext jdk.testlibrary.Utils
+ * @compile ../../../../com/sun/net/httpserver/LogFilter.java
+ * @compile ../../../../com/sun/net/httpserver/FileServerHandler.java
+ * @compile ../ProxyServer.java
+ * @build Security
+ *
+ * @run driver/timeout=60 Driver
+ */
+
+/**
+ * driver required for allocating free portnumbers and putting this number
+ * into security policy file used in some tests.
+ *
+ * The tests are in Security.java and port number supplied in -Dport.number
+ * and -Dport.number1 for tests that require a second free port
+ */
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.io.*;
+import java.net.*;
+
+import jdk.testlibrary.OutputAnalyzer;
+import jdk.testlibrary.Utils;
+
+/**
+ * Driver for tests
+ */
+public class Driver {
+
+    public static void main(String[] args) throws Throwable {
+        System.out.println("Starting Driver");
+        runtest("1.policy", "1");
+        runtest("10.policy", "10");
+        runtest("11.policy", "11");
+        runtest("12.policy", "12");
+        System.out.println("DONE");
+    }
+
+    static class Logger extends Thread {
+        private final OutputStream ps;
+        private final InputStream stdout;
+
+        Logger(String cmdLine, Process p, String dir) throws IOException {
+            super();
+            setDaemon(true);
+            cmdLine = "Command line = [" + cmdLine + "]";
+            stdout = p.getInputStream();
+            File f = File.createTempFile("debug", ".txt", new File(dir));
+            ps = new FileOutputStream(f);
+            ps.write(cmdLine.getBytes());
+            ps.flush();
+        }
+
+        public void run() {
+            try {
+                byte[] buf = new byte[128];
+                int c;
+                while ((c = stdout.read(buf)) != -1) {
+                    ps.write(buf, 0, c);
+                    ps.flush();
+                }
+                ps.close();
+            } catch (Throwable e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public static void runtest(String policy, String testnum) throws Throwable {
+
+        String testJdk = System.getProperty("test.jdk", "?");
+        String testSrc = System.getProperty("test.src", "?");
+        String testClassPath = System.getProperty("test.class.path", "?");
+        String testClasses = System.getProperty("test.classes", "?");
+        String sep = System.getProperty("file.separator", "?");
+        String javaCmd = testJdk + sep + "bin" + sep + "java";
+        int retval = 10; // 10 is special exit code denoting a bind error
+                         // in which case, we retry
+        while (retval == 10) {
+            List<String> cmd = new ArrayList<>();
+            cmd.add(javaCmd);
+            cmd.add("-Dtest.jdk=" + testJdk);
+            cmd.add("-Dtest.src=" + testSrc);
+            cmd.add("-Dtest.classes=" + testClasses);
+            cmd.add("-Djava.security.manager");
+            cmd.add("-Djava.security.policy=" + testSrc + sep + policy);
+            cmd.add("-Dport.number=" + Integer.toString(Utils.getFreePort()));
+            cmd.add("-Dport.number1=" + Integer.toString(Utils.getFreePort()));
+            cmd.add("-cp");
+            cmd.add(testClassPath);
+            cmd.add("Security");
+            cmd.add(testnum);
+
+            ProcessBuilder processBuilder = new ProcessBuilder(cmd)
+                .redirectOutput(ProcessBuilder.Redirect.PIPE)
+                .redirectErrorStream(true);
+
+            String cmdLine = cmd.stream().collect(Collectors.joining(" "));
+            Process child = processBuilder.start();
+            Logger log = new Logger(cmdLine, child, testClasses);
+            log.start();
+            retval = child.waitFor();
+            System.out.println("retval = " + retval);
+        }
+        if (retval != 0) {
+            Thread.sleep(2000);
+            throw new RuntimeException("Non zero return value");
+        }
+    }
+}
--- a/jdk/test/java/net/httpclient/security/Security.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/net/httpclient/security/Security.java	Wed Jul 05 21:40:37 2017 +0200
@@ -32,7 +32,6 @@
  * @compile ../ProxyServer.java
  *
  * @run main/othervm/secure=java.lang.SecurityManager/policy=0.policy Security 0
- * @run main/othervm/secure=java.lang.SecurityManager/policy=1.policy Security 1
  * @run main/othervm/secure=java.lang.SecurityManager/policy=2.policy Security 2
  * @run main/othervm/secure=java.lang.SecurityManager/policy=3.policy Security 3
  * @run main/othervm/secure=java.lang.SecurityManager/policy=4.policy Security 4
@@ -41,14 +40,13 @@
  * @run main/othervm/secure=java.lang.SecurityManager/policy=7.policy Security 7
  * @run main/othervm/secure=java.lang.SecurityManager/policy=8.policy Security 8
  * @run main/othervm/secure=java.lang.SecurityManager/policy=9.policy Security 9
- * @run main/othervm/secure=java.lang.SecurityManager/policy=10.policy Security 10
- * @run main/othervm/secure=java.lang.SecurityManager/policy=11.policy Security 11
- * @run main/othervm/secure=java.lang.SecurityManager/policy=12.policy Security 12
  * @run main/othervm/secure=java.lang.SecurityManager/policy=0.policy Security 13
- * @run main/othervm/secure=java.lang.SecurityManager/policy=1.policy Security 14
+ * @run main/othervm/secure=java.lang.SecurityManager/policy=14.policy Security 14
  * @run main/othervm/secure=java.lang.SecurityManager/policy=15.policy Security 15
  */
 
+// Tests 1, 10, 11 and 12 executed from Driver
+
 import com.sun.net.httpserver.*;
 import java.io.IOException;
 import java.io.InputStream;
@@ -78,7 +76,7 @@
 
     static HttpServer s1 = null;
     static ExecutorService executor=null;
-    static int port;
+    static int port, proxyPort;
     static HttpClient client;
     static String httproot, fileuri, fileroot, redirectroot;
     static List<HttpClient> clients = new LinkedList<>();
@@ -136,6 +134,9 @@
         if (!dest.toFile().exists()) {
             System.out.printf("moving %s to %s\n", src.toString(), dest.toString());
             Files.move(src, dest,  StandardCopyOption.REPLACE_EXISTING);
+        } else if (src.toFile().exists()) {
+            System.out.printf("%s exists, deleting %s\n", dest.toString(), src.toString());
+            Files.delete(src);
         } else {
             System.out.printf("NOT moving %s to %s\n", src.toString(), dest.toString());
         }
@@ -225,15 +226,15 @@
             }),
             // (10) policy has permission for destination URL but not for proxy
             test(false, () -> { //Policy 10
-                directProxyTest(27208, true);
+                directProxyTest(proxyPort, true);
             }),
             // (11) policy has permission for both destination URL and proxy
             test(true, () -> { //Policy 11
-                directProxyTest(27301, true);
+                directProxyTest(proxyPort, true);
             }),
             // (12) policy has permission for both destination URL and proxy
             test(false, () -> { //Policy 11
-                directProxyTest(28301, false);
+                directProxyTest(proxyPort, false);
             }),
             // (13) async version of test 0
             test(false, () -> { // Policy 0
@@ -350,6 +351,8 @@
                 throw new RuntimeException("Failed");
             }
             System.out.println (policy + " succeeded as expected");
+        } catch (BindException e) {
+            System.exit(10);
         } catch (SecurityException e) {
             if (succeeds) {
                 System.out.println("FAILED");
@@ -362,8 +365,12 @@
     }
 
     public static void main(String[] args) throws Exception {
-        initServer();
-        setupProxy();
+        try {
+            initServer();
+            setupProxy();
+        } catch (BindException e) {
+            System.exit(10);
+        }
         fileroot = System.getProperty ("test.src")+ "/docs";
         int testnum = Integer.parseInt(args[0]);
         String policy = args[0];
@@ -382,33 +389,25 @@
             runtest(tr.test, policy, tr.result);
         } finally {
             s1.stop(0);
-            //executor.shutdownNow();
+            executor.shutdownNow();
             for (HttpClient client : clients)
                 client.executorService().shutdownNow();
         }
     }
 
-    // create Http Server on port range below. So, we can
-    HttpServer createServer() {
-        HttpServer server;
-        for (int i=25800; i<26800; i++) {
-            InetSocketAddress a = new InetSocketAddress(i);
-            try {
-                server = HttpServer.create(a, 0);
-                return server;
-            } catch (IOException e) {}
-        }
-        return null;
-    }
+    public static void initServer() throws Exception {
+        String portstring = System.getProperty("port.number");
+        port = portstring != null ? Integer.parseInt(portstring) : 0;
+        portstring = System.getProperty("port.number1");
+        proxyPort = portstring != null ? Integer.parseInt(portstring) : 0;
 
-    public static void initServer() throws Exception {
         Logger logger = Logger.getLogger("com.sun.net.httpserver");
         ConsoleHandler ch = new ConsoleHandler();
         logger.setLevel(Level.ALL);
         ch.setLevel(Level.ALL);
         logger.addHandler(ch);
         String root = System.getProperty ("test.src")+ "/docs";
-        InetSocketAddress addr = new InetSocketAddress (0);
+        InetSocketAddress addr = new InetSocketAddress (port);
         s1 = HttpServer.create (addr, 0);
         if (s1 instanceof HttpsServer) {
             throw new RuntimeException ("should not be httpsserver");
@@ -423,7 +422,13 @@
         s1.setExecutor (executor);
         s1.start();
 
-        port = s1.getAddress().getPort();
+        if (port == 0)
+            port = s1.getAddress().getPort();
+        else {
+            if (s1.getAddress().getPort() != port)
+                throw new RuntimeException("Error wrong port");
+            System.out.println("Port was assigned by Driver");
+        }
         System.out.println("HTTP server port = " + port);
         httproot = "http://127.0.0.1:" + port + "/files/";
         redirectroot = "http://127.0.0.1:" + port + "/redirect/";
--- a/jdk/test/java/nio/channels/AsynchronousSocketChannel/Basic.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/nio/channels/AsynchronousSocketChannel/Basic.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,7 @@
  * @bug 4607272 6842687 6878369 6944810 7023403
  * @summary Unit test for AsynchronousSocketChannel
  * @run main Basic -skipSlowConnectTest
- * @key randomness
+ * @key randomness intermittent
  */
 
 import java.nio.ByteBuffer;
--- a/jdk/test/java/nio/channels/FileChannel/InterruptMapDeadlock.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/nio/channels/FileChannel/InterruptMapDeadlock.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, 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
@@ -23,6 +23,7 @@
 
 /* @test
  * @bug 8024833
+ * @key intermittent
  * @summary Tests interruption of threads mapping sections of a file channel in
  *   an attempt to deadlock due to nesting of begin calls.
  */
--- a/jdk/test/java/nio/charset/spi/basic.sh	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/nio/charset/spi/basic.sh	Wed Jul 05 21:40:37 2017 +0200
@@ -113,7 +113,7 @@
 		     av="$av -Djava.security.manager -Djava.security.policy==$TESTSRC/default-pol";;
       cp-policy)     css="$CSS FOO";
 		     av="$av -Djava.security.manager
-		         -Djava.security.policy==$TESTSRC/charsetProvider.sp";;
+		         -Djava.security.policy=$TESTSRC/charsetProvider.sp";;
     esac
     if (set -x; $JAVA ${TESTVMOPTS} $av Test $css) 2>&1; then
       continue;
--- a/jdk/test/java/nio/charset/spi/default-pol	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/nio/charset/spi/default-pol	Wed Jul 05 21:40:37 2017 +0200
@@ -1,3 +1,11 @@
+grant codeBase "jrt:/jdk.charsets" {
+        permission java.io.FilePermission "${java.home}/-", "read";
+        permission java.util.PropertyPermission "os.name", "read";
+        permission java.util.PropertyPermission "sun.nio.cs.map", "read";
+        permission java.lang.RuntimePermission "charsetProvider";
+        permission java.lang.RuntimePermission "accessClassInPackage.jdk.internal.misc";
+        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.cs";
+};
 
 // default permissions granted to all domains
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/SecureRandom/DrbgParametersSpec.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2016, 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 8051408
+ * @summary Make sure DrbgParameters coded as specified
+ * @library /test/lib/share/classes
+ */
+
+import jdk.test.lib.Asserts;
+
+import java.security.DrbgParameters;
+import java.util.Arrays;
+
+import static java.security.DrbgParameters.Capability.*;
+
+public class DrbgParametersSpec {
+
+    public static void main(String args[]) throws Exception {
+
+        byte[] p, np1, np2;
+
+        // Capability
+        Asserts.assertTrue(PR_AND_RESEED.supportsPredictionResistance());
+        Asserts.assertTrue(PR_AND_RESEED.supportsReseeding());
+        Asserts.assertFalse(RESEED_ONLY.supportsPredictionResistance());
+        Asserts.assertTrue(RESEED_ONLY.supportsReseeding());
+        Asserts.assertFalse(NONE.supportsPredictionResistance());
+        Asserts.assertFalse(NONE.supportsReseeding());
+
+        // Instantiation
+        p = "Instantiation".getBytes();
+        DrbgParameters.Instantiation ins = DrbgParameters
+                .instantiation(192, RESEED_ONLY, p);
+        Asserts.assertTrue(ins.getStrength() == 192);
+        Asserts.assertTrue(ins.getCapability() == RESEED_ONLY);
+        np1 = ins.getPersonalizationString();
+        np2 = ins.getPersonalizationString();
+        // Getter outputs have same content but not the same object
+        Asserts.assertTrue(Arrays.equals(np1, p));
+        Asserts.assertTrue(Arrays.equals(np2, p));
+        Asserts.assertNE(np1, np2);
+        // Changes to original input has no affect on object
+        p[0] = 'X';
+        np2 = ins.getPersonalizationString();
+        Asserts.assertTrue(Arrays.equals(np1, np2));
+
+        ins = DrbgParameters.instantiation(-1, NONE, null);
+        Asserts.assertNull(ins.getPersonalizationString());
+
+        // NextBytes
+        p = "NextBytes".getBytes();
+        DrbgParameters.NextBytes nb = DrbgParameters
+                .nextBytes(192, true, p);
+        Asserts.assertTrue(nb.getStrength() == 192);
+        Asserts.assertTrue(nb.getPredictionResistance());
+        np1 = nb.getAdditionalInput();
+        np2 = nb.getAdditionalInput();
+        // Getter outputs have same content but not the same object
+        Asserts.assertTrue(Arrays.equals(np1, p));
+        Asserts.assertTrue(Arrays.equals(np2, p));
+        Asserts.assertNE(np1, np2);
+        // Changes to original input has no affect on object
+        p[0] = 'X';
+        np2 = nb.getAdditionalInput();
+        Asserts.assertTrue(Arrays.equals(np1, np2));
+
+        // Reseed
+        p = "Reseed".getBytes();
+        DrbgParameters.Reseed rs = DrbgParameters
+                .reseed(true, p);
+        Asserts.assertTrue(rs.getPredictionResistance());
+        np1 = rs.getAdditionalInput();
+        np2 = rs.getAdditionalInput();
+        // Getter outputs have same content but not the same object
+        Asserts.assertTrue(Arrays.equals(np1, p));
+        Asserts.assertTrue(Arrays.equals(np2, p));
+        Asserts.assertNE(np1, np2);
+        // Changes to original input has no affect on object
+        p[0] = 'X';
+        np2 = rs.getAdditionalInput();
+        Asserts.assertTrue(Arrays.equals(np1, np2));
+    }
+}
--- a/jdk/test/java/security/SecureRandom/Serialize.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/security/SecureRandom/Serialize.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2016, 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
@@ -31,16 +31,73 @@
 
 public class Serialize {
 
-    public static void main(String args[]) throws IOException {
+    public static void main(String args[]) throws Exception {
+        for (String alg: new String[]{
+                "SHA1PRNG", "DRBG", "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG",
+                "Hash_DRBG,SHA-512,192,pr_and_reseed"}) {
+
+            System.out.println("Testing " + alg);
+            SecureRandom s1;
+
+            // A SecureRandom can be s11ned and des11ned at any time.
 
-        FileOutputStream fos = new FileOutputStream("t.tmp");
-        ObjectOutputStream oos = new ObjectOutputStream(fos);
+            // Brand new.
+            s1 = getInstance(alg);
+            revive(s1).nextInt();
+            if (alg.contains("DRBG")) {
+                revive(s1).reseed();
+            }
+
+            // Used
+            s1 = getInstance(alg);
+            s1.nextInt();    // state set
+            revive(s1).nextInt();
+            if (alg.contains("DRBG")) {
+                revive(s1).reseed();
+            }
 
-        SecureRandom secRandom = new SecureRandom();
+            // Automatically reseeded
+            s1 = getInstance(alg);
+            if (alg.contains("DRBG")) {
+                s1.reseed();
+            }
+            revive(s1).nextInt();
+            if (alg.contains("DRBG")) {
+                revive(s1).reseed();
+            }
+
+            // Manually seeded
+            s1 = getInstance(alg);
+            s1.setSeed(1L);
+            revive(s1).nextInt();
+            if (alg.contains("DRBG")) {
+                revive(s1).reseed();
+            }
+        }
+    }
 
-        // serialize and write out
-        oos.writeObject(secRandom);
-        oos.flush();
-        oos.close();
+    private static SecureRandom getInstance(String alg) throws Exception {
+        if (alg.equals("SHA1PRNG") || alg.equals("DRBG")) {
+            return SecureRandom.getInstance(alg);
+        } else {
+            String old = Security.getProperty("securerandom.drbg.config");
+            try {
+                Security.setProperty("securerandom.drbg.config", alg);
+                return SecureRandom.getInstance("DRBG");
+            } finally {
+                Security.setProperty("securerandom.drbg.config", old);
+            }
+        }
+    }
+
+    private static SecureRandom revive(SecureRandom oldOne) throws Exception {
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        new ObjectOutputStream(bout).writeObject(oldOne);
+        SecureRandom newOne = (SecureRandom) new ObjectInputStream(
+                new ByteArrayInputStream(bout.toByteArray())).readObject();
+        if (!oldOne.toString().equals(newOne.toString())) {
+            throw new Exception(newOne + " is not " + oldOne);
+        }
+        return newOne;
     }
 }
--- a/jdk/test/java/time/tck/java/time/format/TCKDateTimeFormatterBuilder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/time/tck/java/time/format/TCKDateTimeFormatterBuilder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -72,6 +72,7 @@
 import java.text.ParsePosition;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.YearMonth;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
@@ -793,7 +794,101 @@
         DateTimeFormatter df = new DateTimeFormatterBuilder().appendPattern("g").toFormatter();
          assertEquals(LocalDate.of(y, m, d).format(df), expected);
     }
+    //----------------------------------------------------------------------
+    @DataProvider(name="dayOfYearFieldValues")
+    Object[][] data_dayOfYearFieldValues() {
+        return new Object[][] {
+                {2016, 1, 1, "D", "1"},
+                {2016, 1, 31, "D", "31"},
+                {2016, 1, 1, "DD", "01"},
+                {2016, 1, 31, "DD", "31"},
+                {2016, 4, 9, "DD", "100"},
+                {2016, 1, 1, "DDD", "001"},
+                {2016, 1, 31, "DDD", "031"},
+                {2016, 4, 9, "DDD", "100"},
+        };
+    }
 
+    @Test(dataProvider="dayOfYearFieldValues")
+    public void test_dayOfYearFieldValues(int y, int m, int d, String pattern, String expected) throws Exception {
+        DateTimeFormatter df = new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
+        assertEquals(LocalDate.of(y, m, d).format(df), expected);
+    }
+
+    @DataProvider(name="dayOfYearFieldAdjacentParsingValues")
+    Object[][] data_dayOfYearFieldAdjacentParsingValues() {
+        return new Object[][] {
+            {"20160281015", LocalDateTime.of(2016, 1, 28, 10, 15)},
+            {"20161001015", LocalDateTime.of(2016, 4, 9, 10, 15)},
+        };
+    }
+
+    @Test(dataProvider="dayOfYearFieldAdjacentParsingValues")
+    public void test_dayOfYearFieldAdjacentValueParsing(String input, LocalDateTime expected) {
+        DateTimeFormatter df = new DateTimeFormatterBuilder().appendPattern("yyyyDDDHHmm").toFormatter();
+        LocalDateTime actual = LocalDateTime.parse(input, df);
+        assertEquals(actual, expected);
+    }
+
+    @Test(expectedExceptions = DateTimeParseException.class)
+    public void test_dayOfYearFieldInvalidValue() {
+        DateTimeFormatter.ofPattern("DDD").parse("1234");
+    }
+
+    @Test(expectedExceptions = DateTimeParseException.class)
+    public void test_dayOfYearFieldInvalidAdacentValueParsingPattern() {
+        // patterns D and DD will not take part in adjacent value parsing
+        DateTimeFormatter.ofPattern("yyyyDDHHmmss").parse("201610123456");
+    }
+
+    //-----------------------------------------------------------------------
+    @DataProvider(name="secondsPattern")
+    Object[][] data_secondsPattern() {
+        return new Object[][] {
+                {"A", "1", LocalTime.ofNanoOfDay(1_000_000)},
+                {"A", "100000", LocalTime.ofSecondOfDay(100)},
+                {"AA", "01", LocalTime.ofNanoOfDay(1_000_000)},
+                {"AA", "100000", LocalTime.ofSecondOfDay(100)},
+                {"AAAAAA", "100000", LocalTime.ofSecondOfDay(100)},
+                {"HHmmssn", "0000001", LocalTime.ofNanoOfDay(1)},
+                {"HHmmssn", "000000111", LocalTime.ofNanoOfDay(111)},
+                {"HHmmssnn", "00000001", LocalTime.ofNanoOfDay(1)},
+                {"HHmmssnn", "0000001111", LocalTime.ofNanoOfDay(1111)},
+                {"HHmmssnnnnnn", "000000111111", LocalTime.ofNanoOfDay(111_111)},
+                {"N", "1", LocalTime.ofNanoOfDay(1)},
+                {"N", "100000", LocalTime.ofNanoOfDay(100_000)},
+                {"NN", "01", LocalTime.ofNanoOfDay(1)},
+                {"NN", "100000", LocalTime.ofNanoOfDay(100_000)},
+                {"NNNNNN", "100000", LocalTime.ofNanoOfDay(100_000)},
+        };
+    }
+
+    @Test(dataProvider="secondsPattern")
+    public void test_secondsPattern(String pattern, String input, LocalTime expected) throws Exception {
+        DateTimeFormatter df = new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
+        assertEquals(LocalTime.parse(input, df), expected);
+    }
+
+    @DataProvider(name="secondsValues")
+    Object[][] data_secondsValues() {
+        return new Object[][] {
+                {"A", 1, "1000"},
+                {"n", 1, "0"},
+                {"N", 1, "1000000000"},
+        };
+    }
+
+    @Test(dataProvider="secondsValues")
+    public void test_secondsValues(String pattern, int seconds , String expected) throws Exception {
+        DateTimeFormatter df = new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
+        assertEquals(LocalTime.ofSecondOfDay(seconds).format(df), expected);
+    }
+
+    @Test(expectedExceptions = DateTimeParseException.class)
+    public void test_secondsPatternInvalidAdacentValueParsingPattern() {
+        // patterns A*, N*, n* will not take part in adjacent value parsing
+        DateTimeFormatter.ofPattern("yyyyAA").parse("201610");
+    }
 
     //-----------------------------------------------------------------------
     @Test
--- a/jdk/test/java/time/test/java/time/format/TestDateTimeFormatterBuilder.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/time/test/java/time/format/TestDateTimeFormatterBuilder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, 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
@@ -684,7 +684,7 @@
             {"LLLLL", "Text(MonthOfYear,NARROW_STANDALONE)"},
 
             {"D", "Value(DayOfYear)"},
-            {"DD", "Value(DayOfYear,2)"},
+            {"DD", "Value(DayOfYear,2,3,NOT_NEGATIVE)"},
             {"DDD", "Value(DayOfYear,3)"},
 
             {"d", "Value(DayOfMonth)"},
@@ -746,17 +746,17 @@
             {"SSS", "Fraction(NanoOfSecond,3,3)"},
             {"SSSSSSSSS", "Fraction(NanoOfSecond,9,9)"},
 
-            {"A", "Value(MilliOfDay)"},
-            {"AA", "Value(MilliOfDay,2)"},
-            {"AAA", "Value(MilliOfDay,3)"},
+            {"A", "Value(MilliOfDay,1,19,NOT_NEGATIVE)"},
+            {"AA", "Value(MilliOfDay,2,19,NOT_NEGATIVE)"},
+            {"AAA", "Value(MilliOfDay,3,19,NOT_NEGATIVE)"},
 
-            {"n", "Value(NanoOfSecond)"},
-            {"nn", "Value(NanoOfSecond,2)"},
-            {"nnn", "Value(NanoOfSecond,3)"},
+            {"n", "Value(NanoOfSecond,1,19,NOT_NEGATIVE)"},
+            {"nn", "Value(NanoOfSecond,2,19,NOT_NEGATIVE)"},
+            {"nnn", "Value(NanoOfSecond,3,19,NOT_NEGATIVE)"},
 
-            {"N", "Value(NanoOfDay)"},
-            {"NN", "Value(NanoOfDay,2)"},
-            {"NNN", "Value(NanoOfDay,3)"},
+            {"N", "Value(NanoOfDay,1,19,NOT_NEGATIVE)"},
+            {"NN", "Value(NanoOfDay,2,19,NOT_NEGATIVE)"},
+            {"NNN", "Value(NanoOfDay,3,19,NOT_NEGATIVE)"},
 
             {"z", "ZoneText(SHORT)"},
             {"zz", "ZoneText(SHORT)"},
@@ -782,7 +782,7 @@
             {"xxxxx", "Offset(+HH:MM:ss,'+00:00')"},  // LDML
 
             {"ppH", "Pad(Value(HourOfDay),2)"},
-            {"pppDD", "Pad(Value(DayOfYear,2),3)"},
+            {"pppDD", "Pad(Value(DayOfYear,2,3,NOT_NEGATIVE),3)"},
 
             {"yyyy[-MM[-dd", "Value(YearOfEra,4,19,EXCEEDS_PAD)['-'Value(MonthOfYear,2)['-'Value(DayOfMonth,2)]]"},
             {"yyyy[-MM[-dd]]", "Value(YearOfEra,4,19,EXCEEDS_PAD)['-'Value(MonthOfYear,2)['-'Value(DayOfMonth,2)]]"},
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Currency/Bug8154295.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2016, 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 8154295
+ * @summary Check getNumericCodeAsString() method which returns numeric code as a 3 digit String.
+ */
+
+import java.util.Currency;
+
+public class Bug8154295 {
+
+    public static void main(String[] args) {
+
+        String numericCode = Currency.getInstance("AFA").getNumericCodeAsString();
+        if (!numericCode.equals("004")) { //should return "004" (a 3 digit string)
+           throw new RuntimeException("[Expected 004, "
+                + "found "+numericCode+" for AFA]");
+        }
+
+        numericCode = Currency.getInstance("AUD").getNumericCodeAsString();
+        if (!numericCode.equals("036")) { //should return "036" (a 3 digit string)
+            throw new RuntimeException("[Expected 036, "
+                + "found "+numericCode+" for AUD]");
+        }
+
+        numericCode = Currency.getInstance("USD").getNumericCodeAsString();
+        if (!numericCode.equals("840")) {// should return "840" (a 3 digit string)
+            throw new RuntimeException("[Expected 840, "
+                + "found "+numericCode+" for USD]");
+        }
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Map/EntrySetIterator.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2016, 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 8139233
+ * @summary ensure entry set's iterator doesn't have side effects on the entry set
+ * @run testng EntrySetIterator
+ */
+
+import java.util.*;
+import org.testng.annotations.Test;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertEquals;
+
+public class EntrySetIterator {
+    @Test
+    public void main() {
+        Map<String, String> map = Map.of("a", "1", "b", "2", "c", "3");
+        Set<Map.Entry<String, String>> entrySet = map.entrySet();
+        Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
+
+        assertTrue(iterator.hasNext());
+
+        // copying implicitly iterates an iterator
+        Set<Map.Entry<String, String>> copy1 = new HashSet<>(entrySet);
+        Set<Map.Entry<String, String>> copy2 = new HashSet<>(entrySet);
+
+        assertEquals(copy2, copy1);
+        assertTrue(iterator.hasNext());
+    }
+}
--- a/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh	Wed Jul 05 21:40:37 2017 +0200
@@ -68,7 +68,7 @@
 ${TESTJAVA}/bin/jar xf ${TESTSRC}/awtres.jar
 
 echo 
-${TESTJAVA}/bin/java ${TESTVMOPTS} -Xpatch:${PATCHDIR} \
+${TESTJAVA}/bin/java ${TESTVMOPTS} -Xpatch:java.desktop=${PATCHDIR}/java.desktop \
      -cp ${TESTCLASSES} Bug6299235Test
 
 if [ $? -ne 0 ]
--- a/jdk/test/java/util/jar/JarFile/MultiReleaseJarHttpProperties.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/java/util/jar/JarFile/MultiReleaseJarHttpProperties.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,7 +26,7 @@
  * @bug 8132734
  * @summary Test the System properties for JarFile that support multi-release jar files
  * @library /lib/testlibrary/java/util/jar
- * @build Compiler JarBuilder CreateMultiReleaseTestJars
+ * @build Compiler JarBuilder CreateMultiReleaseTestJars SimpleHttpServer
  * @run testng MultiReleaseJarHttpProperties
  * @run testng/othervm -Djdk.util.jar.version=0 MultiReleaseJarHttpProperties
  * @run testng/othervm -Djdk.util.jar.version=8 MultiReleaseJarHttpProperties
@@ -43,8 +43,6 @@
  * @run testng/othervm -Djdk.util.jar.enableMultiRelease=force MultiReleaseJarHttpProperties
  */
 
-import com.sun.net.httpserver.*;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -73,7 +71,7 @@
     @Override
     protected void initializeClassLoader() throws Exception {
         URL[] urls = new URL[]{
-                new URL("http://localhost:" + server.getPort() + "/multi-release-jar")
+                new URL("http://localhost:" + server.getPort() + "/multi-release.jar")
         };
         cldr = new URLClassLoader(urls);
         // load any class, Main is convenient and in the root entries
@@ -112,45 +110,3 @@
         getResource(rootClass, resource);
     }
 }
-
-/**
- * Extremely simple server that only performs one task.  The server listens for
- * requests on the ephemeral port.  If it sees a request that begins with
- * "/multi-release-jar", it consumes the request and returns a stream of bytes
- * representing the jar file multi-release.jar found in "userdir".
- */
-class SimpleHttpServer {
-    private static final String userdir = System.getProperty("user.dir", ".");
-    private static final Path multirelease = Paths.get(userdir, "multi-release.jar");
-
-    private final HttpServer server;
-
-    public SimpleHttpServer() throws IOException {
-        server = HttpServer.create();
-    }
-
-    public void start() throws IOException {
-        server.bind(new InetSocketAddress(0), 0);
-        server.createContext("/multi-release-jar", t -> {
-            try (InputStream is = t.getRequestBody()) {
-                is.readAllBytes();  // probably not necessary to consume request
-                byte[] bytes = Files.readAllBytes(multirelease);
-                t.sendResponseHeaders(200, bytes.length);
-                try (OutputStream os = t.getResponseBody()) {
-                    os.write(bytes);
-                }
-            }
-        });
-        server.setExecutor(null); // creates a default executor
-        server.start();
-    }
-
-    public void stop() {
-        server.stop(0);
-    }
-
-    int getPort() {
-        return server.getAddress().getPort();
-    }
-}
-
--- a/jdk/test/javax/crypto/Cipher/CipherStreamClose.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/crypto/Cipher/CipherStreamClose.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,6 +27,8 @@
  * @summary Make sure Cipher IO streams doesn't call extra doFinal if close()
  * is called multiple times.  Additionally, verify the input and output streams
  * match with encryption and decryption with non-stream crypto.
+ * @compile -addmods java.xml.bind CipherStreamClose.java
+ * @run main/othervm -addmods java.xml.bind CipherStreamClose
  */
 
 import java.io.*;
--- a/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,8 +27,10 @@
  * @summary test RMI-IIOP call with ConcurrentHashMap as an argument
  * @library /lib/testlibrary
  * @build jdk.testlibrary.*
- * @build Test HelloInterface HelloServer HelloClient HelloImpl _HelloImpl_Tie _HelloInterface_Stub ConcurrentHashMapTest
- * @run main/othervm -Djava.naming.provider.url=iiop://localhost:1050 -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory  ConcurrentHashMapTest
+ * @compile -addmods java.corba Test.java HelloInterface.java HelloServer.java HelloClient.java
+ *    HelloImpl.java _HelloImpl_Tie.java _HelloInterface_Stub.java ConcurrentHashMapTest.java
+ * @run main/othervm -addmods java.corba -Djava.naming.provider.url=iiop://localhost:1050
+ *    -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory ConcurrentHashMapTest
  * @key intermittent
  */
 
@@ -101,6 +103,8 @@
         // -Djava.naming.provider.url=iiop://localhost:1050 HelloServer
         List<String> commands = new ArrayList<>();
         commands.add(ConcurrentHashMapTest.JAVA);
+        commands.add("-addmods");
+        commands.add("java.corba");
         commands.add("-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory");
         commands.add("-Djava.naming.provider.url=iiop://localhost:1050");
         commands.add("-cp");
--- a/jdk/test/javax/smartcardio/CommandAPDUTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/smartcardio/CommandAPDUTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,7 +26,8 @@
  * @bug 8049021
  * @summary Test different constructors for CommandAPDU and check CLA,INS,NC,NE,
  * P1,and P2
- * @run testng CommandAPDUTest
+ * @compile -addmods java.smartcardio CommandAPDUTest.java
+ * @run testng/othervm -addmods java.smartcardio CommandAPDUTest
  */
 import java.nio.ByteBuffer;
 import javax.smartcardio.CommandAPDU;
--- a/jdk/test/javax/smartcardio/HistoricalBytes.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/smartcardio/HistoricalBytes.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,7 +26,9 @@
  * @bug 6445367
  * @summary Verify that ATR.getHistoricalBytes() works
  * @author Andreas Sterbenz
-**/
+ * @compile -addmods java.smartcardio HistoricalBytes.java
+ * @run main/othervm -addmods java.smartcardio HistoricalBytes
+ */
 
 import java.util.Arrays;
 
--- a/jdk/test/javax/smartcardio/ResponseAPDUTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/smartcardio/ResponseAPDUTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,8 @@
  * @test
  * @bug 8049021
  * @summary Construct ResponseAPDU from byte array and check NR< SW, SW1 and SW2
- * @run testng ResponseAPDUTest
+ * @compile -addmods java.smartcardio ResponseAPDUTest.java
+ * @run testng/othervm -addmods java.smartcardio ResponseAPDUTest
  */
 import javax.smartcardio.ResponseAPDU;
 import static org.testng.Assert.*;
--- a/jdk/test/javax/smartcardio/Serialize.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/smartcardio/Serialize.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,6 +26,8 @@
  * @bug 6445367
  * @summary make sure serialization works
  * @author Andreas Sterbenz
+ * @compile -addmods java.smartcardio Serialize.java
+ * @run main/othervm -addmods java.smartcardio Serialize
  */
 
 import java.io.*;
--- a/jdk/test/javax/smartcardio/TerminalFactorySpiTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/smartcardio/TerminalFactorySpiTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,8 @@
  * @test
  * @bug 8049021
  * @summary Test if we can write new provider for smart card
- * @run main/othervm/policy=policy TerminalFactorySpiTest
+ * @compile -addmods java.smartcardio TerminalFactorySpiTest.java
+ * @run main/othervm/policy=policy -addmods java.smartcardio TerminalFactorySpiTest
  */
 import java.security.Provider;
 import java.security.Security;
--- a/jdk/test/javax/smartcardio/TestCardPermission.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/smartcardio/TestCardPermission.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,6 +26,8 @@
  * @bug 6293767
  * @summary Test for the CardPermission class
  * @author Andreas Sterbenz
+ * @compile -addmods java.smartcardio TestCardPermission.java
+ * @run main/othervm -addmods java.smartcardio TestCardPermission
  */
 
 import javax.smartcardio.*;
--- a/jdk/test/javax/smartcardio/TestCommandAPDU.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/smartcardio/TestCommandAPDU.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,6 +27,8 @@
  * @summary Test for the CommandAPDU class
  * @author Andreas Sterbenz
  * @key randomness
+ * @compile -addmods java.smartcardio TestCommandAPDU.java
+ * @run main/othervm -addmods java.smartcardio TestCommandAPDU
  */
 
 import java.util.*;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/transaction/testng/Driver.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2016, 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
+ * @compile -addmods java.transaction
+ *   test/transaction/InvalidTransactionExceptionTests.java
+ *   test/transaction/TransactionRequiredExceptionTests.java
+ *   test/transaction/TransactionRolledbackExceptionTests.java
+ *   test/transaction/XAExceptionTests.java
+ *   util/SerializedTransactionExceptions.java
+ * @run testng/othervm -addmods java.transaction test.transaction.InvalidTransactionExceptionTests
+ * @run testng/othervm -addmods java.transaction test.transaction.TransactionRequiredExceptionTests
+ * @run testng/othervm -addmods java.transaction test.transaction.TransactionRolledbackExceptionTests
+ * @run testng/othervm -addmods java.transaction util.SerializedTransactionExceptions
+ */
--- a/jdk/test/javax/transaction/testng/TEST.properties	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-# JDBC unit tests uses TestNG
-TestNG.dirs= .
-othervm.dirs= .
-
--- a/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,6 +26,7 @@
  * @bug 8032884
  * @summary Globalbindings optionalProperty="primitive" does not work when minOccurs=0
  * @run shell compile-schema.sh
+ * @compile -addmods java.xml.bind XjcOptionalPropertyTest.java
  * @run main/othervm XjcOptionalPropertyTest
  */
 
--- a/jdk/test/javax/xml/jaxp/common/8035437/run.sh	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/xml/jaxp/common/8035437/run.sh	Wed Jul 05 21:40:37 2017 +0200
@@ -34,12 +34,12 @@
    -d compile/java.xml -Xmodule:java.xml $TESTSRC/Document.java $TESTSRC/Node.java || exit 1
 
 $COMPILEJAVA/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \
-   -d exec/java.xml -Xpatch:compile -Xmodule:java.xml $TESTSRC/DocumentImpl.java || exit 2
+   -d exec/java.xml -Xpatch:java.xml=compile/java.xml -Xmodule:java.xml $TESTSRC/DocumentImpl.java || exit 2
 
 $COMPILEJAVA/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \
    $TESTSRC/AbstractMethodErrorTest.java -d exec || exit 3
 
-$TESTJAVA/bin/java ${TESTVMOPTS} -Xpatch:exec -cp exec AbstractMethodErrorTest || exit 4
+$TESTJAVA/bin/java ${TESTVMOPTS} -Xpatch:java.xml=exec -cp exec AbstractMethodErrorTest || exit 4
 
 exit 0
 
--- a/jdk/test/javax/xml/soap/XmlTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/xml/soap/XmlTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -38,6 +38,8 @@
 
 /*
  * @test
+ * @compile -addmods java.xml.ws XmlTest.java
+ * @run main/othervm -addmods java.xml.ws XmlTest
  * @summary tests JAF DataHandler can be instantiated; test serialize and
  *   deserialize SOAP message containing xml attachment
  */
--- a/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -49,29 +49,29 @@
  * run main/othervm SAAJFactoryTest saaj.factory.Valid -
  *      scenario14 javax.xml.soap.MessageFactory=saaj.factory.Valid saaj.factory.Valid2 -
  *
- * @build saaj.factory.*
+ * @compile -addmods java.xml.ws saaj/factory/Invalid.java saaj/factory/Valid.java
+ *     saaj/factory/Valid2.java saaj/factory/Valid3.java SAAJFactoryTest.java
  *
- * @run main/othervm SAAJFactoryTest com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl -
- *      scenario2 - -
- * @run main/othervm -Djavax.xml.soap.MessageFactory=saaj.factory.Valid SAAJFactoryTest saaj.factory.Valid -
- *      scenario5 - -
- * @run main/othervm -Djavax.xml.soap.MessageFactory=saaj.factory.NonExisting SAAJFactoryTest
- *      - javax.xml.soap.SOAPException
- *      scenario6 - -
- * @run main/othervm -Djavax.xml.soap.MessageFactory=saaj.factory.Invalid SAAJFactoryTest - javax.xml.soap.SOAPException
- *      scenario7 - -
- * @run main/othervm SAAJFactoryTest saaj.factory.Valid -
- *      scenario8 - saaj.factory.Valid
- * @run main/othervm SAAJFactoryTest saaj.factory.Valid -
- *      scenario9 - saaj.factory.Valid
- * @run main/othervm SAAJFactoryTest - javax.xml.soap.SOAPException
- *      scenario10 - saaj.factory.NonExisting
- * @run main/othervm SAAJFactoryTest - javax.xml.soap.SOAPException
- *      scenario11 - saaj.factory.Invalid
- * @run main/othervm SAAJFactoryTest com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl -
- *      scenario12 - -
- * @run main/othervm SAAJFactoryTest saaj.factory.Valid -
- *      scenario15 - saaj.factory.Valid
+ * @run main/othervm -addmods java.xml.ws
+ *      SAAJFactoryTest com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl - scenario2 - -
+ * @run main/othervm -addmods java.xml.ws -Djavax.xml.soap.MessageFactory=saaj.factory.Valid
+ *      SAAJFactoryTest saaj.factory.Valid - scenario5 - -
+ * @run main/othervm -addmods java.xml.ws -Djavax.xml.soap.MessageFactory=saaj.factory.NonExisting
+ *      SAAJFactoryTest - javax.xml.soap.SOAPException scenario6 - -
+ * @run main/othervm -addmods java.xml.ws -Djavax.xml.soap.MessageFactory=saaj.factory.Invalid
+ *      SAAJFactoryTest - javax.xml.soap.SOAPException scenario7 - -
+ * @run main/othervm  -addmods java.xml.ws
+ *      SAAJFactoryTest saaj.factory.Valid - scenario8 - saaj.factory.Valid
+ * @run main/othervm -addmods java.xml.ws
+ *      SAAJFactoryTest saaj.factory.Valid - scenario9 - saaj.factory.Valid
+ * @run main/othervm -addmods java.xml.ws
+ *      SAAJFactoryTest - javax.xml.soap.SOAPException scenario10 - saaj.factory.NonExisting
+ * @run main/othervm -addmods java.xml.ws
+ *      SAAJFactoryTest - javax.xml.soap.SOAPException scenario11 - saaj.factory.Invalid scenario11 - saaj.factory.Invalid
+ * @run main/othervm  -addmods java.xml.ws
+ *      SAAJFactoryTest com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl - scenario12 - -
+ * @run main/othervm -addmods java.xml.ws
+ *      SAAJFactoryTest saaj.factory.Valid - scenario15 - saaj.factory.Valid
  */
 public class SAAJFactoryTest {
 
--- a/jdk/test/javax/xml/ws/8043129/MailTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/xml/ws/8043129/MailTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,8 +27,8 @@
  * @summary JAF initialisation in SAAJ clashing with the one in javax.mail
  * @author mkos
  * @library javax.mail.jar
- * @build MailTest
- * @run main MailTest
+ * @compile -addmods java.xml.ws MailTest.java
+ * @run main/othervm -addmods java.xml.ws MailTest
  */
 
 import javax.activation.CommandMap;
--- a/jdk/test/javax/xml/ws/clientjar/TestWsImport.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/xml/ws/clientjar/TestWsImport.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,8 @@
  * @test
  * @bug 8016271 8026405
  * @summary wsimport -clientjar does not create portable jar on windows due to hardcoded '\'
- * @run main/othervm TestWsImport
+ * @compile -addmods java.xml.ws TestWsImport.java
+ * @run main/othervm -addmods java.xml.ws TestWsImport
  */
 
 import javax.xml.namespace.QName;
--- a/jdk/test/javax/xml/ws/publish/WSTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/xml/ws/publish/WSTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,8 @@
  * @test
  * @bug 8146086
  * @summary Publishing two webservices on same port fails with "java.net.BindException: Address already in use"
- * @run main/othervm WSTest
+ * @compile -addmods java.xml.ws WSTest.java
+ * @run main/othervm -addmods java.xml.ws WSTest
  */
 import javax.jws.WebMethod;
 import javax.jws.WebService;
--- a/jdk/test/javax/xml/ws/xsanymixed/Test.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/javax/xml/ws/xsanymixed/Test.java	Wed Jul 05 21:40:37 2017 +0200
@@ -27,7 +27,8 @@
  * @summary the content of xs:any content:mixed should remain as is,
  *          no white space changes and no changes to namespace prefixes
  * @run shell compile-wsdl.sh
- * @run main/othervm Test
+ * @compile -addmods java.xml.ws Test.java
+ * @run main/othervm -addmods java.xml.ws Test
  */
 
 import com.sun.net.httpserver.HttpServer;
--- a/jdk/test/jdk/nio/zipfs/Basic.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/jdk/nio/zipfs/Basic.java	Wed Jul 05 21:40:37 2017 +0200
@@ -42,7 +42,7 @@
 
 /**
  * @test
- * @bug 8038500 8040059
+ * @bug 8038500 8040059 8150366 8150496
  * @summary Basic test for zip provider
  *
  * @run main Basic
@@ -155,7 +155,8 @@
             indent();
             System.out.print(file.getFileName());
             if (attrs.isRegularFile())
-                System.out.format(" (%d)", attrs.size());
+                System.out.format("%n%s%n", attrs);
+
             System.out.println();
             return FileVisitResult.CONTINUE;
         }
--- a/jdk/test/jdk/nio/zipfs/PathOps.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/jdk/nio/zipfs/PathOps.java	Wed Jul 05 21:40:37 2017 +0200
@@ -47,15 +47,15 @@
     private Path path;
     private Exception exc;
 
-    private PathOps(String s) {
+    private PathOps(String first, String... more) {
         out.println();
-        input = s;
+        input = first;
         try {
-            path = fs.getPath(s);
-            out.format("%s -> %s", s, path);
+            path = fs.getPath(first, more);
+            out.format("%s -> %s", first, path);
         } catch (Exception x) {
             exc = x;
-            out.format("%s -> %s", s, x);
+            out.format("%s -> %s", first, x);
         }
         out.println();
     }
@@ -179,6 +179,13 @@
         return this;
     }
 
+    PathOps resolveSibling(String other, String expected) {
+        out.format("test resolveSibling %s\n", other);
+        checkPath();
+        check(path.resolveSibling(other), expected);
+        return this;
+    }
+
     PathOps relativize(String other, String expected) {
         out.format("test relativize %s\n", other);
         checkPath();
@@ -224,6 +231,10 @@
         return new PathOps(s);
     }
 
+    static PathOps test(String first, String... more) {
+        return new PathOps(first, more);
+    }
+
     // -- PathOpss --
 
     static void header(String s) {
@@ -235,6 +246,26 @@
     static void doPathOpTests() {
         header("Path operations");
 
+        // construction
+        test("/")
+            .string("/");
+        test("/", "")
+            .string("/");
+        test("/", "foo")
+            .string("/foo");
+        test("/", "/foo")
+            .string("/foo");
+        test("/", "foo/")
+            .string("/foo");
+        test("foo", "bar", "gus")
+            .string("foo/bar/gus");
+        test("")
+            .string("");
+        test("", "/")
+            .string("/");
+        test("", "foo", "", "bar", "", "/gus")
+            .string("foo/bar/gus");
+
         // all components
         test("/a/b/c")
             .root("/")
@@ -323,7 +354,6 @@
             .ends("foo/bar/")
             .ends("foo/bar");
 
-
         // elements
         test("a/b/c")
             .element(0,"a")
@@ -343,16 +373,57 @@
         // resolve
         test("/tmp")
             .resolve("foo", "/tmp/foo")
-            .resolve("/foo", "/foo");
+            .resolve("/foo", "/foo")
+            .resolve("", "/tmp");
         test("tmp")
             .resolve("foo", "tmp/foo")
+            .resolve("/foo", "/foo")
+            .resolve("", "tmp");
+        test("")
+            .resolve("", "")
+            .resolve("foo", "foo")
             .resolve("/foo", "/foo");
 
+        // resolveSibling
+        test("foo")
+            .resolveSibling("bar", "bar")
+            .resolveSibling("/bar", "/bar")
+            .resolveSibling("", "");
+        test("foo/bar")
+            .resolveSibling("gus", "foo/gus")
+            .resolveSibling("/gus", "/gus")
+            .resolveSibling("", "foo");
+        test("/foo")
+            .resolveSibling("gus", "/gus")
+            .resolveSibling("/gus", "/gus")
+            .resolveSibling("", "/");
+        test("/foo/bar")
+            .resolveSibling("gus", "/foo/gus")
+            .resolveSibling("/gus", "/gus")
+            .resolveSibling("", "/foo");
+        test("")
+            .resolveSibling("foo", "foo")
+            .resolveSibling("/foo", "/foo")
+            .resolve("", "");
+
         // relativize
         test("/a/b/c")
             .relativize("/a/b/c", "")
             .relativize("/a/b/c/d/e", "d/e")
-            .relativize("/a/x", "../../x");
+            .relativize("/a/x", "../../x")
+            .relativize("/x", "../../../x");
+        test("a/b/c")
+            .relativize("a/b/c/d", "d")
+            .relativize("a/x", "../../x")
+            .relativize("x", "../../../x")
+            .relativize("", "../../..");
+        test("")
+            .relativize("a", "a")
+            .relativize("a/b/c", "a/b/c")
+            .relativize("", "");
+        test("/")
+            .relativize("/a", "a")
+            .relativize("/a/c", "a/c");
 
         // normalize
         test("/")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/lib/testlibrary/java/util/jar/SimpleHttpServer.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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 com.sun.net.httpserver.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+/**
+ * Extremely simple server that only performs one task.  The server listens for
+ * requests on the ephemeral port.  If it sees a request that begins with
+ * "/multi-release.jar", it consumes the request and returns a stream of bytes
+ * representing the jar file multi-release.jar found in "userdir".
+ */
+class SimpleHttpServer {
+    private static final String userdir = System.getProperty("user.dir", ".");
+    private static final Path multirelease = Paths.get(userdir, "multi-release.jar");
+
+    private final HttpServer server;
+
+    public SimpleHttpServer() throws IOException {
+        server = HttpServer.create();
+    }
+
+    public void start() throws IOException {
+        server.bind(new InetSocketAddress(0), 0);
+        server.createContext("/multi-release.jar", t -> {
+            try (InputStream is = t.getRequestBody()) {
+                is.readAllBytes();  // probably not necessary to consume request
+                byte[] bytes = Files.readAllBytes(multirelease);
+                t.sendResponseHeaders(200, bytes.length);
+                try (OutputStream os = t.getResponseBody()) {
+                    os.write(bytes);
+                }
+            }
+        });
+        server.setExecutor(null); // creates a default executor
+        server.start();
+    }
+
+    public void stop() {
+        server.stop(0);
+    }
+
+    int getPort() {
+        return server.getAddress().getPort();
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/java2d/loops/ConvertToByteIndexedTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2016, 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     7116979
+ * @summary Test verifies whether BufferedImage with primary colors are
+ *          stored properly when we draw into ByteIndexed BufferedImage.
+ * @run     main ConvertToByteIndexedTest
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.util.HashMap;
+
+public class ConvertToByteIndexedTest {
+    static final int[] SRC_TYPES = new int[] {
+        BufferedImage.TYPE_INT_RGB,
+        BufferedImage.TYPE_INT_ARGB,
+        BufferedImage.TYPE_INT_ARGB_PRE,
+        BufferedImage.TYPE_INT_BGR,
+        BufferedImage.TYPE_3BYTE_BGR,
+        BufferedImage.TYPE_4BYTE_ABGR,
+        BufferedImage.TYPE_4BYTE_ABGR_PRE,
+        BufferedImage.TYPE_USHORT_565_RGB,
+        BufferedImage.TYPE_USHORT_555_RGB,
+        BufferedImage.TYPE_BYTE_INDEXED};
+
+    static final String[] TYPE_NAME = new String[] {
+        "INT_RGB",
+        "INT_ARGB",
+        "INT_ARGB_PRE",
+        "INT_BGR",
+        "3BYTE_BGR",
+        "4BYTE_ABGR",
+        "4BYTE_ABGR_PRE",
+        "USHORT_565_RGB",
+        "USHORT_555_RGB",
+        "BYTE_INDEXED"};
+
+    static final Color[] COLORS = new Color[] {
+        //Color.WHITE,
+        Color.BLACK,
+        Color.RED,
+        Color.YELLOW,
+        Color.GREEN,
+        Color.MAGENTA,
+        Color.CYAN,
+        Color.BLUE};
+
+    static final HashMap<Integer,String> TYPE_TABLE =
+            new HashMap<Integer,String>();
+
+    static {
+        for (int i = 0; i < SRC_TYPES.length; i++) {
+            TYPE_TABLE.put(new Integer(SRC_TYPES[i]), TYPE_NAME[i]);
+        }
+    }
+
+    static int width = 50;
+    static int height = 50;
+
+    public static void ConvertToByteIndexed(Color color, int srcType) {
+        // setup source image and graphics for conversion.
+        BufferedImage srcImage = new BufferedImage(width, height, srcType);
+        Graphics2D srcG2D = srcImage.createGraphics();
+        srcG2D.setColor(color);
+        srcG2D.fillRect(0, 0, width, height);
+
+        // setup destination image and graphics for conversion.
+        int dstType = BufferedImage.TYPE_BYTE_INDEXED;
+        BufferedImage dstImage = new BufferedImage(width, height, dstType);
+        Graphics2D dstG2D = (Graphics2D)dstImage.getGraphics();
+        // draw source image into Byte Indexed destination
+        dstG2D.drawImage(srcImage, 0, 0, null);
+
+        // draw into ARGB image to verify individual pixel value.
+        BufferedImage argbImage = new BufferedImage(width, height,
+                BufferedImage.TYPE_INT_ARGB);
+        Graphics2D argbG2D = (Graphics2D)argbImage.getGraphics();
+        argbG2D.drawImage(dstImage, 0, 0, null);
+
+        for (int i = 0; i < width; i++) {
+            for (int j = 0; j < height; j++) {
+                if (color.getRGB() != argbImage.getRGB(i, j)) {
+                    throw new RuntimeException("Conversion from " +
+                            TYPE_TABLE.get(srcType) + " to BYTE_INDEXED is not"
+                            + " done properly for " + color);
+                }
+            }
+        }
+    }
+
+    public static void main(String args[]) {
+        for (int srcType : SRC_TYPES) {
+            for (Color color : COLORS) {
+                ConvertToByteIndexed(color, srcType);
+            }
+        }
+    }
+}
--- a/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,19 +26,25 @@
  * @bug 8132734
  * @summary Test that URL connections to multi-release jars can be runtime versioned
  * @library /lib/testlibrary/java/util/jar
- * @build Compiler JarBuilder CreateMultiReleaseTestJars
+ * @build Compiler JarBuilder CreateMultiReleaseTestJars SimpleHttpServer
  * @run testng MultiReleaseJarURLConnection
  */
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
 import java.net.JarURLConnection;
 import java.net.URL;
+import java.net.URLClassLoader;
 import java.net.URLConnection;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.jar.JarFile;
 
+import jdk.Version;
+
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -47,46 +53,78 @@
 
 public class MultiReleaseJarURLConnection {
     String userdir = System.getProperty("user.dir",".");
-    String file = userdir + "/signed-multi-release.jar";
+    String unversioned = userdir + "/unversioned.jar";
+    String unsigned = userdir + "/multi-release.jar";
+    String signed = userdir + "/signed-multi-release.jar";
+    SimpleHttpServer server;
 
     @BeforeClass
     public void initialize() throws Exception {
         CreateMultiReleaseTestJars creator = new CreateMultiReleaseTestJars();
         creator.compileEntries();
+        creator.buildUnversionedJar();
         creator.buildMultiReleaseJar();
         creator.buildSignedMultiReleaseJar();
+
+        server = new SimpleHttpServer();
+        server.start();
+
     }
 
     @AfterClass
     public void close() throws IOException {
-        Files.delete(Paths.get(userdir, "multi-release.jar"));
-        Files.delete(Paths.get(userdir, "signed-multi-release.jar"));
+        // Windows requires server to stop before file is deleted
+        if (server != null)
+            server.stop();
+        Files.delete(Paths.get(unversioned));
+        Files.delete(Paths.get(unsigned));
+        Files.delete(Paths.get(signed));
     }
 
     @DataProvider(name = "data")
     public Object[][] createData() {
         return new Object[][]{
-                {"unsigned file", userdir + "/multi-release.jar"},
-                {"signed file", userdir + "/signed-multi-release.jar"},
+                {"unversioned", unversioned},
+                {"unsigned", unsigned},
+                {"signed", signed}
         };
     }
 
     @Test(dataProvider = "data")
-    public void testRuntimeVersioning(String ignore, String file) throws Exception {
+    public void testRuntimeVersioning(String style, String file) throws Exception {
         String urlFile = "jar:file:" + file + "!/";
-        String urlEntry = urlFile + "version/Version.java";
+        String baseUrlEntry = urlFile + "version/Version.java";
+        String rtreturn = "return " + Version.current().major();
+
+        Assert.assertTrue(readAndCompare(new URL(baseUrlEntry), "return 8"));
+        // #runtime is "magic" for a multi-release jar, but not for unversioned jar
+        Assert.assertTrue(readAndCompare(new URL(baseUrlEntry + "#runtime"),
+                style.equals("unversioned") ? "return 8" : rtreturn));
+        // #fragment or any other fragment is not magic
+        Assert.assertTrue(readAndCompare(new URL(baseUrlEntry + "#fragment"), "return 8"));
+        // cached entities not affected
+        Assert.assertTrue(readAndCompare(new URL(baseUrlEntry), "return 8"));
 
-        Assert.assertTrue(readAndCompare(new URL(urlEntry), "return 8"));
-        // #runtime is "magic"
-        Assert.assertTrue(readAndCompare(new URL(urlEntry + "#runtime"), "return 9"));
-        // #fragment or any other fragment is not magic
-        Assert.assertTrue(readAndCompare(new URL(urlEntry + "#fragment"), "return 8"));
-        // cached entities not affected
-        Assert.assertTrue(readAndCompare(new URL(urlEntry), "return 8"));
+        // the following tests will not work with unversioned jars
+        if (style.equals("unversioned")) return;
+
+        // direct access to versioned entry
+        String versUrlEntry = urlFile + "META-INF/versions/" + Version.current().major()
+                + "/version/Version.java";
+        Assert.assertTrue(readAndCompare(new URL(versUrlEntry), rtreturn));
+        // adding any fragment does not change things
+        Assert.assertTrue(readAndCompare(new URL(versUrlEntry + "#runtime"), rtreturn));
+        Assert.assertTrue(readAndCompare(new URL(versUrlEntry + "#fragment"), rtreturn));
+
+        // it really doesn't change things
+        versUrlEntry = urlFile + "META-INF/versions/10/version/Version.java";
+        Assert.assertTrue(readAndCompare(new URL(versUrlEntry), "return 10"));
+        Assert.assertTrue(readAndCompare(new URL(versUrlEntry + "#runtime"), "return 10"));
+        Assert.assertTrue(readAndCompare(new URL(versUrlEntry + "#fragment"), "return 10"));
     }
 
     @Test(dataProvider = "data")
-    public void testCachedJars(String ignore, String file) throws Exception {
+    public void testCachedJars(String style, String file) throws Exception {
         String urlFile = "jar:file:" + file + "!/";
 
         URL rootUrl = new URL(urlFile);
@@ -98,7 +136,11 @@
         juc = (JarURLConnection)runtimeUrl.openConnection();
         JarFile runtimeJar = juc.getJarFile();
         JarFile.Release runtime = runtimeJar.getVersion();
-        Assert.assertNotEquals(root, runtime);
+        if (style.equals("unversioned")) {
+            Assert.assertEquals(root, runtime);
+        } else {
+            Assert.assertNotEquals(root, runtime);
+        }
 
         juc = (JarURLConnection)rootUrl.openConnection();
         JarFile jar = juc.getJarFile();
@@ -115,6 +157,63 @@
         jar.close(); // probably not needed
     }
 
+    @DataProvider(name = "resourcedata")
+    public Object[][] createResourceData() throws Exception {
+        return new Object[][]{
+                {"unversioned", Paths.get(unversioned).toUri().toURL()},
+                {"unsigned", Paths.get(unsigned).toUri().toURL()},
+                {"signed", Paths.get(signed).toUri().toURL()},
+                {"unversioned", new URL("file:" + unversioned)},
+                {"unsigned", new URL("file:" + unsigned)},
+                {"signed", new URL("file:" + signed)},
+                {"unversioned", new URL("jar:file:" + unversioned + "!/")},
+                {"unsigned", new URL("jar:file:" + unsigned + "!/")},
+                {"signed", new URL("jar:file:" + signed + "!/")},
+                // external jar received via http protocol
+                {"http", new URL("jar:http://localhost:" + server.getPort() + "/multi-release.jar!/")},
+                {"http", new URL("http://localhost:" + server.getPort() + "/multi-release.jar")},
+
+        };
+    }
+
+    @Test(dataProvider = "resourcedata")
+    public void testResources(String style, URL url) throws Throwable {
+        //System.out.println("  testing " + style + " url: " + url);
+        URL[] urls = {url};
+        URLClassLoader cldr = new URLClassLoader(urls);
+        Class<?> vcls = cldr.loadClass("version.Version");
+
+        // verify we are loading a runtime versioned class
+        MethodType mt = MethodType.methodType(int.class);
+        MethodHandle mh = MethodHandles.lookup().findVirtual(vcls, "getVersion", mt);
+        Assert.assertEquals((int)mh.invoke(vcls.newInstance()),
+                style.equals("unversioned") ? 8 : Version.current().major());
+
+        // now get a resource and verify that we don't have a fragment attached
+        URL vclsUrl = vcls.getResource("/version/Version.class");
+        String fragment = vclsUrl.getRef();
+        Assert.assertNull(fragment);
+
+        // and verify that the the url is a reified pointer to the runtime entry
+        String rep = vclsUrl.toString();
+        //System.out.println("    getResource(\"/version/Version.class\") returned: " + rep);
+        if (style.equals("http")) {
+            Assert.assertTrue(rep.startsWith("jar:http:"));
+        } else {
+            Assert.assertTrue(rep.startsWith("jar:file:"));
+        }
+        String suffix;
+        if (style.equals("unversioned")) {
+            suffix = ".jar!/version/Version.class";
+        } else {
+            suffix = ".jar!/META-INF/versions/" + Version.current().major()
+                    + "/version/Version.class";
+        }
+        Assert.assertTrue(rep.endsWith(suffix));
+        cldr.close();
+    }
+
+
     private boolean readAndCompare(URL url, String match) throws Exception {
         boolean result;
         // necessary to do it this way, instead of openStream(), so we can
--- a/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.java	Wed Jul 05 21:40:37 2017 +0200
@@ -26,7 +26,6 @@
 import java.security.*;
 import javax.crypto.*;
 import javax.crypto.spec.*;
-import javax.xml.bind.DatatypeConverter;
 
 public class SecretKeysBasic extends PKCS11Test {
 
@@ -131,8 +130,11 @@
         System.out.println(info + "> " + key);
         System.out.println("\tALGO=" + key.getAlgorithm());
         if (key.getFormat() != null) {
-            System.out.println("\t[" + key.getFormat() + "] VALUE=" +
-                    DatatypeConverter.printHexBinary(key.getEncoded()));
+            StringBuilder sb = new StringBuilder();
+            for (byte b : key.getEncoded()) {
+                sb.append(String.format("%02x", b & 0xff));
+            }
+            System.out.println("\t[" + key.getFormat() + "] VALUE=" + sb);
         } else {
             System.out.println("\tVALUE=n/a");
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/MessageDigest/SHA512.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2016, 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 jdk.testlibrary.Asserts;
+
+import java.security.MessageDigest;
+import java.util.Arrays;
+
+/**
+ * @test
+ * @bug 8051408
+ * @library /lib/testlibrary
+ * @summary testing SHA-512/224 and SHA-512/256.
+ */
+public class SHA512 {
+    public static void main(String[] args) throws Exception {
+
+        MessageDigest md;
+
+        // Test vectors obtained from
+        // http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA512_224.pdf
+        md = MessageDigest.getInstance("SHA-512/224");
+        Asserts.assertTrue(Arrays.equals(md.digest("abc".getBytes()),
+            xeh("4634270F 707B6A54 DAAE7530 460842E2 0E37ED26 5CEEE9A4 3E8924AA")));
+        Asserts.assertTrue(Arrays.equals(md.digest((
+                "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" +
+                "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu").getBytes()),
+            xeh("23FEC5BB 94D60B23 30819264 0B0C4533 35D66473 4FE40E72 68674AF9")));
+
+        // Test vectors obtained from
+        // http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA512_256.pdf
+        md = MessageDigest.getInstance("SHA-512/256");
+        Asserts.assertTrue(Arrays.equals(md.digest("abc".getBytes()),
+            xeh("53048E26 81941EF9 9B2E29B7 6B4C7DAB E4C2D0C6 34FC6D46 E0E2F131 07E7AF23")));
+        Asserts.assertTrue(Arrays.equals(md.digest((
+                "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" +
+                "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu").getBytes()),
+            xeh("3928E184 FB8690F8 40DA3988 121D31BE 65CB9D3E F83EE614 6FEAC861 E19B563A")));
+    }
+
+    static byte[] xeh(String in) {
+        in = in.replaceAll(" ", "");
+        int len = in.length() / 2;
+        byte[] out = new byte[len];
+        for (int i = 0; i < len; i++) {
+            out[i] = (byte)Integer.parseInt(in.substring(i * 2, i * 2 + 2), 16);
+        }
+        return out;
+    }
+}
--- a/jdk/test/sun/security/provider/PolicyFile/Modules.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/sun/security/provider/PolicyFile/Modules.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,9 @@
  * @test
  * @bug 8047771
  * @summary check permissions and principals from various modules
- * @run main/othervm/java.security.policy==modules.policy Modules
+ * @compile -addmods java.xml.ws,java.smartcardio Modules.java
+ * @run main/othervm/java.security.policy==modules.policy
+ *     -addmods java.xml.ws,java.smartcardio Modules
  */
 
 import java.security.AccessController;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/SecureRandom/AbstractDrbgSpec.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,310 @@
+/*
+ * Copyright (c) 2016, 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 8051408
+ * @modules java.base/sun.security.provider
+ * @summary check the AbstractDrbg API etc
+ */
+
+import java.security.*;
+import sun.security.provider.AbstractDrbg;
+import static java.security.DrbgParameters.Capability.*;
+
+/**
+ * This test makes sure the AbstractDrbg API works as specified. It also
+ * checks the SecureRandom API.
+ */
+public class AbstractDrbgSpec {
+
+    public static void main(String args[]) throws Exception {
+
+        // getInstance from a provider.
+
+        Provider p = new All("A", 0, "");
+        byte[] bytes = new byte[100];
+
+        // A non-DRBG
+        iae(() -> SecureRandom.getInstance("S1", null, p));
+        nsae(() -> SecureRandom.getInstance("S1",
+                new SecureRandomParameters() {}, p));
+
+        SecureRandom s1 = SecureRandom.getInstance("S1", p);
+        if (s1.getParameters() != null) {
+            throw new Exception();
+        }
+
+        iae(() -> s1.nextBytes(bytes, null));
+        uoe(() -> s1.nextBytes(bytes, new SecureRandomParameters() {}));
+        uoe(() -> s1.reseed());
+        iae(() -> s1.reseed(null));
+        uoe(() -> s1.reseed(new SecureRandomParameters() {}));
+
+        // A weak DRBG
+        iae(() -> SecureRandom.getInstance("S2", null, p));
+        nsae(() -> SecureRandom.getInstance("S2",
+                new SecureRandomParameters() {}, p));
+        nsae(() -> SecureRandom.getInstance("S2",
+                DrbgParameters.instantiation(256, NONE, null), p));
+        nsae(() -> SecureRandom.getInstance("S2",
+                DrbgParameters.instantiation(-1, PR_AND_RESEED, null), p));
+        nsae(() -> SecureRandom.getInstance("S2",
+                DrbgParameters.instantiation(-1, RESEED_ONLY, null), p));
+
+        SecureRandom s2 = SecureRandom.getInstance("S2",
+                DrbgParameters.instantiation(-1, NONE, null), p);
+        equals(s2, "S2,SQUEEZE,128,none");
+        equals(s2.getParameters(), "128,none,null");
+
+        npe(() -> s2.nextBytes(null));
+        iae(() -> s2.nextBytes(bytes, null));
+        iae(() -> s2.nextBytes(bytes, new SecureRandomParameters() {}));
+        uoe(() -> s2.reseed());
+        iae(() -> s2.reseed(null));
+
+        iae(() -> s2.nextBytes(bytes,
+                DrbgParameters.nextBytes(-1, false, new byte[101])));
+        s2.nextBytes(new byte[101],
+                DrbgParameters.nextBytes(-1, false, new byte[100]));
+        s2.nextBytes(bytes,
+                DrbgParameters.nextBytes(-1, false, new byte[100]));
+
+        // A strong DRBG
+        iae(() -> SecureRandom.getInstance("S3", null, p));
+        nsae(() -> SecureRandom.getInstance("S3",
+                new SecureRandomParameters() {}, p));
+        SecureRandom.getInstance("S3",
+                DrbgParameters.instantiation(192, PR_AND_RESEED, null), p);
+
+        SecureRandom s3 = SecureRandom.getInstance("S3", p);
+        equals(s3, "S3,SQUEEZE,128,reseed_only");
+        equals(s3.getParameters(), "128,reseed_only,null");
+
+        iae(() -> s3.nextBytes(bytes,
+                DrbgParameters.nextBytes(192, false, null)));
+        iae(() -> s3.nextBytes(bytes,
+                DrbgParameters.nextBytes(112, true, null)));
+        iae(() -> s3.reseed(new SecureRandomParameters() {}));
+
+        SecureRandom s32 = SecureRandom.getInstance(
+                "S3", DrbgParameters.instantiation(192, PR_AND_RESEED, null), p);
+        equals(s32, "S3,SQUEEZE,192,pr_and_reseed");
+        equals(s32.getParameters(), "192,pr_and_reseed,null");
+
+        s32.nextBytes(bytes, DrbgParameters.nextBytes(192, false, null));
+        s32.nextBytes(bytes, DrbgParameters.nextBytes(112, true, null));
+        s32.reseed();
+        s32.reseed(DrbgParameters.reseed(true, new byte[100]));
+
+        // getInstance from competitive providers.
+
+        Provider l = new Legacy("L", 0, "");
+        Provider w = new Weak("W", 0, "");
+        Provider s = new Strong("S", 0, "");
+
+        Security.addProvider(l);
+        Security.addProvider(w);
+        Security.addProvider(s);
+
+        SecureRandom s4;
+
+        try {
+            s4 = SecureRandom.getInstance("S");
+            if (s4.getProvider() != l) {
+                throw new Exception();
+            }
+
+            nsae(() -> SecureRandom.getInstance(
+                    "S", DrbgParameters.instantiation(256, NONE, null)));
+
+            s4 = SecureRandom.getInstance(
+                    "S", DrbgParameters.instantiation(192, NONE, null));
+            if (s4.getProvider() != s) {
+                throw new Exception();
+            }
+
+            s4 = SecureRandom.getInstance(
+                    "S", DrbgParameters.instantiation(128, PR_AND_RESEED, null));
+            if (s4.getProvider() != s) {
+                throw new Exception();
+            }
+
+            s4 = SecureRandom.getInstance(
+                    "S", DrbgParameters.instantiation(128, RESEED_ONLY, null));
+            if (s4.getProvider() != s) {
+                throw new Exception();
+            }
+
+            s4 = SecureRandom.getInstance(
+                    "S", DrbgParameters.instantiation(128, NONE, null));
+            if (s4.getProvider() != w) {
+                throw new Exception();
+            }
+        } finally {
+            Security.removeProvider("L");
+            Security.removeProvider("W");
+            Security.removeProvider("S");
+        }
+    }
+
+    public static class All extends Provider {
+        protected All(String name, double version, String info) {
+            super(name, version, info);
+            put("SecureRandom.S1", S1.class.getName());
+            put("SecureRandom.S2", S2.class.getName());
+            put("SecureRandom.S3", S3.class.getName());
+        }
+    }
+
+    // Providing S with no params support
+    public static class Legacy extends Provider {
+        protected Legacy(String name, double version, String info) {
+            super(name, version, info);
+            put("SecureRandom.S", S1.class.getName());
+        }
+    }
+
+    public static class Weak extends Provider {
+        protected Weak(String name, double version, String info) {
+            super(name, version, info);
+            put("SecureRandom.S", S2.class.getName());
+        }
+    }
+
+    public static class Strong extends Provider {
+        protected Strong(String name, double version, String info) {
+            super(name, version, info);
+            put("SecureRandom.S", S3.class.getName());
+        }
+    }
+
+    // This is not a DRBG.
+    public static class S1 extends SecureRandomSpi {
+        @Override
+        protected void engineSetSeed(byte[] seed) {
+        }
+
+        @Override
+        protected void engineNextBytes(byte[] bytes) {
+        }
+
+        @Override
+        protected byte[] engineGenerateSeed(int numBytes) {
+            return new byte[numBytes];
+        }
+    }
+
+    // This is a strong DRBG.
+    public static class S3 extends AbstractDrbg {
+
+        public S3(SecureRandomParameters params) {
+            supportPredictionResistance = true;
+            supportReseeding = true;
+            highestSupportedSecurityStrength = 192;
+            mechName = "S3";
+            algorithm = "SQUEEZE";
+            configure(params);
+        }
+        protected void chooseAlgorithmAndStrength() {
+            if (requestedInstantiationSecurityStrength < 0) {
+                securityStrength = DEFAULT_STRENGTH;
+            } else {
+                securityStrength = requestedInstantiationSecurityStrength;
+            }
+            minLength = securityStrength / 8;
+            maxAdditionalInputLength = maxPersonalizationStringLength = 100;
+        }
+
+        @Override
+        protected void initEngine() {
+
+        }
+
+        @Override
+        protected void instantiateAlgorithm(byte[] ei) {
+
+        }
+
+        @Override
+        protected void generateAlgorithm(byte[] result, byte[] additionalInput) {
+
+        }
+
+        @Override
+        protected void reseedAlgorithm(byte[] ei, byte[] additionalInput) {
+
+        }
+    }
+
+    // This is a weak DRBG. maximum strength is 128 and does
+    // not support prediction resistance or reseed.
+    public static class S2 extends S3 {
+        public S2(SecureRandomParameters params) {
+            super(null);
+            mechName = "S2";
+            highestSupportedSecurityStrength = 128;
+            supportPredictionResistance = false;
+            supportReseeding = false;
+            configure(params);
+        }
+    }
+
+    static void nsae(RunnableWithException r) throws Exception {
+        checkException(r, NoSuchAlgorithmException.class);
+    }
+
+    static void iae(RunnableWithException r) throws Exception {
+        checkException(r, IllegalArgumentException.class);
+    }
+
+    static void uoe(RunnableWithException r) throws Exception {
+        checkException(r, UnsupportedOperationException.class);
+    }
+
+    static void npe(RunnableWithException r) throws Exception {
+        checkException(r, NullPointerException.class);
+    }
+
+    interface RunnableWithException {
+        void run() throws Exception;
+    }
+
+    static void checkException(RunnableWithException r, Class ex)
+            throws Exception {
+        try {
+            r.run();
+        } catch (Exception e) {
+            if (ex.isAssignableFrom(e.getClass())) {
+                return;
+            }
+            throw e;
+        }
+        throw new Exception("No exception thrown");
+    }
+
+    static void equals(Object o, String s) throws Exception {
+        if (!o.toString().equals(s)) {
+            throw new Exception(o.toString() + " is not " + s);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/SecureRandom/AutoReseed.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016, 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.security.SecureRandom;
+import java.security.Security;
+
+/**
+ * @test
+ * @bug 8051408
+ * @summary make sure nextBytes etc can be called before setSeed
+ */
+public class AutoReseed {
+
+    public static void main(String[] args) throws Exception {
+        SecureRandom sr;
+        String old = Security.getProperty("securerandom.drbg.config");
+        try {
+            for (String mech :
+                    new String[]{"Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) {
+                System.out.println("Testing " + mech + "...");
+                Security.setProperty("securerandom.drbg.config", mech);
+
+                // Check auto reseed works
+                sr = SecureRandom.getInstance("DRBG");
+                sr.nextInt();
+                sr = SecureRandom.getInstance("DRBG");
+                sr.reseed();
+                sr = SecureRandom.getInstance("DRBG");
+                sr.generateSeed(10);
+            }
+        } finally {
+            Security.setProperty("securerandom.drbg.config", old);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/SecureRandom/CommonSeeder.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider.AbstractDrbg;
+import sun.security.provider.EntropySource;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.security.DrbgParameters;
+import java.security.SecureRandom;
+import java.security.Security;
+
+/**
+ * @test
+ * @bug 8051408
+ * @modules java.base/sun.security.provider
+ * @run main/othervm CommonSeeder
+ * @summary check entropy reading of DRBGs
+ */
+public class CommonSeeder {
+
+    static class MyES implements EntropySource {
+        int count = 100;
+        int lastCount = 100;
+
+        @Override
+        public byte[] getEntropy(int minEntropy, int minLength,
+                                 int maxLength, boolean pr) {
+            count--;
+            return new byte[minLength];
+        }
+
+        /**
+         * Confirms genEntropy() has been called {@code less} times
+         * since last check.
+         */
+        public void checkUsage(int less) throws Exception {
+            if (lastCount != count + less) {
+                throw new Exception(String.format(
+                        "lastCount = %d, count = %d, less = %d",
+                        lastCount, count, less));
+            }
+            lastCount = count;
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        byte[] result = new byte[10];
+        MyES es = new MyES();
+
+        // Set es as the default entropy source, overriding SeedGenerator.
+        setDefaultSeeder(es);
+
+        // Nothing happened yet
+        es.checkUsage(0);
+
+        SecureRandom sr;
+        sr = SecureRandom.getInstance("DRBG");
+
+        // No entropy reading if only getInstance
+        es.checkUsage(0);
+
+        // Entropy is read at 1st nextBytes of the 1st DRBG
+        sr.nextInt();
+        es.checkUsage(1);
+
+        for (String mech : new String[]{"Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"}) {
+            System.out.println("Testing " + mech + "...");
+
+            // DRBG with pr_false will never read entropy again no matter
+            // if nextBytes or reseed is called.
+
+            Security.setProperty("securerandom.drbg.config", mech);
+            sr = SecureRandom.getInstance("DRBG");
+            sr.nextInt();
+            sr.reseed();
+            es.checkUsage(0);
+
+            // DRBG with pr_true always read from default entropy, and
+            // its nextBytes always reseed itself
+
+            Security.setProperty("securerandom.drbg.config",
+                    mech + ",pr_and_reseed");
+            sr = SecureRandom.getInstance("DRBG");
+
+            sr.nextInt();
+            es.checkUsage(2); // one instantiate, one reseed
+            sr.nextInt();
+            es.checkUsage(1); // one reseed in nextBytes
+            sr.reseed();
+            es.checkUsage(1); // one reseed
+            sr.nextBytes(result, DrbgParameters.nextBytes(-1, false, null));
+            es.checkUsage(0); // pr_false for this call
+            sr.nextBytes(result, DrbgParameters.nextBytes(-1, true, null));
+            es.checkUsage(1); // pr_true for this call
+            sr.reseed(DrbgParameters.reseed(true, null));
+            es.checkUsage(1); // reseed from es
+            sr.reseed(DrbgParameters.reseed(false, null));
+            es.checkUsage(0); // reseed from AbstractDrbg.SeederHolder.seeder
+        }
+    }
+
+    static void setDefaultSeeder(EntropySource es) throws Exception {
+        Field f = AbstractDrbg.class.getDeclaredField("defaultES");
+        f.setAccessible(true);  // no more private
+        Field f2 = Field.class.getDeclaredField("modifiers");
+        f2.setAccessible(true);
+        f2.setInt(f, f2.getInt(f) - Modifier.FINAL);    // no more final
+        f.set(null, es);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/SecureRandom/DRBGAlg.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider.MoreDrbgParameters;
+
+import java.security.DrbgParameters;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.SecureRandomParameters;
+import java.security.Security;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static java.security.DrbgParameters.Capability.*;
+
+/**
+ * @test
+ * @bug 8051408
+ * @modules java.base/sun.security.provider
+ * @summary make sure DRBG alg can be defined and instantiated freely
+ */
+public class DRBGAlg {
+
+    public static void main(String[] args) throws Exception {
+
+        check(null, "Hash_DRBG", "SHA-256", "reseed_only", ",128");
+        check("", "Hash_DRBG", "SHA-256", "reseed_only", ",128");
+        check("sha-1", "Hash_DRBG", "SHA-1", "reseed_only", ",128");
+        check("sha-256", "Hash_DRBG", "SHA-256", "reseed_only", ",128");
+        check("SHA-3");
+        check("hash_drbg", "Hash_DRBG", "SHA-256", "reseed_only", ",128");
+        check("hmac_drbg", "HMAC_DRBG", "SHA-256", "reseed_only", ",128");
+        check("ctr_drbg", "CTR_DRBG", "AES-", "reseed_only", ",128", "use_df");
+
+        // trying all permutations
+        checkPermutations(
+                Collections.emptyList(),
+                Arrays.asList("hash_drbg","sha-512","Pr_and_Reseed","192"),
+                "Hash_DRBG", "SHA-512", "pr_and_reseed", ",192");
+
+        check("Hash_DRBG,Hmac_DRBG");
+        check("SHA-1,SHA-256");
+        check("128,256");
+        check("none,reseed_only");
+        check("use_df,no_df");
+        check("Hash_DRBG,,SHA-1");
+
+        check(null, DrbgParameters.instantiation(112, PR_AND_RESEED, null),
+                "Hash_DRBG", "SHA-256", "pr_and_reseed", ",112");
+        check(null, DrbgParameters.instantiation(256, PR_AND_RESEED, null),
+                "Hash_DRBG", "SHA-256", "pr_and_reseed", ",256");
+        check(null, DrbgParameters.instantiation(384, PR_AND_RESEED, null));
+        check("sha-1", DrbgParameters.instantiation(112, PR_AND_RESEED, null),
+                "Hash_DRBG", "SHA-1", "pr_and_reseed", ",112");
+        check("sha-1", DrbgParameters.instantiation(192, PR_AND_RESEED, null));
+        check("hash_drbg,sha-512,Pr_and_Reseed,192",
+                DrbgParameters.instantiation(112, NONE, null),
+                "Hash_DRBG", "SHA-512", "reseed_only", ",112");
+        check("hash_drbg,sha-512,Pr_and_Reseed,192",
+                DrbgParameters.instantiation(-1, NONE, null),
+                "Hash_DRBG", "SHA-512", "reseed_only", ",192");
+        // getInstance params can be stronger than definition
+        check("hash_drbg,sha-256,None,112",
+                DrbgParameters.instantiation(192, PR_AND_RESEED, null),
+                "Hash_DRBG", "SHA-256", "pr_and_reseed", ",192");
+
+        check("hash_drbg,sha-1", new MoreDrbgParameters(
+                    null, null, "sha-512", null, false,
+                    DrbgParameters.instantiation(-1, NONE, null)),
+                "Hash_DRBG", "SHA-512");
+        check("hash_drbg,sha-1", new MoreDrbgParameters(
+                    null, null, null, null, false,
+                    DrbgParameters.instantiation(-1, NONE, null)),
+                "Hash_DRBG", "SHA-1");
+        check("hash_drbg", new MoreDrbgParameters(
+                    null, "hmac_drbg", null, null, false,
+                    DrbgParameters.instantiation(-1, NONE, null)),
+                "HMAC_DRBG", "SHA-256");
+
+        check("hash_drbg,sha-1", new MoreDrbgParameters(
+                    null, null, "sha-3", null, false,
+                    DrbgParameters.instantiation(-1, NONE, null)));
+        check("hash_drbg,sha-1", new MoreDrbgParameters(
+                    null, "Unknown_DRBG", null, null, false,
+                    DrbgParameters.instantiation(-1, NONE, null)));
+    }
+
+    /**
+     * Checks all permutatins of a config. This is a recursive method and
+     * should be called with checkPermutations(empty,config,expected).
+     *
+     * @param current the current chosen aspects
+     * @param remains the remaining
+     * @param expected the expected effective config
+     * @throws Exception when check fails
+     */
+    private static void checkPermutations(List<String> current,
+            List<String> remains, String... expected) throws Exception {
+        if (remains.isEmpty()) {
+            check(current.stream().collect(Collectors.joining(",")), expected);
+        } else {
+            for (String r : remains) {
+                List<String> newCurrent = new ArrayList<>(current);
+                newCurrent.add(r);
+                List<String> newRemains = new ArrayList<>(remains);
+                newRemains.remove(r);
+                checkPermutations(newCurrent, newRemains, expected);
+            }
+        }
+    }
+
+    /**
+     * Checks DRBG definition for getInstance(alg, params).
+     *
+     * @param define DRBG
+     * @param params getInstance request (null if none)
+     * @param expected expected actual instantiate params, empty if should fail
+     */
+    static void check(String define, SecureRandomParameters params,
+                      String... expected) throws Exception {
+        System.out.println("Testing " + define + " with " + params + "...");
+        String old = Security.getProperty("securerandom.drbg.config");
+        if (define != null) {
+            Security.setProperty("securerandom.drbg.config", define);
+        }
+        try {
+            String result = params != null ?
+                    SecureRandom.getInstance("DRBG", params).toString() :
+                    SecureRandom.getInstance("DRBG").toString();
+            System.out.println("Result " + result);
+            if (expected.length == 0) {
+                throw new Exception("should fail");
+            }
+            for (String s : expected) {
+                if (!result.contains(s)) {
+                    throw new Exception(result);
+                }
+            }
+        } catch (NoSuchAlgorithmException e) {
+            System.out.println("Result NSAE");
+            if (expected.length > 0) {
+                throw e;
+            }
+        } finally {
+            Security.setProperty("securerandom.drbg.config", old);
+        }
+    }
+
+    /**
+     * Checks DRBG definition for getInstance(alg).
+     *
+     * @param define DRBG
+     * @param expected expected actual instantiate params, empty if should fail
+     */
+    static void check(String define, String... expected) throws Exception {
+        check(define, null, expected);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/SecureRandom/DrbgCavp.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,422 @@
+/*
+ * Copyright (c) 2016, 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 sun.security.provider.EntropySource;
+import sun.security.provider.MoreDrbgParameters;
+
+import javax.crypto.Cipher;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.lang.*;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.DrbgParameters;
+import java.util.ArrayDeque;
+import java.util.Arrays;
+import java.util.Queue;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+import static java.security.DrbgParameters.Capability.*;
+
+/**
+ * The Known-output DRBG test. The test vector can be obtained from
+ * http://csrc.nist.gov/groups/STM/cavp/documents/drbg/drbgtestvectors.zip.
+ *
+ * Manually run this test with
+ *
+ *   java DrbgCavp drbgtestvectors.zip
+ *
+ */
+public class DrbgCavp {
+
+    // the current nonce
+    private static byte[] nonce;
+
+    // A buffer to store test materials for the current call and
+    // can be printed out of an error occurs.
+    private static ByteArrayOutputStream bout = new ByteArrayOutputStream();
+
+    // Save err for restoring
+    private static PrintStream err = System.err;
+
+    private static final int AES_LIMIT;
+
+    static {
+        try {
+            AES_LIMIT = Cipher.getMaxAllowedKeyLength("AES");
+        } catch (Exception e) {
+            // should not happen
+            throw new AssertionError("Cannot detect AES");
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+
+        if (args.length != 1) {
+            System.out.println("Usage: java DrbgCavp drbgtestvectors.zip");
+            return;
+        }
+        File tv = new File(args[0]);
+
+        EntropySource es = new TestEntropySource();
+        System.setErr(new PrintStream(bout));
+
+        // The testsuite is a zip file containing more zip files for different
+        // working modes. Each internal zip file contains test materials for
+        // different mechanisms.
+
+        try (ZipFile zf = new ZipFile(tv)) {
+            String[] modes = {"no_reseed", "pr_false", "pr_true"};
+            for (String mode : modes) {
+                try (ZipInputStream zis = new ZipInputStream(zf.getInputStream(
+                        zf.getEntry("drbgvectors_" + mode + ".zip")))) {
+                    while (true) {
+                        ZipEntry ze = zis.getNextEntry();
+                        if (ze == null) {
+                            break;
+                        }
+                        String fname = ze.getName();
+                        if (fname.equals("Hash_DRBG.txt")
+                                || fname.equals("HMAC_DRBG.txt")
+                                || fname.equals("CTR_DRBG.txt")) {
+                            String algorithm
+                                    = fname.substring(0, fname.length() - 4);
+                            test(mode, algorithm, es, zis);
+                        }
+                    }
+                }
+            }
+        } finally {
+            System.setErr(err);
+        }
+    }
+
+    /**
+     * A special entropy source you can set entropy input at will.
+     */
+    private static class TestEntropySource implements EntropySource {
+
+        private static Queue<byte[]> data = new ArrayDeque<>();
+
+        @Override
+        public byte[] getEntropy(int minEntropy, int minLength,
+                                 int maxLength, boolean pr) {
+            byte[] result = data.poll();
+            if (result == null
+                    || result.length < minLength
+                    || result.length > maxLength) {
+                throw new RuntimeException("Invalid entropy: " +
+                        "need [" + minLength + ", " + maxLength + "], " +
+                        (result == null ? "none" : "has " + result.length));
+            }
+            return result;
+        }
+
+        private static void setEntropy(byte[] input) {
+            data.offer(input);
+        }
+
+        private static void clearEntropy() {
+            data.clear();
+        }
+    }
+
+    /**
+     * The test.
+     *
+     * // Algorithm line, might contain usedf flag
+     * [AES-128 use df]
+     * // Ignored, use mode argument
+     * [PredictionResistance = True]
+     * // Ignored, just read EntropyInput
+     * [EntropyInputLen = 128]
+     * // Ignored, just read Nonce
+     * [NonceLen = 64]
+     * // Ignored, just read PersonalizationString
+     * [PersonalizationStringLen = 128]
+     * // Ignored, just read AdditionalInput
+     * [AdditionalInputLen = 128]
+     * // Used to allocate buffer for nextBytes() call
+     * [ReturnedBitsLen = 512]
+     *
+     * // A sign we can ignore old unused entropy input
+     * COUNT = 0
+     *
+     * // Instantiate
+     * EntropyInput = 92898f...
+     * Nonce = c2a4d9...
+     * PersonalizationString = ea65ee...  // Enough to call getInstance()
+     *
+     * // Reseed
+     * EntropyInputReseed = bfd503...
+     * AdditionalInputReseed = 009e0b... // Enough to call reseed()
+     *
+     * // Generation
+     * AdditionalInput = 1a40fa....  // Enough to call nextBytes() for PR off
+     * EntropyInputPR = 20728a...  // Enough to call nextBytes() for PR on
+     * ReturnedBits = 5a3539...  // Compare this to last nextBytes() output
+     *
+     * @param mode one of "no_reseed", "pr_false", "pr_true"
+     * @param mech one of "Hash_DRBG", "HMAC_DRBG", "CTR_DRBG"
+     * @param es our own entropy source
+     * @param is test material
+     */
+    private static void test(String mode, String mech, EntropySource es,
+            InputStream is) throws Exception {
+
+        SecureRandom hd = null;
+
+        // Expected output length in bits as in [ReturnedBitsLen]
+        int outLen = 0;
+
+        // DRBG algorithm as in the algorithm line
+        String algorithm = null;
+
+        // When CTR_DRBG uses a derivation function as in the algorithm line
+        boolean usedf = false;
+
+        // Additional input as in "AdditionalInput"
+        byte[] additional = null;
+
+        // Random bits generated
+        byte[] output = null;
+
+        // Prediction resistance flag, determined by mode
+        boolean isPr = false;
+
+        StringBuilder sb = new StringBuilder();
+
+        int lineno = 0;
+
+        System.out.println(mode + "/" + mech);
+
+        try (Stream<String> lines =
+                     new BufferedReader(new InputStreamReader(is)).lines()) {
+            for (String s: (Iterable<String>) lines::iterator) {
+                lineno++;
+                err.print(hd == null ? '-' : '*');
+                Line l = new Line(s);
+                if (l.key.contains("no df") || l.key.contains("use df") ||
+                        l.key.startsWith("SHA-")) {
+                    sb = new StringBuilder();
+                    bout.reset();
+                }
+                sb.append(String.format(
+                        "%9s %4s %5d %s\n", mode, mech, lineno, s));
+                switch (l.key) {
+                    case "3KeyTDEA no df":
+                    case "AES-128 no df":
+                    case "AES-192 no df":
+                    case "AES-256 no df":
+                    case "3KeyTDEA use df":
+                    case "AES-128 use df":
+                    case "AES-192 use df":
+                    case "AES-256 use df":
+                        algorithm = l.key.split(" ")[0];
+                        usedf = l.key.contains("use df");
+                        break;
+                    case "ReturnedBitsLen":
+                        outLen = l.vint();
+                        output = new byte[outLen / 8];
+                        break;
+                    case "EntropyInput":
+                        TestEntropySource.setEntropy(l.vdata());
+                        break;
+                    case "Nonce":
+                        nonce = l.vdata();
+                        break;
+                    case "COUNT":
+                        // Remove unused entropy (say, when AES-256 is skipped)
+                        TestEntropySource.clearEntropy();
+                        break;
+                    case "PersonalizationString":
+                        try {
+                            isPr = mode.equals("pr_true");
+                            byte[] ps = null;
+                            if (l.vdata().length != 0) {
+                                ps = l.vdata();
+                            }
+
+                            // MoreDrbgParameters must be used because we
+                            // want to set entropy input and nonce. Since
+                            // it can also set mechanism, algorithm and usedf,
+                            // we don't need to touch securerandom.drbg.config.
+                            hd = SecureRandom.getInstance("DRBG",
+                                    new MoreDrbgParameters(es, mech, algorithm,
+                                            nonce, usedf,
+                                            DrbgParameters.instantiation(
+                                                    -1,
+                                                    isPr ? PR_AND_RESEED
+                                                            : RESEED_ONLY,
+                                                    ps)),
+                                    "SUN");
+                        } catch (NoSuchAlgorithmException iae) {
+                            // AES-256 might not be available. This is OK.
+                            if ((algorithm.equals("AES-192")
+                                    || algorithm.equals("AES-256"))
+                                    && AES_LIMIT == 128) {
+                                hd = null;
+                            } else {
+                                throw iae;
+                            }
+                        }
+                        break;
+                    case "EntropyInputReseed":
+                        TestEntropySource.setEntropy(l.vdata());
+                        break;
+                    case "AdditionalInputReseed":
+                        if (l.vdata().length == 0) {
+                            additional = null;
+                        } else {
+                            additional = l.vdata();
+                        }
+                        if (hd != null) {
+                            if (additional == null) {
+                                hd.reseed();
+                            } else {
+                                hd.reseed(DrbgParameters.reseed(
+                                        isPr, additional));
+                            }
+                        }
+                        break;
+                    case "EntropyInputPR":
+                        if (l.vdata().length != 0) {
+                            TestEntropySource.setEntropy(l.vdata());
+                        }
+                        if (mode.equals("pr_true")) {
+                            if (hd != null) {
+                                if (additional == null) {
+                                    hd.nextBytes(output);
+                                } else {
+                                    hd.nextBytes(output,
+                                            DrbgParameters.nextBytes(
+                                                    -1, isPr, additional));
+                                }
+                            }
+                        }
+                        break;
+                    case "AdditionalInput":
+                        if (l.vdata().length == 0) {
+                            additional = null;
+                        } else {
+                            additional = l.vdata();
+                        }
+                        if (!mode.equals("pr_true")) {
+                            if (hd != null) {
+                                if (additional == null) {
+                                    hd.nextBytes(output);
+                                } else {
+                                    hd.nextBytes(output,
+                                            DrbgParameters.nextBytes(
+                                                    -1, isPr, additional));
+                                }
+                            }
+                        }
+                        break;
+                    case "ReturnedBits":
+                        if (hd != null) {
+                            if (!Arrays.equals(output, l.vdata())) {
+                                throw new Exception("\nExpected: " +
+                                        l.value + "\n  Actual: " + hex(output));
+                            }
+                        }
+                        break;
+                    default:
+                        // Algorithm line for Hash_DRBG and HMAC_DRBG
+                        if (l.key.startsWith("SHA-")) {
+                            algorithm = l.key;
+                        }
+                }
+            }
+            err.println();
+        } catch (Exception e) {
+            err.println();
+            err.println(sb.toString());
+            err.println(bout.toString());
+            throw e;
+        }
+    }
+
+    /**
+     * Parse a line from test material.
+     *
+     * Brackets are removed. Key and value separated.
+     */
+    static class Line {
+
+        final String key;
+        final String value;
+
+        Line(String s) {
+            s = s.trim();
+            if (s.length() >= 2) {
+                if (s.charAt(0) == '[') {
+                    s = s.substring(1, s.length() - 1);
+                }
+            }
+            if (s.indexOf('=') < 0) {
+                key = s;
+                value = null;
+            } else {
+                key = s.substring(0, s.indexOf('=')).trim();
+                value = s.substring(s.indexOf('=') + 1).trim();
+            }
+        }
+
+        int vint() {
+            return Integer.parseInt(value);
+        }
+
+        byte[] vdata() {
+            return xeh(value);
+        }
+    }
+
+    // Bytes to HEX
+    private static String hex(byte[] in) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b: in) {
+            sb.append(String.format("%02x", b&0xff));
+        }
+        return sb.toString();
+    }
+
+    // HEX to bytes
+    private static byte[] xeh(String in) {
+        in = in.replaceAll(" ", "");
+        int len = in.length() / 2;
+        byte[] out = new byte[len];
+        for (int i = 0; i < len; i++) {
+            out[i] = (byte) Integer.parseInt(
+                    in.substring(i * 2, i * 2 + 2), 16);
+        }
+        return out;
+    }
+}
--- a/jdk/test/sun/security/provider/SecureRandom/SelfSeed.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 1998, 2003, 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 4168409
- * @summary SecureRandom forces all instances to self-seed, even if a seed is
- *                      provided
- */
-
-import java.security.SecureRandom;
-
-public class SelfSeed {
-
-    private static final int NUM_BYTES = 5;
-    private static byte seed[] = { (byte)0xaa, (byte)0x11, (byte)0xa1 };
-
-    public static void main(String[] args) {
-
-        try {
-            SecureRandom sr1 = SecureRandom.getInstance("SHA1PRNG");
-            sr1.setSeed(seed);
-            byte randomBytes[] = new byte[NUM_BYTES];
-            sr1.nextBytes(randomBytes);
-
-            SecureRandom sr2 = new SecureRandom(seed);
-            if (sr2.getAlgorithm().equals("SHA1PRNG") == false) {
-                System.out.println("Default PRNG is not SHA1PRNG, skipping test");
-                return;
-            }
-            byte otherRandomBytes[] = new byte[NUM_BYTES];
-            sr2.nextBytes(otherRandomBytes);
-
-            // make sure the random bytes generated are the same
-            for (int i = 0; i < NUM_BYTES; i++) {
-                if (randomBytes[i] != otherRandomBytes[i])
-                    throw new SecurityException("FAILURE: " +
-                                        "Returned bytes not equal");
-            }
-
-            // success
-        } catch (Exception e) {
-            throw new SecurityException("FAILURE: " + e.toString());
-        }
-    }
-}
--- a/jdk/test/sun/security/provider/SecureRandom/StrongSeedReader.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/sun/security/provider/SecureRandom/StrongSeedReader.java	Wed Jul 05 21:40:37 2017 +0200
@@ -59,6 +59,7 @@
             System.setProperty("java.security.egd", file.toURI().toString());
             testSeed("NativePRNG");
             testSeed("SHA1PRNG");
+            testSeed("DRBG");
         } finally {
             if (file != null) {
                 file.delete();
--- a/jdk/test/tools/jar/modularJar/Basic.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jar/modularJar/Basic.java	Wed Jul 05 21:40:37 2017 +0200
@@ -340,43 +340,43 @@
             "--file=" + modularJar.toString())
             .assertSuccess()
             .resultChecker(r -> {
-                // Expect similar output: "Name:bar,  Requires: foo,...
-                // Conceals: jdk.test.foo, jdk.test.foo.internal"
-                Pattern p = Pattern.compile("\\s+Name:\\s+bar\\s+Requires:\\s+foo");
+                // Expect similar output: "bar, requires mandated foo, ...
+                // conceals jdk.test.foo, conceals jdk.test.foo.internal"
+                Pattern p = Pattern.compile("\\s+bar\\s+requires\\s++foo");
                 assertTrue(p.matcher(r.output).find(),
-                           "Expecting to find \"Name: bar, Requires: foo,...\"",
+                           "Expecting to find \"bar, requires foo,...\"",
                            "in output, but did not: [" + r.output + "]");
                 p = Pattern.compile(
-                        "Conceals:\\s+jdk.test.foo\\s+jdk.test.foo.internal");
+                        "conceals\\s+jdk.test.foo\\s+conceals\\s+jdk.test.foo.internal");
                 assertTrue(p.matcher(r.output).find(),
-                           "Expecting to find \"Conceals: jdk.test.foo,...\"",
+                           "Expecting to find \"conceals jdk.test.foo,...\"",
                            "in output, but did not: [" + r.output + "]");
             });
     }
 
     @Test
-    public void dependencesFooBar() throws IOException {
+    public void hashBarInFooModule() throws IOException {
         Path mp = Paths.get("dependencesFooBar");
         createTestDir(mp);
 
-        Path modClasses = MODULE_CLASSES.resolve(FOO.moduleName);
-        Path modularJar = mp.resolve(FOO.moduleName + ".jar");
+        Path modClasses = MODULE_CLASSES.resolve(BAR.moduleName);
+        Path modularJar = mp.resolve(BAR.moduleName + ".jar");
+        jar("--create",
+            "--file=" + modularJar.toString(),
+            "--main-class=" + BAR.mainClass,
+            "--module-version=" + BAR.version,
+            "--no-manifest",
+            "-C", modClasses.toString(), ".")
+            .assertSuccess();
+
+        modClasses = MODULE_CLASSES.resolve(FOO.moduleName);
+        modularJar = mp.resolve(FOO.moduleName + ".jar");
         jar("--create",
             "--file=" + modularJar.toString(),
             "--main-class=" + FOO.mainClass,
             "--module-version=" + FOO.version,
-            "--no-manifest",
-            "-C", modClasses.toString(), ".")
-            .assertSuccess();
-
-        modClasses = MODULE_CLASSES.resolve(BAR.moduleName);
-        modularJar = mp.resolve(BAR.moduleName + ".jar");
-        jar("--create",
-            "--file=" + modularJar.toString(),
-            "--main-class=" + BAR.mainClass,
-            "--module-version=" + BAR.version,
             "--modulepath=" + mp.toString(),
-            "--hash-dependencies=" + "foo",  // dependency on foo
+            "--hash-modules=" + "bar",
             "--no-manifest",
             "-C", modClasses.toString(), ".")
             .assertSuccess();
@@ -392,49 +392,49 @@
     }
 
     @Test
-    public void badDependencyFooBar() throws IOException {
+    public void invalidHashInFooModule() throws IOException {
         Path mp = Paths.get("badDependencyFooBar");
         createTestDir(mp);
 
-        Path fooClasses = MODULE_CLASSES.resolve(FOO.moduleName);
-        Path fooJar = mp.resolve(FOO.moduleName + ".jar");
-        jar("--create",
-            "--file=" + fooJar.toString(),
-            "--main-class=" + FOO.mainClass,
-            "--module-version=" + FOO.version,
-            "--no-manifest",
-            "-C", fooClasses.toString(), ".").assertSuccess();
-
         Path barClasses = MODULE_CLASSES.resolve(BAR.moduleName);
         Path barJar = mp.resolve(BAR.moduleName + ".jar");
         jar("--create",
             "--file=" + barJar.toString(),
             "--main-class=" + BAR.mainClass,
             "--module-version=" + BAR.version,
-            "--modulepath=" + mp.toString(),
-            "--hash-dependencies=" + "foo",  // dependency on foo
             "--no-manifest",
             "-C", barClasses.toString(), ".").assertSuccess();
 
-        // Rebuild foo.jar with a change that will cause its hash to be different
-        FileUtils.deleteFileWithRetry(fooJar);
+        Path fooClasses = MODULE_CLASSES.resolve(FOO.moduleName);
+        Path fooJar = mp.resolve(FOO.moduleName + ".jar");
         jar("--create",
             "--file=" + fooJar.toString(),
             "--main-class=" + FOO.mainClass,
-            "--module-version=" + FOO.version + ".1", // a newer version
+            "--module-version=" + FOO.version,
+            "--modulepath=" + mp.toString(),
+            "--hash-modules=" + "bar",
             "--no-manifest",
             "-C", fooClasses.toString(), ".").assertSuccess();
 
+        // Rebuild bar.jar with a change that will cause its hash to be different
+        FileUtils.deleteFileWithRetry(barJar);
+        jar("--create",
+            "--file=" + barJar.toString(),
+            "--main-class=" + BAR.mainClass,
+            "--module-version=" + BAR.version + ".1", // a newer version
+            "--no-manifest",
+            "-C", barClasses.toString(), ".").assertSuccess();
+
         java(mp, BAR.moduleName + "/" + BAR.mainClass,
              "-XaddExports:java.base/jdk.internal.module=bar")
             .assertFailure()
             .resultChecker(r -> {
                 // Expect similar output: "java.lang.module.ResolutionException: Hash
-                // of foo (WdktSIQSkd4+CEacpOZoeDrCosMATNrIuNub9b5yBeo=) differs to
+                // of bar (WdktSIQSkd4+CEacpOZoeDrCosMATNrIuNub9b5yBeo=) differs to
                 // expected hash (iepvdv8xTeVrFgMtUhcFnmetSub6qQHCHc92lSaSEg0=)"
-                Pattern p = Pattern.compile(".*Hash of foo.*differs to expected hash.*");
+                Pattern p = Pattern.compile(".*Hash of bar.*differs to expected hash.*");
                 assertTrue(p.matcher(r.output).find(),
-                      "Expecting error message containing \"Hash of foo ... differs to"
+                      "Expecting error message containing \"Hash of bar ... differs to"
                               + " expected hash...\" but got: [", r.output + "]");
             });
     }
@@ -454,7 +454,7 @@
 
          jar("--create",
              "--file=" + modularJar.toString(),
-             "--hash-dependencies=" + ".*",   // no module-info.class
+             "--hash-modules=" + ".*",   // no module-info.class
              "-C", modClasses.toString(), "jdk")
              .assertFailure();      // TODO: expected failure message
     }
--- a/jdk/test/tools/jar/modularJar/src/bar/jdk/test/bar/Bar.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jar/modularJar/src/bar/jdk/test/bar/Bar.java	Wed Jul 05 21:40:37 2017 +0200
@@ -30,7 +30,7 @@
 import java.util.Optional;
 import java.util.StringJoiner;
 
-import jdk.internal.module.Hasher;
+import jdk.internal.module.ModuleHashes;
 import jdk.test.bar.internal.Message;
 
 public class Bar {
@@ -43,10 +43,11 @@
 
         Method m = ModuleDescriptor.class.getDeclaredMethod("hashes");
         m.setAccessible(true);
-        Optional<Hasher.DependencyHashes> optHashes =
-                (Optional<Hasher.DependencyHashes>) m.invoke(md);
+        ModuleDescriptor foo = jdk.test.foo.Foo.class.getModule().getDescriptor();
+        Optional<ModuleHashes> oHashes =
+                (Optional<ModuleHashes>) m.invoke(foo);
 
-        System.out.println("hashes:" + optHashes.get().hashFor("foo"));
+        System.out.println("hashes:" + oHashes.get().hashFor("bar"));
 
         StringJoiner sj = new StringJoiner(",");
         md.conceals().forEach(sj::add);
--- a/jdk/test/tools/jlink/ImageFileCreatorTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jlink/ImageFileCreatorTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -214,14 +214,12 @@
             }
 
             @Override
-            public void storeFiles(Pool content, String bom) {
-
+            public void storeFiles(Pool content) {
             }
-
         };
 
         ImagePluginStack stack = new ImagePluginStack(noopBuilder, Collections.emptyList(),
-                null, Collections.emptyList(), "");
+                null, Collections.emptyList());
 
         ImageFileCreator.create(archives, ByteOrder.nativeOrder(), stack);
     }
--- a/jdk/test/tools/jlink/IntegrationTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jlink/IntegrationTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -241,7 +241,7 @@
             lst.add(new MyPostProcessor());
         }
         // Image builder
-        DefaultImageBuilder builder = new DefaultImageBuilder(true, output);
+        DefaultImageBuilder builder = new DefaultImageBuilder(output);
         PluginsConfiguration plugins
                 = new Jlink.PluginsConfiguration(lst, builder, null);
 
@@ -254,10 +254,6 @@
         if (!jimage.exists()) {
             throw new AssertionError("jimage not generated");
         }
-        File bom = new File(output.toString(), "bom");
-        if (!bom.exists()) {
-            throw new AssertionError("bom not generated");
-        }
         File release = new File(output.toString(), "release");
         if (!release.exists()) {
             throw new AssertionError("release not generated");
@@ -311,7 +307,7 @@
         }
 
         // Image builder
-        DefaultImageBuilder builder = new DefaultImageBuilder(false, output);
+        DefaultImageBuilder builder = new DefaultImageBuilder(output);
         PluginsConfiguration plugins
                 = new Jlink.PluginsConfiguration(lst, builder, null);
 
@@ -359,7 +355,7 @@
         }
 
         // Image builder
-        DefaultImageBuilder builder = new DefaultImageBuilder(false, output);
+        DefaultImageBuilder builder = new DefaultImageBuilder(output);
         PluginsConfiguration plugins
                 = new Jlink.PluginsConfiguration(lst, builder, null);
         boolean failed = false;
--- a/jdk/test/tools/jlink/JLink2Test.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jlink/JLink2Test.java	Wed Jul 05 21:40:37 2017 +0200
@@ -66,8 +66,6 @@
 
         // This test case must be first one, the JlinkTask is clean
         // and reveals possible bug related to plugin options in defaults
-        // e. g.: --genbom
-        testBomFile(helper);
         testSameNames(helper);
         testModulePath(helper);
         testOptions();
@@ -136,35 +134,6 @@
         validator.validate();
     }
 
-    private static void testBomFile(Helper helper) throws Exception {
-        String[] userOptions = {
-            "--compress",
-            "2",
-            "--addmods",
-            "bomzip",
-            "--strip-debug",
-            "--genbom",
-            "--exclude-resources",
-            "*.jcov,*/META-INF/*"};
-        String moduleName = "bomzip";
-        helper.generateDefaultJModule(moduleName, "composite2");
-        Path imgDir = helper.generateDefaultImage(userOptions, moduleName).assertSuccess();
-        helper.checkImage(imgDir, moduleName, userOptions, null, null);
-        File bom = new File(imgDir.toFile(), "bom");
-        if (!bom.exists()) {
-            throw new RuntimeException(bom.getAbsolutePath() + " not generated");
-        }
-        String bomcontent = new String(Files.readAllBytes(bom.toPath()));
-        if (!bomcontent.contains("--strip-debug")
-                || !bomcontent.contains("--compress")
-                || !bomcontent.contains("--genbom")
-                || !bomcontent.contains("--exclude-resources *.jcov,"
-                        + "*/META-INF/*")
-                || !bomcontent.contains("--addmods bomzip")) {
-            throw new Exception("Not expected content in " + bom);
-        }
-    }
-
     private static void testOptions() throws Exception {
         List<Plugin> builtInPlugins = new ArrayList<>();
         builtInPlugins.addAll(PluginRepository.getPlugins(Layer.boot()));
--- a/jdk/test/tools/jlink/JLinkTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jlink/JLinkTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -204,7 +204,7 @@
             String[] userOptions = {"--compress", "invalid"};
             String moduleName = "invalidCompressLevel";
             helper.generateDefaultJModule(moduleName, "composite2");
-            helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: Invalid level invalid");
+            helper.generateDefaultImage(userOptions, moduleName).assertFailure("Error: Invalid compression level invalid");
         }
 
         // @file
--- a/jdk/test/tools/jlink/hashes/HashesTest.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-/**
- * 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
- * @summary Test the recording and checking of dependency hashes
- * @author Andrei Eremeev
- * @library /lib/testlibrary
- * @modules java.base/jdk.internal.module
- *          jdk.jlink/jdk.tools.jlink
- *          jdk.jlink/jdk.tools.jmod
- *          jdk.compiler
- * @ignore
- * @build jdk.testlibrary.ProcessTools jdk.testlibrary.OutputAnalyzer CompilerUtils
- * @run main HashesTest
- */
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import jdk.testlibrary.OutputAnalyzer;
-import jdk.testlibrary.ProcessTools;
-
-public class HashesTest {
-
-    private final Path jdkHome = Paths.get(System.getProperty("test.jdk"));
-    private final Path stdJmods = jdkHome.resolve("jmods");
-    private final Path testSrc = Paths.get(System.getProperty("test.src"));
-    private final Path modSrc = testSrc.resolve("src");
-    private final Path newModSrc = testSrc.resolve("newsrc");
-    private final Path classes = Paths.get("classes");
-    private final Path jmods = Paths.get("jmods");
-
-    public static void main(String[] args) throws Exception {
-        new HashesTest().run();
-    }
-
-    private void run() throws Exception {
-        if (!Files.exists(stdJmods)) {
-            return;
-        }
-        Files.createDirectories(jmods);
-        Path m1Classes = classes.resolve("m1");
-        Path m2Classes = classes.resolve("m2");
-        Path m3Classes = classes.resolve("not_matched");
-        // build the second module
-        compileClasses(modSrc, m2Classes);
-        runJmod(m2Classes.toString(), m2Classes.getFileName().toString());
-
-        // build the third module
-        compileClasses(modSrc, m3Classes);
-        runJmod(m3Classes.toString(), m3Classes.getFileName().toString());
-
-        compileClasses(modSrc, m1Classes, "-mp", jmods.toString());
-        runJmod(m1Classes.toString(), m1Classes.getFileName().toString(),
-                "--modulepath", jmods.toString(), "--hash-dependencies", "m2");
-        runJava(0, "-mp", jmods.toString(), "-m", "m1/org.m1.Main");
-
-        deleteDirectory(m3Classes);
-        Files.delete(jmods.resolve("not_matched.jmod"));
-
-        // build the new third module
-        compileClasses(newModSrc, m3Classes);
-        runJmod(m3Classes.toString(), m3Classes.getFileName().toString());
-        runJava(0, "-mp", jmods.toString(), "-m", "m1/org.m1.Main");
-
-        deleteDirectory(m2Classes);
-        Files.delete(jmods.resolve("m2.jmod"));
-
-        compileClasses(newModSrc, m2Classes);
-        runJmod(m2Classes.toString(), m2Classes.getFileName().toString());
-
-        runJava(1, "-mp", jmods.toString(), "-m", "m1/org.m1.Main");
-
-        if (jdk.tools.jlink.internal.Main.run(new String[]{
-                "--modulepath", stdJmods.toString() + File.pathSeparator + jmods.toString(),
-                "--addmods", "m1", "--output", "myimage"}, new PrintWriter(System.out)) == 0) {
-            throw new AssertionError("Expected failure. rc = 0");
-        }
-    }
-
-    private void deleteDirectory(Path dir) throws IOException {
-        Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
-            @Override
-            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-                Files.delete(file);
-                return FileVisitResult.CONTINUE;
-            }
-
-            @Override
-            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
-                Files.delete(dir);
-                return FileVisitResult.CONTINUE;
-            }
-        });
-    }
-
-    private void runJava(int expectedExitCode, String... args) throws Exception {
-        OutputAnalyzer analyzer = ProcessTools.executeTestJava(args);
-        if (analyzer.getExitValue() != expectedExitCode) {
-            throw new AssertionError("Expected exit code: " + expectedExitCode +
-                    ", got: " + analyzer.getExitValue());
-        }
-    }
-
-    private void compileClasses(Path src, Path output, String... options) throws IOException {
-        List<String> args = new ArrayList<>();
-        Collections.addAll(args, options);
-        Collections.addAll(args, "-d", output.toString());
-        args.add(src.toString());
-        System.out.println("javac options: " + args.stream().collect(Collectors.joining(" ")));
-        if (!CompilerUtils.compile(src.resolve(output.getFileName()), output, options)) {
-            throw new AssertionError("Compilation failure. See log.");
-        }
-    }
-
-    private void runJmod(String cp, String modName, String... options) {
-        List<String> args = new ArrayList<>();
-        args.add("create");
-        Collections.addAll(args, options);
-        Collections.addAll(args, "--class-path", cp,
-                jmods + File.separator + modName + ".jmod");
-        int rc = jdk.tools.jmod.Main.run(args.toArray(new String[args.size()]), System.out);
-        System.out.println("jmod options: " + args.stream().collect(Collectors.joining(" ")));
-        if (rc != 0) {
-            throw new AssertionError("Jmod failed: rc = " + rc);
-        }
-    }
-}
--- a/jdk/test/tools/jlink/hashes/newsrc/m2/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/*
- * 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.
- */
-
-module m2 {
-    exports org.m2;
-}
--- a/jdk/test/tools/jlink/hashes/newsrc/m2/org/m2/Util.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package org.m2;
-
-public class Util {
-    private Util() { }
-
-    public static String timeOfDay() {
-        return "Time for a beer";
-    }
-}
--- a/jdk/test/tools/jlink/hashes/newsrc/not_matched/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/*
- * 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.
- */
-
-module not_matched {
-    exports org.not_matched;
-}
--- a/jdk/test/tools/jlink/hashes/newsrc/not_matched/org/not_matched/Name.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package org.not_matched;
-
-public class Name {
-    private Name() { }
-
-    public static String name() {
-        return "new_module";
-    }
-}
--- a/jdk/test/tools/jlink/hashes/src/m1/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * 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.
- */
-
-module m1 {
-    requires m2;
-    requires not_matched;
-}
--- a/jdk/test/tools/jlink/hashes/src/m1/org/m1/Main.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * 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.
- */
-
-package org.m1;
-
-import org.m2.Util;
-import org.not_matched.Name;
-
-public class Main {
-    public static void main(String[] args) {
-        System.out.println(Util.timeOfDay());
-        System.out.println(Name.name());
-    }
-}
--- a/jdk/test/tools/jlink/hashes/src/m2/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/*
- * 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.
- */
-
-module m2 {
-    exports org.m2;
-}
--- a/jdk/test/tools/jlink/hashes/src/m2/org/m2/Util.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package org.m2;
-
-public class Util {
-    private Util() { }
-
-    public static String timeOfDay() {
-        return "Time for lunch";
-    }
-}
--- a/jdk/test/tools/jlink/hashes/src/not_matched/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/*
- * 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.
- */
-
-module not_matched {
-    exports org.not_matched;
-}
--- a/jdk/test/tools/jlink/hashes/src/not_matched/org/not_matched/Name.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package org.not_matched;
-
-public class Name {
-    private Name() { }
-
-    public static String name() {
-        return "old_module";
-    }
-}
--- a/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -101,9 +101,8 @@
 
         }
         Path root = new File(".").toPath();
-        DefaultImageBuilder imgbuilder = new DefaultImageBuilder(false,
-                root);
-        imgbuilder.storeFiles(pool, "");
+        DefaultImageBuilder imgbuilder = new DefaultImageBuilder(root);
+        imgbuilder.storeFiles(pool);
 
         if (lic.exists()) {
             File license = new File(root.toFile(), "LICENSE");
--- a/jdk/test/tools/jlink/plugins/IncludeLocalesPluginTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jlink/plugins/IncludeLocalesPluginTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -36,6 +36,7 @@
 
 /*
  * @test
+ * @bug 8152143 8152704 8155649
  * @summary IncludeLocalesPlugin tests
  * @author Naoto Sato
  * @library ../../lib
@@ -55,15 +56,17 @@
     private final static String moduleName = "IncludeLocalesTest";
     private static Helper helper;
     private final static int INCLUDE_LOCALES_OPTION = 0;
-    private final static int EXPECTED_LOCATIONS     = 1;
-    private final static int UNEXPECTED_PATHS       = 2;
-    private final static int AVAILABLE_LOCALES      = 3;
-    private final static int ERROR_MESSAGE          = 4;
+    private final static int ADDMODS_OPTION         = 1;
+    private final static int EXPECTED_LOCATIONS     = 2;
+    private final static int UNEXPECTED_PATHS       = 3;
+    private final static int AVAILABLE_LOCALES      = 4;
+    private final static int ERROR_MESSAGE          = 5;
 
     private final static Object[][] testData = {
         // without --include-locales option: should include all locales
         {
             "",
+            "jdk.localedata",
             List.of(
                 "/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",
                 "/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",
@@ -144,6 +147,7 @@
         // All English/Japanese locales
         {
             "--include-locales=en,ja",
+            "jdk.localedata",
             List.of(
                 "/jdk.localedata/sun/text/resources/ext/FormatData_en_GB.class",
                 "/jdk.localedata/sun/text/resources/ext/FormatData_ja.class",
@@ -174,6 +178,7 @@
         // All locales in India
         {
             "--include-locales=*-IN",
+            "jdk.localedata",
             List.of(
                 "/jdk.localedata/sun/text/resources/ext/FormatData_en_IN.class",
                 "/jdk.localedata/sun/text/resources/ext/FormatData_hi_IN.class",
@@ -201,7 +206,9 @@
         },
 
         // Thai
-        {"--include-locales=th",
+        {
+            "--include-locales=th",
+            "jdk.localedata",
             List.of(
                 "/jdk.localedata/sun/text/resources/LineBreakIteratorData_th",
                 "/jdk.localedata/sun/text/resources/thai_dict",
@@ -221,7 +228,9 @@
         },
 
         // Hong Kong
-        {"--include-locales=zh-HK",
+        {
+            "--include-locales=zh-HK",
+            "jdk.localedata",
             List.of(
                 "/jdk.localedata/sun/text/resources/ext/FormatData_zh.class",
                 "/jdk.localedata/sun/text/resources/ext/FormatData_zh_HK.class",
@@ -244,7 +253,9 @@
         },
 
         // Norwegian
-        {"--include-locales=nb,nn,no",
+        {
+            "--include-locales=nb,nn,no",
+            "jdk.localedata",
             List.of(
                 "/jdk.localedata/sun/text/resources/ext/FormatData_no.class",
                 "/jdk.localedata/sun/text/resources/ext/FormatData_no_NO.class",
@@ -268,7 +279,9 @@
         },
 
         // Hebrew/Indonesian/Yiddish
-        {"--include-locales=he,id,yi",
+        {
+            "--include-locales=he,id,yi",
+            "jdk.localedata",
             List.of(
                 "/jdk.localedata/sun/text/resources/ext/FormatData_in.class",
                 "/jdk.localedata/sun/text/resources/ext/FormatData_in_ID.class",
@@ -294,7 +307,9 @@
         },
 
         // Error case: No matching locales
-        {"--include-locales=xyz",
+        {
+            "--include-locales=xyz",
+            "jdk.localedata",
             null,
             null,
             null,
@@ -304,7 +319,9 @@
         },
 
         // Error case: Invalid argument
-        {"--include-locales=en,zh_HK",
+        {
+            "--include-locales=en,zh_HK",
+            "jdk.localedata",
             null,
             null,
             null,
@@ -312,6 +329,18 @@
                 PluginsResourceBundle.getMessage("include-locales.invalidtag"), "zh_HK"))
                 .getMessage(),
         },
+
+        // Error case: jdk.localedata is not added
+        {
+            "--include-locales=en-US",
+            "java.base",
+            null,
+            null,
+            null,
+            new PluginException(
+                PluginsResourceBundle.getMessage("include-locales.localedatanotfound"))
+                .getMessage(),
+        },
     };
 
     public static void main(String[] args) throws Exception {
@@ -328,7 +357,7 @@
             Result result = JImageGenerator.getJLinkTask()
                     .modulePath(helper.defaultModulePath())
                     .output(helper.createNewImageDir(moduleName))
-                    .addMods("jdk.localedata")
+                    .addMods((String)data[ADDMODS_OPTION])
                     .option((String)data[INCLUDE_LOCALES_OPTION])
                     .call();
 
--- a/jdk/test/tools/jmod/JmodNegativeTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/jmod/JmodNegativeTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -76,7 +76,7 @@
         jmod()
             .assertFailure()
             .resultChecker(r ->
-                assertContains(r.output, "Error: one of create, list, or describe must be specified")
+                assertContains(r.output, "Error: one of create, list, describe, or hash must be specified")
             );
     }
 
@@ -85,7 +85,7 @@
         jmod("badAction")
             .assertFailure()
             .resultChecker(r ->
-                assertContains(r.output, "Error: mode must be one of create, list, or describe")
+                assertContains(r.output, "Error: mode must be one of create, list, describe, or hash")
             );
 
         jmod("--badOption")
@@ -170,14 +170,14 @@
     }
 
     @Test
-    public void testHashDependenciesModulePathNotSpecified() {
+    public void testHashModulesModulePathNotSpecified() {
         jmod("create",
-             "--hash-dependencies", "anyPattern.*",
+             "--hash-modules", "anyPattern.*",
              "output.jmod")
             .assertFailure()
             .resultChecker(r ->
                 assertContains(r.output, "Error: --module-path must be "
-                        +"specified when hashing dependencies")
+                        +"specified when hashing modules")
             );
     }
 
@@ -317,7 +317,7 @@
     }
 
     @Test
-    public void testDependencyNotFound() throws IOException {
+    public void testNoModuleHash() throws IOException {
         Path jmod = MODS_DIR.resolve("output.jmod");
         FileUtils.deleteFileIfExistsWithRetry(jmod);
         Path emptyDir = Paths.get("empty");
@@ -328,13 +328,12 @@
 
         jmod("create",
              "--class-path", cp,
-             "--hash-dependencies", ".*",
+             "--hash-modules", ".*",
              "--modulepath", emptyDir.toString(),
             jmod.toString())
-            .assertFailure()
             .resultChecker(r ->
-                assertContains(r.output, "Hashing module foo dependencies, "
-                        + "unable to find module java.base on module path")
+                assertContains(r.output, "No hashes recorded: " +
+                    "no module specified for hashing depends on foo")
             );
     }
 
@@ -350,13 +349,10 @@
 
             jmod("create",
                  "--class-path", cp,
-                 "--hash-dependencies", ".*",
+                 "--hash-modules", ".*",
                  "--modulepath", MODS_DIR.toString(),
                  jmod.toString())
-                .assertFailure()
-                .resultChecker(r ->
-                    assertContains(r.output, "Error: error reading module path")
-                );
+                .assertFailure();
         } finally {
             FileUtils.deleteFileWithRetry(empty);
         }
@@ -371,7 +367,7 @@
         Files.createFile(file);
 
         jmod("create",
-             "--hash-dependencies", ".*",
+             "--hash-modules", ".*",
              "--modulepath", file.toString(),
              jmod.toString())
             .assertFailure()
@@ -388,7 +384,7 @@
 
         List<Supplier<JmodResult>> tasks = Arrays.asList(
                 () -> jmod("create",
-                           "--hash-dependencies", "anyPattern",
+                           "--hash-modules", "anyPattern",
                            "--modulepath", "doesNotExist",
                            "output.jmod"),
                 () -> jmod("create",
@@ -436,7 +432,7 @@
 
         List<Supplier<JmodResult>> tasks = Arrays.asList(
             () -> jmod("create",
-                       "--hash-dependencies", "anyPattern",
+                       "--hash-modules", "anyPattern",
                        "--modulepath","empty" + pathSeparator + "doesNotExist",
                        "output.jmod"),
             () -> jmod("create",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/HashesTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,213 @@
+/**
+ * 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
+ * @summary Test the recording and checking of module hashes
+ * @author Andrei Eremeev
+ * @library /lib/testlibrary
+ * @modules java.base/jdk.internal.module
+ *          jdk.jlink/jdk.tools.jlink.internal
+ *          jdk.jlink/jdk.tools.jmod
+ *          jdk.compiler
+ * @build CompilerUtils
+ * @run testng HashesTest
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleFinder;
+import java.lang.module.ModuleReader;
+import java.lang.module.ModuleReference;
+import java.lang.reflect.Method;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import jdk.internal.module.ConfigurableModuleFinder;
+import jdk.internal.module.ModuleHashes;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+public class HashesTest {
+
+    private final Path testSrc = Paths.get(System.getProperty("test.src"));
+    private final Path modSrc = testSrc.resolve("src");
+    private final Path mods = Paths.get("mods");
+    private final Path jmods = Paths.get("jmods");
+    private final String[] modules = new String[] { "m1", "m2", "m3"};
+
+    private static Method hashesMethod;
+    @BeforeTest
+    private void setup() throws Exception {
+        if (Files.exists(jmods)) {
+            deleteDirectory(jmods);
+        }
+        Files.createDirectories(jmods);
+
+        // build m2, m3 required by m1
+        compileModule("m2", modSrc);
+        jmod("m2");
+
+        compileModule("m3", modSrc);
+        jmod("m3");
+
+        // build m1
+        compileModule("m1", modSrc);
+        // no hash is recorded since m1 has outgoing edges
+        jmod("m1", "--modulepath", jmods.toString(), "--hash-modules", ".*");
+
+        // compile org.bar and org.foo
+        compileModule("org.bar", modSrc);
+        compileModule("org.foo", modSrc);
+
+        try {
+            hashesMethod = ModuleDescriptor.class.getDeclaredMethod("hashes");
+            hashesMethod.setAccessible(true);
+        } catch (ReflectiveOperationException x) {
+            throw new InternalError(x);
+        }
+    }
+
+    @Test
+    public void test() throws Exception {
+        for (String mn : modules) {
+            assertFalse(hashes(mn).isPresent());
+        }
+
+        // hash m1 in m2
+        jmod("m2", "--modulepath", jmods.toString(), "--hash-modules", "m1");
+        checkHashes(hashes("m2").get(), "m1");
+
+        // hash m1 in m2
+        jmod("m2", "--modulepath", jmods.toString(), "--hash-modules", ".*");
+        checkHashes(hashes("m2").get(), "m1");
+
+        // create m2.jmod with no hash
+        jmod("m2");
+        // run jmod hash command to hash m1 in m2 and m3
+        runJmod(Arrays.asList("hash", "--modulepath", jmods.toString(),
+                "--hash-modules", ".*"));
+        checkHashes(hashes("m2").get(), "m1");
+        checkHashes(hashes("m3").get(), "m1");
+
+        jmod("org.bar");
+        jmod("org.foo");
+
+        jmod("org.bar", "--modulepath", jmods.toString(), "--hash-modules", "org.*");
+        checkHashes(hashes("org.bar").get(), "org.foo");
+
+        jmod("m3", "--modulepath", jmods.toString(), "--hash-modules", ".*");
+        checkHashes(hashes("m3").get(), "org.foo", "org.bar", "m1");
+    }
+
+    private void checkHashes(ModuleHashes hashes, String... hashModules) {
+        assertTrue(hashes.names().equals(Set.of(hashModules)));
+    }
+
+    private Optional<ModuleHashes> hashes(String name) throws Exception {
+        ModuleFinder finder = ModuleFinder.of(jmods.resolve(name + ".jmod"));
+        if (finder instanceof ConfigurableModuleFinder) {
+            ((ConfigurableModuleFinder) finder)
+                .configurePhase(ConfigurableModuleFinder.Phase.LINK_TIME);
+        }
+        ModuleReference mref = finder.find(name).orElseThrow(RuntimeException::new);
+        ModuleReader reader = mref.open();
+        try (InputStream in = reader.open("module-info.class").get()) {
+            ModuleDescriptor md = ModuleDescriptor.read(in);
+            Optional<ModuleHashes> hashes =
+                (Optional<ModuleHashes>) hashesMethod.invoke(md);
+            System.out.format("hashes in module %s %s%n", name,
+                              hashes.isPresent() ? "present" : "absent");
+            if (hashes.isPresent()) {
+                hashes.get().names().stream()
+                    .sorted()
+                    .forEach(n -> System.out.format("  %s %s%n", n, hashes.get().hashFor(n)));
+            }
+            return hashes;
+        } finally {
+            reader.close();
+        }
+    }
+
+    private void deleteDirectory(Path dir) throws IOException {
+        Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
+            @Override
+            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
+                throws IOException
+            {
+                Files.delete(file);
+                return FileVisitResult.CONTINUE;
+            }
+
+            @Override
+            public FileVisitResult postVisitDirectory(Path dir, IOException exc)
+                throws IOException
+            {
+                Files.delete(dir);
+                return FileVisitResult.CONTINUE;
+            }
+        });
+    }
+
+    private void compileModule(String moduleName, Path src) throws IOException {
+        Path msrc = src.resolve(moduleName);
+        assertTrue(CompilerUtils.compile(msrc, mods, "-modulesourcepath", src.toString()));
+    }
+
+    private void jmod(String moduleName, String... options) throws IOException {
+        Path mclasses = mods.resolve(moduleName);
+        Path outfile = jmods.resolve(moduleName + ".jmod");
+        List<String> args = new ArrayList<>();
+        args.add("create");
+        Collections.addAll(args, options);
+        Collections.addAll(args, "--class-path", mclasses.toString(),
+                           outfile.toString());
+
+        if (Files.exists(outfile))
+            Files.delete(outfile);
+
+        runJmod(args);
+    }
+
+    private void runJmod(List<String> args) {
+        int rc = jdk.tools.jmod.Main.run(args.toArray(new String[args.size()]), System.out);
+        System.out.println("jmod options: " + args.stream().collect(Collectors.joining(" ")));
+        if (rc != 0) {
+            throw new AssertionError("Jmod failed: rc = " + rc);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/src/m1/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+module m1 {
+    requires m2;
+    requires m3;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/src/m1/org/m1/Main.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+package org.m1;
+
+import org.m2.Util;
+import org.m3.Name;
+
+public class Main {
+    public static void main(String[] args) {
+        System.out.println(Util.timeOfDay());
+        System.out.println(Name.name());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/src/m2/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+module m2 {
+    exports org.m2;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/src/m2/org/m2/Util.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+package org.m2;
+
+public class Util {
+    private Util() { }
+
+    public static String timeOfDay() {
+        return "Time for lunch";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/src/m3/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+module m3 {
+    exports org.m3;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/src/m3/org/m3/Name.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+package org.m3;
+
+public class Name {
+    private Name() { }
+
+    public static String name() {
+        return "m3";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/src/org.bar/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+module org.bar {
+    requires public m1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/jmod/hashes/src/org.foo/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+module org.foo {
+    requires public org.bar;
+}
--- a/jdk/test/tools/launcher/ToolsOpts.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/launcher/ToolsOpts.java	Wed Jul 05 21:40:37 2017 +0200
@@ -151,29 +151,26 @@
         init();
         TestResult tr;
         int jpos = -1;
+        String xPatch = "-J-Xpatch:jdk.compiler=jdk.compiler";
         for (String arg[] : optionPatterns) {
             jpos = indexOfJoption(arg);
             //Build a cmd string for output in results reporting.
-            String cmdString = javacCmd + " -J-Xpatch:.";
+            String cmdString = javacCmd + " " + xPatch;
             for (String opt : arg) {
                 cmdString = cmdString.concat(" " + opt);
             }
             switch (arg.length) {
                 case 1:
-                    tr = doExec(javacCmd, "-J-Xpatch:.",
-                            arg[0]);
+                    tr = doExec(javacCmd, xPatch, arg[0]);
                     break;
                 case 2:
-                    tr = doExec(javacCmd, "-J-Xpatch:.",
-                            arg[0], arg[1]);
+                    tr = doExec(javacCmd, xPatch, arg[0], arg[1]);
                     break;
                 case 3:
-                    tr = doExec(javacCmd, "-J-Xpatch:.",
-                            arg[0], arg[1], arg[2]);
+                    tr = doExec(javacCmd, xPatch, arg[0], arg[1], arg[2]);
                     break;
                 case 4:
-                    tr = doExec(javacCmd, "-J-Xpatch:.",
-                            arg[0], arg[1], arg[2], arg[3]);
+                    tr = doExec(javacCmd, xPatch, arg[0], arg[1], arg[2], arg[3]);
                     break;
                 default:
                     tr = null;
--- a/jdk/test/tools/launcher/modules/addmods/AddModsTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/launcher/modules/addmods/AddModsTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -47,120 +47,179 @@
     private static final String TEST_SRC = System.getProperty("test.src");
 
     private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
-    private static final Path MODS_DIR = Paths.get("mods");
-
-    // the module name of the library module
-    private static final String LIB_MODULE = "lib";
+    private static final Path MODS1_DIR = Paths.get("mods1");
+    private static final Path MODS2_DIR = Paths.get("mods2");
 
-    // application source directory
-    private static final String APP_SRC = "app";
+    // test module / main class
+    private static final String TEST_MODULE = "test";
+    private static final String TEST_MAIN_CLASS = "test.Main";
+    private static final String TEST_MID = TEST_MODULE + "/" + TEST_MAIN_CLASS;
 
-    // application is compiled to classes
-    private static final Path CLASSES_DIR = Paths.get("classes");
-
-    // application main class
-    private static final String MAIN_CLASS = "app.Main";
+    // logger module
+    private static final String LOGGER_MODULE = "logger";
 
 
     @BeforeTest
     public void compile() throws Exception {
-
-        // javac -d mods/$LIB_MODULE src/$LIB_MODULE/**
+        // javac -d mods1/test src/test/**
         boolean compiled = CompilerUtils.compile(
-            SRC_DIR.resolve(LIB_MODULE),
-            MODS_DIR.resolve(LIB_MODULE)
+            SRC_DIR.resolve(TEST_MODULE),
+            MODS1_DIR.resolve(TEST_MODULE)
         );
-        assertTrue(compiled, "library module did not compile");
+        assertTrue(compiled, "test did not compile");
 
-        // javac -d classes -mp mods src/$APP_DIR/**
-        compiled = CompilerUtils.compile(
-            SRC_DIR.resolve(APP_SRC),
-            CLASSES_DIR,
-            "-mp", MODS_DIR.toString(),
-            "-addmods", LIB_MODULE
+        // javac -d mods1/logger src/logger/**
+        compiled= CompilerUtils.compile(
+            SRC_DIR.resolve(LOGGER_MODULE),
+            MODS2_DIR.resolve(LOGGER_MODULE)
         );
-        assertTrue(compiled, "app did not compile");
+        assertTrue(compiled, "test did not compile");
     }
 
 
     /**
-     * Basic test of -addmods ALL-SYSTEM, using the output of -listmods to
-     * check that the a sample of the system modules are resolved.
+     * Basic test of -addmods ALL-DEFAULT. Module java.sql should be
+     * resolved and the types in that module should be visible.
      */
-    public void testAddSystemModules() throws Exception {
-
-        executeTestJava("-addmods", "ALL-SYSTEM",
-                        "-listmods",
-                        "-m", "java.base")
-            .outputTo(System.out)
-            .errorTo(System.out)
-            .shouldContain("java.sql")
-            .shouldContain("java.corba");
+    public void testAddDefaultModules1() throws Exception {
 
-        // no exit value to check as -m java.base will likely fail
-    }
-
-
-    /**
-     * Run application on class path that makes use of module on the
-     * application module path. Uses {@code -addmods lib}
-     */
-    public void testRunWithAddMods() throws Exception {
-
-        // java -mp mods -addmods lib -cp classes app.Main
+        // java -addmods ALL-DEFAULT -mp mods1 -m test ...
         int exitValue
-            = executeTestJava("-mp", MODS_DIR.toString(),
-                              "-addmods", LIB_MODULE,
-                              "-cp", CLASSES_DIR.toString(),
-                              MAIN_CLASS)
+            = executeTestJava("-mp", MODS1_DIR.toString(),
+                              "-addmods", "ALL-DEFAULT",
+                              "-m", TEST_MID,
+                              "java.sql.Connection")
                 .outputTo(System.out)
                 .errorTo(System.out)
                 .getExitValue();
 
         assertTrue(exitValue == 0);
-
     }
 
     /**
-     * Run application on class path that makes use of module on the
-     * application module path. Uses {@code -addmods ALL-MODULE-PATH}.
+     * Basic test of -addmods ALL-DEFAULT. Module java.annotations.common
+     * should not resolved and so the types in that module should not be
+     * visible.
      */
-    public void testAddAllModulePath() throws Exception {
+    public void testAddDefaultModules2() throws Exception {
+
+        // java -addmods ALL-DEFAULT -mp mods1 -m test ...
+        int exitValue
+            = executeTestJava("-mp", MODS1_DIR.toString(),
+                              "-addmods", "ALL-DEFAULT",
+                              "-m", TEST_MID,
+                              "javax.annotation.Generated")
+                .outputTo(System.out)
+                .errorTo(System.out)
+                .shouldContain("ClassNotFoundException")
+                .getExitValue();
 
-        // java -mp mods -addmods lib -cp classes app.Main
+        assertTrue(exitValue != 0);
+    }
+
+    /**
+     * Basic test of -addmods ALL-SYSTEM. All system modules should be resolved
+     * and thus all types in those modules should be visible.
+     */
+    public void testAddSystemModules() throws Exception {
+
+        // java -addmods ALL-SYSTEM -mp mods1 -m test ...
         int exitValue
-            = executeTestJava("-mp", MODS_DIR.toString(),
-                              "-addmods", "ALL-MODULE-PATH",
-                              "-cp", CLASSES_DIR.toString(),
-                              MAIN_CLASS)
+            = executeTestJava("-mp", MODS1_DIR.toString(),
+                              "-addmods", "ALL-SYSTEM",
+                              "-m", TEST_MID,
+                              "java.sql.Connection",
+                              "javax.annotation.Generated")
                 .outputTo(System.out)
                 .errorTo(System.out)
                 .getExitValue();
 
         assertTrue(exitValue == 0);
-
     }
 
 
     /**
-     * Run application on class path that makes use of module on the
-     * application module path. Does not use -addmods and so will
-     * fail at run-time.
+     * Run test on class path to load a type in a module on the application
+     * module path, uses {@code -addmods logger}.
      */
-    public void testRunMissingAddMods() throws Exception {
+    public void testRunWithAddMods() throws Exception {
 
-        // java -mp mods -cp classes app.Main
+        // java -mp mods -addmods logger -cp classes test.Main
+        String classpath = MODS1_DIR.resolve(TEST_MODULE).toString();
+        String modulepath = MODS2_DIR.toString();
         int exitValue
-            = executeTestJava("-mp", MODS_DIR.toString(),
-                              "-cp", CLASSES_DIR.toString(),
-                              MAIN_CLASS)
+            = executeTestJava("-mp", modulepath,
+                              "-addmods", LOGGER_MODULE,
+                              "-cp", classpath,
+                              TEST_MAIN_CLASS,
+                              "logger.Logger")
                 .outputTo(System.out)
                 .errorTo(System.out)
                 .getExitValue();
 
-        // CNFE or other error/exception
-        assertTrue(exitValue != 0);
+        assertTrue(exitValue == 0);
+    }
+
+     /**
+      * Run application on class path that makes use of module on the
+      * application module path. Does not use -addmods and so should
+      * fail at run-time.
+      */
+     public void testRunMissingAddMods() throws Exception {
+
+         // java -mp mods -cp classes test.Main
+         String classpath = MODS1_DIR.resolve(TEST_MODULE).toString();
+         String modulepath = MODS1_DIR.toString();
+         int exitValue
+             = executeTestJava("-mp", modulepath,
+                               "-cp", classpath,
+                               TEST_MAIN_CLASS,
+                               "logger.Logger")
+                 .outputTo(System.out)
+                 .errorTo(System.out)
+                 .shouldContain("ClassNotFoundException")
+                 .getExitValue();
+
+         assertTrue(exitValue != 0);
+     }
+
 
+    /**
+     * Run test on class path to load a type in a module on the application
+     * module path, uses {@code -addmods ALL-MODULE-PATH}.
+     */
+    public void testAddAllModulePath() throws Exception {
+
+        // java -mp mods -addmods ALL-MODULE-PATH -cp classes test.Main
+        String classpath = MODS1_DIR.resolve(TEST_MODULE).toString();
+        String modulepath = MODS1_DIR.toString();
+        int exitValue
+            = executeTestJava("-mp", modulepath,
+                              "-addmods", "ALL-MODULE-PATH",
+                              "-cp", classpath,
+                              TEST_MAIN_CLASS)
+                .outputTo(System.out)
+                .errorTo(System.out)
+                .getExitValue();
+
+        assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * Test {@code -addmods ALL-MODULE-PATH} without {@code -modulepath}.
+     */
+    public void testAddAllModulePathWithNoModulePath() throws Exception {
+
+        // java -addmods ALL-MODULE-PATH -version
+        int exitValue
+            = executeTestJava("-addmods", "ALL-MODULE-PATH",
+                              "-version")
+                .outputTo(System.out)
+                .errorTo(System.out)
+                .getExitValue();
+
+        assertTrue(exitValue == 0);
     }
 
 
@@ -169,18 +228,17 @@
      */
     public void testRunWithBadAddMods() throws Exception {
 
-        // java -mp mods -addmods,DoesNotExist lib -cp classes app.Main
+        // java -mp mods -addmods DoesNotExist -m test ...
         int exitValue
-            = executeTestJava("-mp", MODS_DIR.toString(),
-                              "-addmods", LIB_MODULE + ",DoesNotExist",
-                              "-cp", CLASSES_DIR.toString(),
-                              MAIN_CLASS)
+            = executeTestJava("-mp", MODS1_DIR.toString(),
+                              "-addmods", "DoesNotExist",
+                              "-m", TEST_MID)
                 .outputTo(System.out)
                 .errorTo(System.out)
+                .shouldContain("DoesNotExist")
                 .getExitValue();
 
         assertTrue(exitValue != 0);
-
     }
 
 }
--- a/jdk/test/tools/launcher/modules/addmods/src/app/Main.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2014, 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.
- */
-
-package app;
-
-import jdk.lib.Util;
-
-public class Main {
-    public static void main(String[] args) {
-        Object obj = Util.makeObject();
-    }
-}
--- a/jdk/test/tools/launcher/modules/addmods/src/lib/jdk/lib/Util.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2014, 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.
- */
-
-package jdk.lib;
-
-public class Util {
-    private Util() { }
-
-    public static Object makeObject() {
-        return new Object();
-    }
-}
--- a/jdk/test/tools/launcher/modules/addmods/src/lib/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 2014, 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.
- */
-
-module lib {
-    exports jdk.lib;
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/addmods/src/logger/logger/Logger.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package logger;
+
+/**
+ * No-op user module for use by the {@code java -addmods} tests.
+ */
+public class Logger {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/addmods/src/logger/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2016, 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.
+ */
+
+module logger { }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/addmods/src/test/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,24 @@
+/**
+ * Copyright (c) 2016, 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.
+ */
+
+module test { }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/modules/addmods/src/test/test/Main.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+package test;
+
+/**
+ * Invoked by tests for the {@code java -addmods} option to check that types
+ * are visible.
+ */
+public class Main {
+    public static void main(String[] args) throws Exception {
+        for (String cn : args) {
+            Class<?> c = Class.forName(cn);
+            System.out.println("Loaded: " + c);
+        }
+    }
+}
--- a/jdk/test/tools/launcher/modules/addreads/AddReadsTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/launcher/modules/addreads/AddReadsTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,7 @@
  * @test
  * @library /lib/testlibrary
  * @modules jdk.compiler
- * @build AddReadsTest CompilerUtils jdk.testlibrary.*
+ * @build AddReadsTest CompilerUtils JarUtils jdk.testlibrary.*
  * @run testng AddReadsTest
  * @summary Basic tests for java -XaddReads
  */
--- a/jdk/test/tools/launcher/modules/patch/PatchTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/launcher/modules/patch/PatchTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -25,7 +25,7 @@
  * @test
  * @library /lib/testlibrary
  * @modules jdk.compiler
- * @build PatchTest CompilerUtils jdk.testlibrary.*
+ * @build PatchTest CompilerUtils JarUtils jdk.testlibrary.*
  * @run testng PatchTest
  * @summary Basic test for -Xpatch
  */
@@ -72,6 +72,9 @@
     private static final Path SRC2_DIR = Paths.get(TEST_SRC, "src2");
     private static final Path PATCHES2_DIR = Paths.get("patches2");
 
+    // destination directory for patches packaged as JAR files
+    private static final Path PATCHES_DIR = Paths.get("patches");
+
 
     // the classes overridden or added with -Xpatch
     private static final String[] CLASSES = {
@@ -95,7 +98,7 @@
 
 
     @BeforeTest
-    public void compile() throws Exception {
+    public void setup() throws Exception {
 
         // javac -d mods/test src/test/**
         boolean compiled= CompilerUtils.compile(SRC_DIR.resolve("test"),
@@ -103,36 +106,40 @@
         assertTrue(compiled, "classes did not compile");
 
         // javac -Xmodule:$MODULE -d patches1/$MODULE patches1/$MODULE/**
+        // jar cf patches/$MODULE-1.jar -C patches1/$MODULE .
         for (Path src : Files.newDirectoryStream(SRC1_DIR)) {
             Path output = PATCHES1_DIR.resolve(src.getFileName());
             String mn = src.getFileName().toString();
             compiled  = CompilerUtils.compile(src, output, "-Xmodule:" + mn);
             assertTrue(compiled, "classes did not compile");
+            JarUtils.createJarFile(PATCHES_DIR.resolve(mn + "-1.jar"), output);
         }
 
         // javac -Xmodule:$MODULE -d patches2/$MODULE patches2/$MODULE/**
+        // jar cf patches/$MODULE-2.jar -C patches2/$MODULE .
         for (Path src : Files.newDirectoryStream(SRC2_DIR)) {
             Path output = PATCHES2_DIR.resolve(src.getFileName());
             String mn = src.getFileName().toString();
             compiled  = CompilerUtils.compile(src, output, "-Xmodule:" + mn);
             assertTrue(compiled, "classes did not compile");
+            JarUtils.createJarFile(PATCHES_DIR.resolve(mn + "-2.jar"), output);
         }
 
     }
 
     /**
-     * Run the test with -Xpatch
+     * Run test with patches to java.base, jdk.naming.dns and jdk.compiler
      */
-    public void testRunWithXPatch() throws Exception {
-
-        // value for -Xpatch
-        String patchPath = PATCHES1_DIR + File.pathSeparator + PATCHES2_DIR;
-
+    void runTest(String basePatches, String dnsPatches, String compilerPatches)
+        throws Exception
+    {
         // the argument to the test is the list of classes overridden or added
         String arg = Stream.of(CLASSES).collect(Collectors.joining(","));
 
         int exitValue
-            =  executeTestJava("-Xpatch:" + patchPath,
+            =  executeTestJava("-Xpatch:java.base=" + basePatches,
+                               "-Xpatch:jdk.naming.dns=" + dnsPatches,
+                               "-Xpatch:jdk.compiler=" + compilerPatches,
                                "-XaddExports:java.base/java.lang2=test",
                                "-XaddExports:jdk.naming.dns/com.sun.jndi.dns=test",
                                "-XaddExports:jdk.naming.dns/com.sun.jndi.dns2=test",
@@ -145,6 +152,44 @@
                 .getExitValue();
 
         assertTrue(exitValue == 0);
+    }
+
+
+    /**
+     * Run test with -Xpatch and exploded patches
+     */
+    public void testWithExplodedPatches() throws Exception {
+
+        // patches1/java.base:patches2/java.base
+        String basePatches = PATCHES1_DIR.resolve("java.base")
+                + File.pathSeparator + PATCHES2_DIR.resolve("java.base");
+
+        String dnsPatches = PATCHES1_DIR.resolve("jdk.naming.dns")
+                + File.pathSeparator + PATCHES2_DIR.resolve("jdk.naming.dns");
+
+        String compilerPatches = PATCHES1_DIR.resolve("jdk.compiler")
+                + File.pathSeparator + PATCHES2_DIR.resolve("jdk.compiler");
+
+        runTest(basePatches, dnsPatches, compilerPatches);
+    }
+
+
+    /**
+     * Run test with -Xpatch and patches in JAR files
+     */
+    public void testWitJarPatches() throws Exception {
+
+        // patches/java.base-1.jar:patches/java-base-2.jar
+        String basePatches = PATCHES_DIR.resolve("java.base-1.jar")
+                + File.pathSeparator + PATCHES_DIR.resolve("java.base-2.jar");
+
+        String dnsPatches = PATCHES_DIR.resolve("jdk.naming.dns-1.jar")
+                +  File.pathSeparator + PATCHES_DIR.resolve("jdk.naming.dns-2.jar");
+
+        String compilerPatches = PATCHES_DIR.resolve("jdk.compiler-1.jar")
+                +  File.pathSeparator + PATCHES_DIR.resolve("jdk.compiler-2.jar");
+
+        runTest(basePatches, dnsPatches, compilerPatches);
 
     }
 
--- a/jdk/test/tools/lib/tests/JImageGenerator.java	Thu May 05 20:01:18 2016 -0700
+++ b/jdk/test/tools/lib/tests/JImageGenerator.java	Wed Jul 05 21:40:37 2017 +0200
@@ -113,7 +113,7 @@
 
     private static final String CMDS_OPTION = "--cmds";
     private static final String CONFIG_OPTION = "--config";
-    private static final String HASH_DEPENDENCIES_OPTION = "--hash-dependencies";
+    private static final String HASH_MODULES_OPTION = "--hash-modules";
     private static final String LIBS_OPTION = "--libs";
     private static final String MODULE_VERSION_OPTION = "--module-version";
 
@@ -347,7 +347,7 @@
         private final List<Path> jmods = new ArrayList<>();
         private final List<String> options = new ArrayList<>();
         private Path output;
-        private String hashDependencies;
+        private String hashModules;
         private String mainClass;
         private String moduleVersion;
 
@@ -356,8 +356,8 @@
             return this;
         }
 
-        public JModTask hashDependencies(String hash) {
-            this.hashDependencies = hash;
+        public JModTask hashModules(String hash) {
+            this.hashModules = hash;
             return this;
         }
 
@@ -430,9 +430,9 @@
                 options.add(CONFIG_OPTION);
                 options.add(toPath(config));
             }
-            if (hashDependencies != null) {
-                options.add(HASH_DEPENDENCIES_OPTION);
-                options.add(hashDependencies);
+            if (hashModules != null) {
+                options.add(HASH_MODULES_OPTION);
+                options.add(hashModules);
             }
             if (mainClass != null) {
                 options.add(MAIN_CLASS_OPTION);
--- a/make/CompileJavaModules.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/make/CompileJavaModules.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -99,7 +99,7 @@
 ################################################################################
 
 java.desktop_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-reference \
-    '-Xdoclint/package:java.*,javax.*'
+    '-Xdoclint/package:java.*,javax.*' -Xlint:-deprecation 
 java.desktop_COPY := .gif .png .wav .txt .xml .css .pf
 java.desktop_CLEAN := iio-plugin.properties cursors.properties
 
--- a/make/CreateBuildJdkCopy.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/make/CreateBuildJdkCopy.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -29,13 +29,15 @@
 include MakeBase.gmk
 include Modules.gmk
 
-MODULES_TO_COPY := $(call FindTransitiveDepsForModule, jdk.jlink) jdk.jlink
+MODULES_TO_COPY := $(sort \
+    $(foreach m, jdk.jlink $(INTERIM_IMAGE_MODULES), \
+      $(call FindTransitiveDepsForModule, $m) $m))
 
 ################################################################################
 # Copy the modules needed to run jlink and jmod. Use bulk copy instead of
 # SetupCopyFiles since there are so many files.
 
-COPY_CLASSES_TARGET := $(BUILDJDK_OUTPUTDIR)/jdk/modules/_buildjdk-copy-maker
+COPY_CLASSES_TARGET := $(BUILDJDK_OUTPUTDIR)/jdk/modules/java.base/_the.buildjdk-copy-marker
 
 $(COPY_CLASSES_TARGET): $(call CacheFind, $(wildcard \
     $(addprefix $(JDK_OUTPUTDIR)/modules/, $(MODULES_TO_COPY))))
@@ -49,15 +51,6 @@
 
 TARGETS += $(COPY_CLASSES_TARGET)
 
-#$(eval $(call SetupCopyFiles, COPY_JDK_MODULES, \
-    SRC := $(BUILD_OUTPUT), \
-    DEST := $(BUILDJDK_OUTPUTDIR), \
-    FILES := $(call DoubleDollar, $(call DoubleDollar, $(call CacheFind, $(wildcard \
-        $(addprefix $(JDK_OUTPUTDIR)/modules/, $(MODULES_TO_COPY)))))), \
-))
-
-#TARGETS += $(COPY_JDK_MODULES)
-
 ################################################################################
 
 $(eval $(call SetupCopyFiles, COPY_SUPPORT_HEADERS, \
--- a/make/CreateJmods.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/make/CreateJmods.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -1,4 +1,4 @@
-#
+
 # Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
@@ -35,6 +35,8 @@
 
 ################################################################################
 
+JMODS_DIR := $(IMAGES_OUTPUTDIR)/jmods
+
 LIBS_DIR := $(firstword $(wildcard $(addsuffix /$(MODULE), \
     $(SUPPORT_OUTPUTDIR)/modules_libs-stripped $(IMPORT_MODULES_LIBS))))
 CMDS_DIR := $(firstword $(wildcard $(addsuffix /$(MODULE), \
@@ -64,15 +66,35 @@
   DEPS += $(call CacheFind, $(CLASSES_DIR))
 endif
 
-# Add dependencies on other jmod files
-DEPS += $(patsubst %, $(IMAGES_OUTPUTDIR)/jmods/%.jmod, \
-    $(call FindDepsForModule, $(MODULE)))
+# Add dependencies on other jmod files. Only java.base needs access to other
+# jmods.
+ifeq ($(MODULE), java.base)
+  # When creating a BUILDJDK, we don't need to add hashes to java.base
+  ifneq ($(CREATING_BUILDJDK), true)
+    DEPS += $(patsubst %, $(JMODS_DIR)/%.jmod, \
+        $(filter-out java.base, $(call FindAllModules)))
+
+    # TODO: find modules that directly and indirectly depend on upgradeable
+    # modules
+    EXCLUDE_HASH_MODULES := $(UPGRADEABLE_MODULES) \
+      java.se.ee \
+      jdk.rmic \
+      jdk.xml.bind \
+      jdk.xml.ws \
+      #
+
+    EXCLUDE_PATTERN := $(strip $(subst $(SPACE),|,$(strip $(EXCLUDE_HASH_MODULES))))
+
+    JMOD_FLAGS += --modulepath $(JMODS_DIR) \
+        --hash-modules '^(?!$(EXCLUDE_PATTERN))'
+  endif
+endif
 
 # TODO: What about headers?
 # Create jmods in a temp dir and then move them into place to keep the
 # module path in $(IMAGES_OUTPUTDIR)/jmods valid at all times.
-$(IMAGES_OUTPUTDIR)/jmods/$(MODULE).jmod: $(DEPS)
-	$(call LogWarn, Creating $(notdir $@))
+$(JMODS_DIR)/$(MODULE).jmod: $(DEPS)
+	$(call LogWarn, Creating $(patsubst $(OUTPUT_ROOT)/%, %, $@))
 	$(call MakeDir, $(@D) $(SUPPORT_OUTPUTDIR)/jmods)
 	$(RM) $@ $(SUPPORT_OUTPUTDIR)/jmods/$(notdir $@)
 	$(JMOD) create \
@@ -80,8 +102,7 @@
             --os-name $(REQUIRED_OS_NAME) \
             --os-arch $(OPENJDK_TARGET_CPU_LEGACY) \
             --os-version $(REQUIRED_OS_VERSION) \
-	    --modulepath $(IMAGES_OUTPUTDIR)/jmods\
-            --hash-dependencies '.*' \
+	        --modulepath $(JMODS_DIR) \
             --exclude '**{_the.*,*.diz,*.debuginfo,*.dSYM/**,*.pdb,*.map}' \
 	    $(JMOD_FLAGS) $(SUPPORT_OUTPUTDIR)/jmods/$(notdir $@)
 	$(MV) $(SUPPORT_OUTPUTDIR)/jmods/$(notdir $@) $@
--- a/make/Images.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/make/Images.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -56,19 +56,11 @@
 JRE_COMPACT2_MODULES := $(JRE_COMPACT1_MODULES) java.compact2 $(COMPACT2_EXTRA_MODULES)
 JRE_COMPACT3_MODULES := $(JRE_COMPACT2_MODULES) java.compact3 $(COMPACT3_EXTRA_MODULES)
 
-# Replacing double-comma with a single comma is to workaround the issue
-# with some version of make on windows that doesn't substitute spaces
-# with one comma properly as with make 4.0
-SubstComma = \
-    $(strip \
-        $(subst $(COMMA)$(COMMA),$(COMMA),$(subst $(SPACE),$(COMMA),$(strip $1))) \
-    )
-
-JRE_MODULES_LIST := $(call SubstComma, $(JRE_MODULES))
-JDK_MODULES_LIST := $(call SubstComma, $(JDK_MODULES))
-JRE_COMPACT1_MODULES_LIST := $(call SubstComma, $(JRE_COMPACT1_MODULES))
-JRE_COMPACT2_MODULES_LIST := $(call SubstComma, $(JRE_COMPACT2_MODULES))
-JRE_COMPACT3_MODULES_LIST := $(call SubstComma, $(JRE_COMPACT3_MODULES))
+JRE_MODULES_LIST := $(call CommaList, $(JRE_MODULES))
+JDK_MODULES_LIST := $(call CommaList, $(JDK_MODULES))
+JRE_COMPACT1_MODULES_LIST := $(call CommaList, $(JRE_COMPACT1_MODULES))
+JRE_COMPACT2_MODULES_LIST := $(call CommaList, $(JRE_COMPACT2_MODULES))
+JRE_COMPACT3_MODULES_LIST := $(call CommaList, $(JRE_COMPACT3_MODULES))
 
 ################################################################################
 # Release file
@@ -364,6 +356,23 @@
 JDK_TARGETS += $(JDK_IMAGE_DIR)/src.zip
 
 ################################################################################
+# classlist
+
+$(eval $(call SetupCopyFiles, JDK_COPY_CLASSLIST, \
+    FILES := $(SUPPORT_OUTPUTDIR)/classlist/classlist, \
+    DEST := $(JDK_IMAGE_DIR)/lib, \
+))
+
+JDK_TARGETS += $(JDK_COPY_CLASSLIST)
+
+$(eval $(call SetupCopyFiles, JRE_COPY_CLASSLIST, \
+    FILES := $(SUPPORT_OUTPUTDIR)/classlist/classlist, \
+    DEST := $(JRE_IMAGE_DIR)/lib, \
+))
+
+JRE_TARGETS += $(JRE_COPY_CLASSLIST)
+
+################################################################################
 # /demo dir
 ifneq ($(findstring images, $(MAKECMDGOALS)), )
   $(eval $(call SetupCopyFiles, JDK_COPY_DEMOS, \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/InterimImage.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2016, 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.
+#
+
+default: all
+
+include $(SPEC)
+include MakeBase.gmk
+include Modules.gmk
+
+################################################################################
+
+# Use this file inside the image as target for make rule
+JIMAGE_TARGET_FILE := bin/java$(EXE_SUFFIX)
+
+INTERIM_MODULES_LIST := $(call CommaList, $(INTERIM_IMAGE_MODULES))
+
+JMODS := $(patsubst %, $(IMAGES_OUTPUTDIR)/jmods/%.jmod, $(INTERIM_IMAGE_MODULES))
+
+JLINK_TOOL := $(JLINK) \
+    --modulepath $(IMAGES_OUTPUTDIR)/jmods \
+    --endian $(OPENJDK_BUILD_CPU_ENDIAN)
+
+$(INTERIM_IMAGE_DIR)/$(JIMAGE_TARGET_FILE): $(JMODS) \
+    $(call DependOnVariable, INTERIM_MODULES_LIST)
+	$(ECHO) Creating interim jimage
+	$(RM) -r $(INTERIM_IMAGE_DIR)
+	$(JLINK_TOOL) \
+	    --output $(INTERIM_IMAGE_DIR) \
+	    --addmods $(INTERIM_MODULES_LIST)
+	$(TOUCH) $@
+
+TARGETS += $(INTERIM_IMAGE_DIR)/$(JIMAGE_TARGET_FILE)
+
+################################################################################
+
+all: $(TARGETS)
+
+.PHONY: all
--- a/make/Main.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/make/Main.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -348,25 +348,35 @@
 ################################################################################
 # Cross compilation support
 
-ifeq ($(CREATE_BUILDJDK), true)
+ifeq ($(CREATING_BUILDJDK), true)
   # This target is only called by the recursive call below.
-  create-buildjdk-compile-hotspot-helper: hotspot
-  create-buildjdk-compile-modules-helper: jdk.jlink-launchers java.base-copy \
-      jdk.jdeps-launchers
+  create-buildjdk-interim-image-helper: interim-image jdk.jlink-launchers \
+      java.base-copy jdk.jdeps-launchers
 endif
 
 create-buildjdk-copy:
 	+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f CreateBuildJdkCopy.gmk)
 
-create-buildjdk-compile-hotspot create-buildjdk-compile-modules:
+create-buildjdk-interim-image:
 	+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Main.gmk \
 	    $@-helper \
 	    SPEC=$(dir $(SPEC))buildjdk-spec.gmk \
 	    HOTSPOT_SPEC=$(dir $(SPEC))buildjdk-spec.gmk \
 	    CREATING_BUILDJDK=true)
 
-ALL_TARGETS += create-buildjdk-copy create-buildjdk-compile-hotspot \
-    create-buildjdk-compile-modules
+ALL_TARGETS += create-buildjdk-copy create-buildjdk-interim-image
+
+################################################################################
+# The interim-image is a small jlinked image that is used to generate artifacts 
+# at build time for use when linking the real images.
+
+interim-image:
+	+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f InterimImage.gmk)
+
+generate-classlist:
+	+($(CD) $(JDK_TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f GenerateClasslist.gmk)
+
+ALL_TARGETS += interim-image generate-classlist
 
 ################################################################################
 # Build tests
@@ -522,10 +532,11 @@
   $(foreach m, $(RMIC_MODULES), $(eval $m-rmic: $m-java))
 
   # Declare dependencies from <module>-lib to <module>-java
-  # Skip modules that do not have java source. When creating a BUILD_JDK, the
-  # java compilation has already been done by the normal build and copied in.
+  # Skip modules that do not have java source.
+  # When creating a BUILDJDK, the java compilation has already been done by the
+  # normal build and copied in.
   ifneq ($(CREATING_BUILDJDK), true)
-  $(foreach m, $(filter $(JAVA_MODULES), $(LIBS_MODULES)), $(eval $m-libs: $m-java))
+    $(foreach m, $(filter $(JAVA_MODULES), $(LIBS_MODULES)), $(eval $m-libs: $m-java))
   endif
 
   # Declare dependencies from all other <module>-lib to java.base-lib
@@ -562,13 +573,21 @@
   $(foreach m, $(GENDATA_MODULES), $(eval $m-strip: $m-gendata))
   $(foreach m, $(COPY_MODULES), $(eval $m-strip: $m-copy))
 
-  # Declare dependencies between jmod targets
-  $(foreach m, $(JMOD_MODULES), \
-      $(eval $m-jmod: $(addsuffix -jmod, $(call FindDepsForModule,$m))))
+  # Declare dependencies between jmod targets. Only java.base jmod needs access
+  # to the other jmods to be built.
+  # When creating a BUILDJDK, we don't need to add hashes to java.base, thus
+  # we don't need to depend on all other jmods
+  ifneq ($(CREATING_BUILDJDK), true)
+    java.base-jmod: $(filter-out java.base-jmod, $(JMOD_TARGETS))
+  endif
 
   # Declare dependencies from <module>-jmod to all other module targets
   $(foreach m, $(STRIP_MODULES), $(eval $m-jmod: $m-strip))
-  $(foreach m, $(JAVA_MODULES), $(eval $m-jmod: $m-java))
+  # When creating a BUILDJDK, the java compilation has already been done by the
+  # normal build and copied in.
+  ifneq ($(CREATING_BUILDJDK), true)
+    $(foreach m, $(JAVA_MODULES), $(eval $m-jmod: $m-java))
+  endif
   $(foreach m, $(GENDATA_MODULES), $(eval $m-jmod: $m-gendata))
   $(foreach m, $(RMIC_MODULES), $(eval $m-jmod: $m-rmic))
   $(foreach m, $(LIBS_MODULES), $(eval $m-jmod: $m-libs))
@@ -577,10 +596,18 @@
 
   # Jmods cannot be created until we have the jlink tool ready to run, which requires
   # all java modules to be compiled and jdk.jlink-launchers.
-  $(JMOD_TARGETS): java java.base-libs jdk.jlink-launchers
+  $(JMOD_TARGETS): java.base-libs jdk.jlink-launchers
+  # When creating a BUILDJDK, the java compilation has already been done by the
+  # normal build and copied in.
+  ifneq ($(CREATING_BUILDJDK), true)
+    $(JMOD_TARGETS): java
+  endif
 
   ifeq ($(CREATE_BUILDJDK), true)
-    $(JMOD_TARGETS): create-buildjdk
+    # Avoid calling create-buildjdk from within a create-buildjdk call
+    ifneq ($(CREATING_BUILDJDK), true)
+      $(JMOD_TARGETS): create-buildjdk
+    endif
   endif
 
   zip-security: java.base-java java.security.jgss-java java.security.jgss-libs \
@@ -590,7 +617,18 @@
 
   jrtfs-jar: interim-langtools
 
-  jimages: jmods zip-source source-tips demos samples jrtfs-jar
+  ifeq ($(CREATE_BUILDJDK), true)
+    # If creating a buildjdk, the interim image needs to be based on that.
+    generate-classlist: create-buildjdk
+  else ifeq ($(EXTERNAL_BUILDJDK), false)
+    # If an external buildjdk has been provided, we skip generating an
+    # interim-image and just use the external buildjdk for generating
+    # classlist.
+    generate-classlist: interim-image
+  endif
+  generate-classlist: buildtools-jdk
+
+  jimages: jmods zip-source source-tips demos samples jrtfs-jar generate-classlist
 
   profiles: jmods zip-source source-tips jrtfs-jar
 
@@ -606,9 +644,12 @@
 
   test: jimages test-image
 
-  create-buildjdk-copy: jdk.jlink-java java.base-gendata
+  create-buildjdk-copy: jdk.jlink-java java.base-gendata \
+      $(addsuffix -java, $(INTERIM_IMAGE_MODULES))
 
-  create-buildjdk-compile-modules: create-buildjdk-copy create-buildjdk-compile-hotspot
+  create-buildjdk-interim-image: create-buildjdk-copy
+
+  interim-image: $(addsuffix -jmod, $(INTERIM_IMAGE_MODULES))
 
   test-make: clean-test-make
 
@@ -682,8 +723,7 @@
 # The "exploded image" is a locally runnable JDK in $(BUILD_OUTPUT)/jdk.
 exploded-image: $(ALL_MODULES)
 
-create-buildjdk: create-buildjdk-compile-modules create-buildjdk-copy \
-    create-buildjdk-compile-hotspot
+create-buildjdk: create-buildjdk-copy create-buildjdk-interim-image
 
 mac-bundles: mac-bundles-jdk
 
@@ -694,10 +734,14 @@
 # (and possibly other, more specific versions)
 product-images: jimages demos samples zip-security exploded-image
 
-# When cross compiling and building a partial BUILDJDK for the build host,
-# the summary generation cannot be run.
+# The module summary cannot be run when:
+# * Cross compiling and building a partial BUILDJDK for the build host
+# * An external buildjdk has been supplied since it may not match the
+#   module selection of the target jdk
 ifneq ($(CREATE_BUILDJDK), true)
-  product-images: generate-summary
+  ifeq ($(EXTERNAL_BUILDJDK), false)
+    product-images: generate-summary
+  endif
 endif
 
 ifeq ($(OPENJDK_TARGET_OS), macosx)
--- a/make/common/JavaCompilation.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/make/common/JavaCompilation.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -181,7 +181,7 @@
   # Extract the info from the java compiler setup.
   $1_JVM := $$($$($1_SETUP)_JVM)
   $1_JAVAC := $$($$($1_SETUP)_JAVAC)
-  $1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS)
+  $1_FLAGS := $$($$($1_SETUP)_FLAGS) $$($1_ADD_JAVAC_FLAGS) $(JAVAC_FLAGS)
   ifneq ($$($1_CLASSPATH), )
     $1_FLAGS += -cp $$(call PathList, $$($1_CLASSPATH))
   endif
--- a/make/common/MakeBase.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/make/common/MakeBase.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -742,6 +742,17 @@
     $(if $(filter $1, $(JVM_VARIANTS)), true, false))
 
 ################################################################################
+# Converts a space separated list to a comma separated list.
+#
+# Replacing double-comma with a single comma is to workaround the issue with
+# some version of make on windows that doesn't substitute spaces with one comma
+# properly.
+CommaList = \
+  $(strip \
+      $(subst $(COMMA)$(COMMA),$(COMMA),$(subst $(SPACE),$(COMMA),$(strip $1))) \
+  )
+
+################################################################################
 
 # Hook to include the corresponding custom file, if present.
 $(eval $(call IncludeCustomExtension, , common/MakeBase.gmk))
--- a/make/common/Modules.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/make/common/Modules.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -38,13 +38,12 @@
 BOOT_MODULES :=
 PLATFORM_MODULES :=
 JRE_TOOL_MODULES :=
+UPGRADEABLE_MODULES :=
+AGGREGATOR_MODULES :=
 
 # Hook to include the corresponding custom file, if present.
 $(eval $(call IncludeCustomExtension, , common/Modules.gmk))
 
-UPGRADEABLE_MDOULES :=
-AGGREGATOR_MDOULES :=
-
 BOOT_MODULES += \
     java.base \
     java.datatransfer \
@@ -73,11 +72,9 @@
 
 # to be deprivileged
 BOOT_MODULES += \
-    java.compiler \
     java.scripting \
     java.sql.rowset \
     java.smartcardio \
-    jdk.charsets \
     jdk.naming.rmi \
     #
 
@@ -104,7 +101,9 @@
     #
 
 PLATFORM_MODULES += \
+    java.compiler \
     jdk.accessibility \
+    jdk.charsets \
     jdk.crypto.ec \
     jdk.crypto.pkcs11 \
     jdk.dynalink \
@@ -129,6 +128,10 @@
   PLATFORM_MODULES += jdk.crypto.ucrypto
 endif
 
+# These modules are included in the interim image which is used to run profiling
+# before building the real images.
+INTERIM_IMAGE_MODULES := java.base java.logging
+
 ################################################################################
 # Some platforms don't have the serviceability agent
 
--- a/nashorn/.hgtags	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/.hgtags	Wed Jul 05 21:40:37 2017 +0200
@@ -350,3 +350,4 @@
 ba21793a0e4816283cc0ecdab5142a4959363529 jdk-9+114
 295ac208a4443d433214d0c1f32d2ea45a3a32d2 jdk-9+115
 208388a5622dcca8227d6ad6c268f2c88087d283 jdk-9+116
+5267e91811614bac129817e566f730e9d63cf22a jdk-9+117
--- a/nashorn/buildtools/nasgen/build.xml	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/buildtools/nasgen/build.xml	Wed Jul 05 21:40:37 2017 +0200
@@ -42,7 +42,7 @@
            destdir="${build.classes.dir}"
            debug="${javac.debug}"
            includeantruntime="false" fork="true">
-      <compilerarg value="-XaddExports:${nasgen.module.imports}"/>
+      <compilerarg line="${nasgen.module.imports}"/>
       <compilerarg value="-Xlint:unchecked"/>
       <compilerarg value="-Xlint:deprecation"/>
       <compilerarg value="-XDignore.symbol.file"/>
--- a/nashorn/buildtools/nasgen/project.properties	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/buildtools/nasgen/project.properties	Wed Jul 05 21:40:37 2017 +0200
@@ -40,8 +40,8 @@
 javac.debug=true
 
 nasgen.module.imports=\
-    java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED,\
-    java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED
+    -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
+    -XaddExports:java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED
 
 meta.inf.dir=${src.dir}/META-INF
 run.classpath=\
--- a/nashorn/make/BuildNashorn.gmk	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/make/BuildNashorn.gmk	Wed Jul 05 21:40:37 2017 +0200
@@ -76,9 +76,10 @@
 ifeq ($(BOOT_JDK_MODULAR), true)
   NASGEN_OPTIONS := \
       -cp $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
-      -Xpatch:$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
+      -Xpatch:java.base=$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
       -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
-      -XaddExports:java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED
+      -XaddExports:java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED \
+      #
 else
   NASGEN_OPTIONS := \
       -Xbootclasspath/p:$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes
--- a/nashorn/make/build-nasgen.xml	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/make/build-nasgen.xml	Wed Jul 05 21:40:37 2017 +0200
@@ -36,7 +36,7 @@
                 <pathelement location="${basedir}/jcov2/lib/jcov_j2se_rt.jar"/>
                 <pathelement location="${basedir}/buildtools/nasgen/dist/nasgen.jar"/>
             </classpath>
-            <jvmarg value="-XaddExports:${nasgen.module.imports}"/>
+            <jvmarg line="${nasgen.module.imports}"/>
             <arg value="${nashorn.module.classes.dir}"/>
             <arg value="jdk.nashorn.internal.objects"/>
             <arg value="${nashorn.module.classes.dir}"/>
--- a/nashorn/make/build.xml	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/make/build.xml	Wed Jul 05 21:40:37 2017 +0200
@@ -35,7 +35,6 @@
     <path id="nashorn.jar.path">
          <pathelement location="${nashorn.jar}"/>
     </path>
-    <property name="nashorn.override.option" value="-Xpatch:${build.classes.dir}"/>
     <condition property="svn.executable" value="/usr/local/bin/svn" else="svn">
       <available file="/usr/local/bin/svn"/>
     </condition>
@@ -176,6 +175,10 @@
       <compilerarg value="-Xdiags:verbose"/>
       <compilerarg value="-parameters"/>
     </javac>
+    <!-- -Xpatch does not like module-info.class files! -->
+    <delete>
+      <fileset dir="${build.classes.dir}" includes="**/module-info.class"/>
+    </delete>
     <javac srcdir="${nashorn.module.src.dir}"
            destdir="${nashorn.module.classes.dir}"
            source="${javac.source}"
@@ -187,8 +190,12 @@
       <compilerarg value="-XDignore.symbol.file"/>
       <compilerarg value="-Xdiags:verbose"/>
       <compilerarg value="-parameters"/>
-      <compilerarg value="${nashorn.override.option}"/>
+      <compilerarg line="${nashorn.override.option}"/>
     </javac>
+    <!-- -Xpatch does not like module-info.class files! -->
+    <delete>
+      <fileset dir="${build.classes.dir}" includes="**/module-info.class"/>
+    </delete>
     <javac srcdir="${nashorn.shell.module.src.dir}"
            destdir="${nashorn.shell.module.classes.dir}"
            source="${javac.source}"
@@ -200,7 +207,7 @@
       <compilerarg value="-XDignore.symbol.file"/>
       <compilerarg value="-Xdiags:verbose"/>
       <compilerarg value="-parameters"/>
-      <compilerarg value="${nashorn.override.option}"/>
+      <compilerarg line="${nashorn.override.option}"/>
     </javac>
     <!-- -Xpatch does not like module-info.class files! -->
     <delete>
@@ -348,11 +355,11 @@
            debug="${javac.debug}"
            encoding="${javac.encoding}"
            includeantruntime="false" fork="true">
-        <compilerarg value="${nashorn.override.option}"/>
+        <compilerarg line="${nashorn.override.option}"/>
         <compilerarg value="-Xlint:unchecked"/>
         <compilerarg value="-Xlint:deprecation"/>
         <compilerarg value="-Xdiags:verbose"/>
-        <compilerarg value="-XaddExports:${test.module.imports}"/>
+        <compilerarg line="${test.module.imports}"/>
     </javac>
 
     <copy todir="${build.test.classes.dir}/META-INF/services">
--- a/nashorn/make/project.properties	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/make/project.properties	Wed Jul 05 21:40:37 2017 +0200
@@ -47,6 +47,11 @@
 build.zip=${build.dir}/nashorn.zip
 build.gzip=${build.dir}/nashorn.tar.gz
 
+nashorn.override.option=\
+ -Xpatch:jdk.scripting.nashorn=${build.classes.dir}/jdk.scripting.nashorn \
+ -Xpatch:jdk.scripting.nashorn.shell=${build.classes.dir}/jdk.scripting.nashorn.shell \
+ -Xpatch:jdk.dynalink=${build.classes.dir}/jdk.dynalink
+
 # project directory of <nashorn> ant task
 nashorntask.dir=buildtools/nashorntask
 
@@ -57,8 +62,8 @@
 nasgen.tool=jdk.nashorn.internal.tools.nasgen.Main
 
 nasgen.module.imports=\
-    java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED,\
-    java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED
+    -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
+    -XaddExports:java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED
 
 # parallel test runner tool
 parallel.test.runner=jdk.nashorn.internal.test.framework.ParallelTestRunner
@@ -132,19 +137,19 @@
     ${file.reference.snakeyaml.jar}
 
 test.module.imports=\
-    jdk.scripting.nashorn/jdk.nashorn.internal.ir=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.codegen=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.parser=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.objects=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.runtime=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.runtime.doubleconv=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.runtime.events=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.runtime.options=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp.joni=ALL-UNNAMED,\
-    jdk.scripting.nashorn/jdk.nashorn.tools=ALL-UNNAMED,\
-    java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.ir=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.codegen=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.parser=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.objects=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.runtime=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.runtime.doubleconv=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.runtime.events=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.runtime.options=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.internal.runtime.regexp.joni=ALL-UNNAMED \
+    -XaddExports:jdk.scripting.nashorn/jdk.nashorn.tools=ALL-UNNAMED \
+    -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
 
 meta.inf.dir=${nashorn.module.src.dir}/META-INF
 
@@ -342,8 +347,8 @@
 
 run.test.jvmargs.common=\
   -server \
-  -XaddExports:${test.module.imports} \
-  -Xpatch:${build.classes.dir} \
+  ${test.module.imports} \
+  ${nashorn.override.option} \
   -Dfile.encoding=UTF-8 \
   -Duser.language=${run.test.user.language} \
   -Duser.country=${run.test.user.country} \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/linker/NashornLinkerExporter.java	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *   - Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *
+ *   - Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ *   - Neither the name of Oracle nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package jdk.nashorn.api.linker;
+
+import java.util.List;
+import jdk.dynalink.linker.GuardingDynamicLinker;
+import jdk.dynalink.linker.GuardingDynamicLinkerExporter;
+import jdk.nashorn.internal.runtime.linker.Bootstrap;
+
+/**
+ * This linker exporter is a service provider that exports Nashorn Dynalink
+ * linkers to external users. Other languague runtimes that use Dynalink
+ * can use the linkers exported by this provider to support tight integration
+ * of Nashorn objects.
+ */
+public final class NashornLinkerExporter extends GuardingDynamicLinkerExporter {
+    /**
+     * The default constructor.
+     */
+    public NashornLinkerExporter() {}
+
+    /**
+     * Returns a list of exported nashorn specific linkers.
+     *
+     * @return list of exported nashorn specific linkers
+     */
+    @Override
+    public List<GuardingDynamicLinker> get() {
+        return Bootstrap.getExposedLinkers();
+    }
+}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java	Wed Jul 05 21:40:37 2017 +0200
@@ -4711,7 +4711,7 @@
         expect(ARROW);
 
         final long functionToken = Token.recast(startToken, ARROW);
-        final IdentNode name = new IdentNode(functionToken, Token.descPosition(functionToken), "=>:" + functionLine);
+        final IdentNode name = new IdentNode(functionToken, Token.descPosition(functionToken), NameCodec.encode("=>:") + functionLine);
         final ParserContextFunctionNode functionNode = createParserContextFunctionNode(name, functionToken, FunctionNode.Kind.ARROW, functionLine, null);
         functionNode.setFlag(FunctionNode.IS_ANONYMOUS);
 
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java	Wed Jul 05 21:40:37 2017 +0200
@@ -33,6 +33,8 @@
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodHandles.Lookup;
 import java.lang.invoke.MethodType;
+import java.util.Collections;
+import java.util.List;
 import jdk.dynalink.CallSiteDescriptor;
 import jdk.dynalink.DynamicLinker;
 import jdk.dynalink.DynamicLinkerFactory;
@@ -70,6 +72,7 @@
     private static final BeansLinker beansLinker = new BeansLinker(Bootstrap::createMissingMemberHandler);
     private static final GuardingDynamicLinker[] prioritizedLinkers;
     private static final GuardingDynamicLinker[] fallbackLinkers;
+
     static {
         final NashornBeansLinker nashornBeansLinker = new NashornBeansLinker(beansLinker);
         prioritizedLinkers = new GuardingDynamicLinker[] {
@@ -90,6 +93,19 @@
     }
 
     /**
+     * Returns a list of exposed nashorn dynalink linkers.
+     *
+     * @return a list of exposed nashorn dynalink linkers.
+     */
+    public static List<GuardingDynamicLinker> getExposedLinkers() {
+        // we have to create BeansLinker without nashorn specific missing member handler!
+        // Or else, we'd return values such as 'undefined' to the external world!
+        final NashornBeansLinker nbl = new NashornBeansLinker(new BeansLinker());
+        final JSObjectLinker linker = new JSObjectLinker(nbl);
+        return Collections.singletonList(linker);
+    }
+
+    /**
      * Creates a Nashorn dynamic linker with the given app class loader.
      * @param appLoader the app class loader. It will be used to discover
      * additional language runtime linkers (if any).
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java	Wed Jul 05 21:40:37 2017 +0200
@@ -71,6 +71,9 @@
     public GuardedInvocation getGuardedInvocation(final LinkRequest request, final LinkerServices linkerServices) throws Exception {
         final Object self = request.getReceiver();
         final CallSiteDescriptor desc = request.getCallSiteDescriptor();
+        if (self == null || !canLinkTypeStatic(self.getClass())) {
+            return null;
+        }
 
         GuardedInvocation inv;
         if (self instanceof JSObject) {
@@ -82,7 +85,7 @@
             inv = new GuardedInvocation(beanInv.getInvocation(),
                 NashornGuards.combineGuards(beanInv.getGuard(), NashornGuards.getNotJSObjectGuard()));
         } else {
-            throw new AssertionError(); // Should never reach here.
+            throw new AssertionError("got instanceof: " + self.getClass()); // Should never reach here.
         }
 
         return Bootstrap.asTypeSafeReturn(inv, linkerServices, desc);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java	Wed Jul 05 21:40:37 2017 +0200
@@ -541,7 +541,7 @@
             @Override
             protected Expression assignmentExpression(final boolean noIn) {
                 exprStart[0] = this.start;
-                return super.expression();
+                return super.assignmentExpression(noIn);
             }
         };
 
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java	Wed Jul 05 21:40:37 2017 +0200
@@ -38,6 +38,10 @@
     exports jdk.nashorn.tools to
         jdk.scripting.nashorn.shell;
 
-    provides javax.script.ScriptEngineFactory with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
+    provides javax.script.ScriptEngineFactory
+        with jdk.nashorn.api.scripting.NashornScriptEngineFactory;
+
+    provides jdk.dynalink.linker.GuardingDynamicLinkerExporter
+        with jdk.nashorn.api.linker.NashornLinkerExporter;
 }
 
--- a/nashorn/test/TEST.ROOT	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/test/TEST.ROOT	Wed Jul 05 21:40:37 2017 +0200
@@ -8,4 +8,7 @@
 groups=TEST.groups
 
 # Minimum jtreg version
-requiredVersion=4.2 b01
+requiredVersion=4.2 b02
+
+# Use new form of -Xpatch
+useNewXpatch=true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8144711.js	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+/**
+ * JDK-8144711: (x) => x + 1 causes Assertion failure instead of SyntaxError
+ *
+ * @test
+ * @run
+ */
+
+try {
+    eval("(x) => x + 1");
+    throw new Error ("should not reach here");
+} catch (e) {
+    Assert.assertTrue(e instanceof SyntaxError);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/es6/JDK-8156492.js	Wed Jul 05 21:40:37 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+/**
+ * JDK-8156492: ClassFormatError thrown when arrow function is used
+ *
+ * @test
+ * @run
+ * @option --language=es6
+ */
+
+Assert.assertTrue((x=>x*2)(3) == 6);
+Assert.assertTrue(((x,y)=>x+y)("hello", "world") == "helloworld");
+var arr = [4, 89, 69];
+Assert.assertTrue(arr.map(x=>x+1).toString() == "5,90,70");
--- a/nashorn/test/src/jdk/dynalink/test/DynamicLinkerFactoryTest.java	Thu May 05 20:01:18 2016 -0700
+++ b/nashorn/test/src/jdk/dynalink/test/DynamicLinkerFactoryTest.java	Wed Jul 05 21:40:37 2017 +0200
@@ -30,10 +30,13 @@
 import java.lang.invoke.MethodType;
 import java.util.List;
 import java.util.ServiceConfigurationError;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
 import jdk.dynalink.CallSiteDescriptor;
 import jdk.dynalink.DynamicLinker;
 import jdk.dynalink.DynamicLinkerFactory;
 import jdk.dynalink.NoSuchDynamicMethodException;
+import jdk.dynalink.NamedOperation;
 import jdk.dynalink.Operation;
 import jdk.dynalink.StandardOperation;
 import jdk.dynalink.linker.GuardingDynamicLinker;
@@ -41,6 +44,7 @@
 import jdk.dynalink.linker.LinkerServices;
 import jdk.dynalink.support.SimpleRelinkableCallSite;
 import jdk.dynalink.linker.GuardedInvocation;
+import jdk.nashorn.api.scripting.AbstractJSObject;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -254,4 +258,55 @@
 
         Assert.assertTrue(reachedAutoLinker);
     }
+
+    @Test
+    public void nashornExportedLinkerJSObjectTest() {
+        final DynamicLinkerFactory factory = newDynamicLinkerFactory(false);
+        final DynamicLinker linker = factory.createLinker();
+
+        final MethodType mt = MethodType.methodType(Object.class, Object.class);
+        final NamedOperation op = new NamedOperation(StandardOperation.GET_PROPERTY, "foo");
+        final CallSite cs = linker.link(new SimpleRelinkableCallSite(new CallSiteDescriptor(
+                MethodHandles.publicLookup(), op, mt)));
+        final boolean[] reachedGetMember = new boolean[1];
+        // check that the nashorn exported linker can be used for user defined JSObject
+        Object obj = new AbstractJSObject() {
+                @Override
+                public Object getMember(String name) {
+                    reachedGetMember[0] = true;
+                    return name.equals("foo")? "bar" : "<unknown>";
+                }
+            };
+
+        Object value = null;
+        try {
+            value = cs.getTarget().invoke(obj);
+        } catch (Throwable th) {
+            throw new RuntimeException(th);
+        }
+
+        Assert.assertTrue(reachedGetMember[0]);
+        Assert.assertEquals(value, "bar");
+    }
+
+    @Test
+    public void nashornExportedLinkerScriptObjectMirrorTest() {
+        final DynamicLinkerFactory factory = newDynamicLinkerFactory(false);
+        final DynamicLinker linker = factory.createLinker();
+
+        // check that the nashorn exported linker can be used for ScriptObjectMirror
+        final ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
+        final MethodType mt = MethodType.methodType(Object.class, Object.class);
+        final NamedOperation op = new NamedOperation(StandardOperation.GET_PROPERTY, "foo");
+        final CallSite cs = linker.link(new SimpleRelinkableCallSite(new CallSiteDescriptor(
+                MethodHandles.publicLookup(), op, mt)));
+        Object value = null;
+        try {
+            final Object obj = engine.eval("({ foo: 'hello' })");
+            value = cs.getTarget().invoke(obj);
+        } catch (Throwable th) {
+            throw new RuntimeException(th);
+        }
+        Assert.assertEquals(value, "hello");
+    }
 }