Merge jdk-9+118
authorduke
Wed, 05 Jul 2017 21:41:01 +0200
changeset 37858 7c04fcb12bd4
parent 37857 efe03e2d9b19 (diff)
parent 37762 13a38cb281f1 (current diff)
child 37859 fceb44d97ec0
child 37860 42b88b96b159
child 37861 53d85619d7fe
child 37868 b550a431c61c
child 37869 e0f538c1694c
child 37873 a5cc1341cf7f
child 37874 02589df0999a
child 37915 be4ff50b6cb6
child 37917 f38083623740
child 37918 21f72dc38a96
child 37926 7f0436090303
child 37927 fe4019feb049
child 37935 e45e72b91a6e
child 37937 a75e084fe3f5
child 37938 42baa89d2156
Merge
--- a/.hgtags-top-repo	Wed Jul 05 21:39:34 2017 +0200
+++ b/.hgtags-top-repo	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/common/autoconf/boot-jdk.m4	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/common/autoconf/buildjdk-spec.gmk.in	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/common/autoconf/generated-configure.sh	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/common/autoconf/spec.gmk.in	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/common/conf/jib-profiles.js	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/corba/.hgtags	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/corba/src/java.corba/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryDynamicBase.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/corba/src/java.corba/share/classes/com/sun/tools/corba/se/idl/som/cff/FileLocator.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/corba/src/java.corba/share/classes/module-info.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/.hgtags	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/classfile/modules.cpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/memory/filemap.cpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/memory/metaspaceShared.hpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/opto/doCall.cpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/runtime/arguments.cpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/runtime/arguments.hpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/src/share/vm/runtime/init.cpp	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/TEST.ROOT	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/AndnTestI.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/AndnTestL.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/jsr292/InvokerGC.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/jsr292/NonInlinedCall/GCTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/jsr292/NonInlinedCall/InvokeTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/jsr292/NonInlinedCall/RedefineTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/jsr292/VMAnonymousClasses.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableBoolean.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableByte.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableChar.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableDouble.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableFloat.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableInt.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableLong.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableMemoryBarrier.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableObject.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableShort.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableUByte.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/stable/TestStableUShort.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/compiler/unsafe/UnsafeGetConstantField.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/SharedArchiveFile/MaxMetaspaceSize.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/modules/AccessCheck/Umod.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/modules/JVMAddReadsModule.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/modules/Visibility/XpatchVisibility.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/modules/Xpatch/Xpatch2Dirs.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchTest.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/modules/Xpatch/XpatchTraceCL.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/hotspot/test/runtime/modules/XpatchCDS.java	Wed Jul 05 21:41:01 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/jaxp/.hgtags	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxp/.hgtags	Wed Jul 05 21:41:01 2017 +0200
@@ -359,3 +359,4 @@
 147114dd0641cd7c9fe6e81642eb993a7b9c6f0b jdk-9+114
 1902a5bda18e794b31fc5f520f5e7d827714b50d jdk-9+115
 9d71d20e614777cd23c1a43b38b5c08a9094d27a jdk-9+116
+46b57560cd06ebcdd21489250628ff5f9d9d8916 jdk-9+117
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/TemplatesImpl.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
  */
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -32,19 +32,26 @@
 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
 import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.io.NotSerializableException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.ObjectStreamField;
 import java.io.Serializable;
-import java.util.Arrays;
-import java.util.Collections;
+import java.lang.module.Configuration;
+import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleFinder;
+import java.lang.module.ModuleReference;
+import java.lang.reflect.Layer;
+import java.lang.reflect.Module;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
-import java.lang.reflect.Module;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
+import java.util.Set;
 import javax.xml.XMLConstants;
 import javax.xml.transform.Templates;
 import javax.xml.transform.Transformer;
@@ -389,6 +396,48 @@
         return _name;
     }
 
+
+    /**
+     * Creates a module layer with one module that is defined to the given class
+     * loader.
+     */
+    private Module createModule(ModuleDescriptor descriptor, ClassLoader loader) {
+        String mn = descriptor.name();
+
+        ModuleReference mref = new ModuleReference(descriptor, null, () -> {
+            IOException ioe = new IOException("<dynamic module>");
+            throw new UncheckedIOException(ioe);
+        });
+
+        ModuleFinder finder = new ModuleFinder() {
+            @Override
+            public Optional<ModuleReference> find(String name) {
+                if (name.equals(mn)) {
+                    return Optional.of(mref);
+                } else {
+                    return Optional.empty();
+                }
+            }
+            @Override
+            public Set<ModuleReference> findAll() {
+                return Set.of(mref);
+            }
+        };
+
+        Layer bootLayer = Layer.boot();
+
+        Configuration cf = bootLayer.configuration()
+                .resolveRequires(finder, ModuleFinder.empty(), Set.of(mn));
+
+        PrivilegedAction<Layer> pa = () -> bootLayer.defineModules(cf, name -> loader);
+        Layer layer = AccessController.doPrivileged(pa);
+
+        Module m = layer.findModule(mn).get();
+        assert m.getLayer() == layer;
+
+        return m;
+    }
+
     /**
      * Defines the translet class and auxiliary classes.
      * Returns a reference to the Class object that defines the main class
@@ -417,29 +466,32 @@
             }
 
             // create a module for the translet
-            Module xmlModule = TemplatesImpl.class.getModule();
+
+            String mn = "jdk.translet";
+
             String pn = _tfactory.getPackageName();
             assert pn != null && pn.length() > 0;
 
-            Module m = Modules.defineModule(loader, "jdk.translet",
-                                            Collections.singleton(pn));
+            ModuleDescriptor descriptor
+                = new ModuleDescriptor.Builder(mn)
+                    .requires("java.xml")
+                    .exports(pn)
+                    .build();
 
-            // jdk.translate reads java.base && java.xml
-            Modules.addReads(m, Object.class.getModule());
-            Modules.addReads(m, xmlModule);
+            Module m = createModule(descriptor, loader);
 
-            // jdk.translet needs access to runtime classes
+            // the module needs access to runtime classes
+            Module thisModule = TemplatesImpl.class.getModule();
             Arrays.asList(Constants.PKGS_USED_BY_TRANSLET_CLASSES).forEach(p -> {
-                xmlModule.addExports(p, m);
+                thisModule.addExports(p, m);
             });
 
-            // jdk.translate also needs to be loose as the XSL may bind to
-            // java types in an unnamed module
-            Modules.addReads(m, null);
+            // For now, the module reads all unnnamed modules. This will be changed once
+            // the XSLT compiler is updated to generate code to invoke addReads.
+            Modules.addReadsAllUnnamed(m);
 
-            // java.xml needs to instanitate the translate class
-            xmlModule.addReads(m);
-            Modules.addExports(m, pn, xmlModule);
+            // java.xml needs to instanitate the translet class
+            thisModule.addReads(m);
 
             for (int i = 0; i < classCount; i++) {
                 _class[i] = loader.defineClass(_bytecodes[i]);
--- a/jaxp/test/ProblemList.txt	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxp/test/ProblemList.txt	Wed Jul 05 21:41:01 2017 +0200
@@ -26,3 +26,6 @@
 # 8147431 
 javax/xml/jaxp/isolatedjdk/catalog/PropertiesTest.sh            generic-all
 
+# 8150145
+javax/xml/jaxp/unittest/common/TransformationWarningsTest.java	generic-all
+
--- a/jaxp/test/TEST.ROOT	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxp/test/TEST.ROOT	Wed Jul 05 21:41:01 2017 +0200
@@ -18,4 +18,4 @@
 groups=TEST.groups 
 
 # Minimum jtreg version
-requiredVersion=4.2 b01
+requiredVersion=4.2 b02
--- a/jaxp/test/javax/xml/jaxp/libs/jaxp/library/TestPolicy.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/TestPolicy.java	Wed Jul 05 21:41:01 2017 +0200
@@ -36,6 +36,7 @@
 import java.util.PropertyPermission;
 import java.util.StringJoiner;
 
+
 /*
  * Simple Policy class that supports the required Permissions to validate the
  * JAXP concrete classes.
@@ -45,6 +46,8 @@
 public class TestPolicy extends Policy {
     protected final PermissionCollection permissions = new Permissions();
 
+    private static Policy defaultPolicy = Policy.getPolicy();
+
     /**
      * Constructor which sets the minimum permissions by default allowing testNG
      * to work with a SecurityManager.
@@ -87,11 +90,8 @@
                 "read"));
         permissions.add(new PropertyPermission("user.dir", "read"));
         permissions.add(new PropertyPermission("test.src", "read"));
-        permissions.add(new PropertyPermission("file.separator", "read"));
-        permissions.add(new PropertyPermission("line.separator", "read"));
         permissions.add(new PropertyPermission("fileStringBuffer", "read"));
         permissions.add(new PropertyPermission("dataproviderthreadcount", "read"));
-        permissions.add(new RuntimePermission("charsetProvider"));
     }
 
     /*
@@ -145,6 +145,9 @@
 
     @Override
     public boolean implies(ProtectionDomain domain, Permission perm) {
+        if (defaultPolicy.implies(domain, perm))
+            return true;
+
         return permissions.implies(perm);
     }
 }
--- a/jaxws/.hgtags	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxws/.hgtags	Wed Jul 05 21:41:01 2017 +0200
@@ -362,3 +362,4 @@
 b314bb02182b9ca94708a91f312c377f5435f740 jdk-9+114
 4ff86e5489e4c0513dadfa69def8601c110ca5cd jdk-9+115
 529f0bf896e58525614d863e283ad155531941cb jdk-9+116
+58265b39fc74b932bda4d4f4649c530a89f55c4e jdk-9+117
--- a/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/SchemaGenerator.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/jxc/SchemaGenerator.java	Wed Jul 05 21:41:01 2017 +0200
@@ -140,6 +140,9 @@
         aptargs.add("-cp");
         aptargs.add(setClasspath(options.classpath)); // set original classpath + jaxb-api to be visible to annotation processor
 
+        aptargs.add("-addmods");
+        aptargs.add("java.xml.bind");
+
         if(options.targetDir!=null) {
             aptargs.add("-d");
             aptargs.add(options.targetDir.getPath());
--- a/jaxws/src/jdk.xml.ws/share/classes/com/sun/tools/internal/ws/wscompile/WsgenTool.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxws/src/jdk.xml.ws/share/classes/com/sun/tools/internal/ws/wscompile/WsgenTool.java	Wed Jul 05 21:41:01 2017 +0200
@@ -162,6 +162,8 @@
         boolean bootCP = useBootClasspath(EndpointReference.class) || useBootClasspath(XmlSeeAlso.class);
         List<String> args = new ArrayList<String>(6 + (bootCP ? 1 : 0) + (options.nocompile ? 1 : 0)
                 + (options.encoding != null ? 2 : 0));
+        args.add("-addmods");
+        args.add("java.xml.ws");
         args.add("-d");
         args.add(options.destDir.getAbsolutePath());
         args.add("-classpath");
--- a/jaxws/src/jdk.xml.ws/share/classes/com/sun/tools/internal/ws/wscompile/WsimportTool.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/jaxws/src/jdk.xml.ws/share/classes/com/sun/tools/internal/ws/wscompile/WsimportTool.java	Wed Jul 05 21:41:01 2017 +0200
@@ -525,6 +525,8 @@
             String classpathString = createClasspathString();
             boolean bootCP = useBootClasspath(EndpointContext.class) || useBootClasspath(JAXBPermission.class);
             List<String> args = new ArrayList<String>();
+            args.add("-addmods");
+            args.add("java.xml.ws");
             args.add("-d");
             args.add(classDir);
             args.add("-classpath");
--- a/jdk/.hgtags	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/.hgtags	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/Tools.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/data/x11wrappergen/sizes.32	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/data/x11wrappergen/sizes.64	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/data/x11wrappergen/sizes.64-solaris-i386	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/data/x11wrappergen/xlibtypes.txt	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/gendata/Gendata-java.base.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/gendata/GendataBreakIterator.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/launcher/Launcher-java.desktop.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/launcher/Launcher-java.scripting.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.compiler.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.javadoc.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.jlink.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/linux/native/libnio/ch/EPollArrayWrapper.c	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/macosx/classes/sun/nio/ch/KQueueArrayWrapper.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystem.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystemProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/HmacCore.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/SunJCE.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/io/File.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/Class.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessBuilder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/StackFrameInfo.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/StackStreamFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/StackWalker.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/System.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/Invokers.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarForm.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandleGuards.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandles.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandle.java.template	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/Configuration.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleInfo.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModulePath.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReference.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReferences.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/Resolver.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Layer.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Module.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Proxy.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/math/BigDecimal.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/math/RoundingMode.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/net/InetAddress.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/net/ProxySelector.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/net/SocksSocketImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/net/URL.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/net/URLConnection.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/net/URLEncoder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/channels/spi/AsynchronousChannelProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/channels/spi/SelectorProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/charset/Charset.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/file/TempFileHelper.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/security/Policy.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/security/Provider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/security/SecureRandom.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/security/SecureRandomSpi.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/time/zone/ZoneRulesProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/Currency.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/List.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/Locale.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/Map.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/PropertyResourceBundle.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/ServiceLoader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/Set.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/TimeZone.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/jar/JarFile.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/jar/JavaUtilJarAccessImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/jar/Pack200.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/regex/PatternSyntaxException.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/zip/ZipOutputStream.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLServerSocketFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocketFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/javax/security/auth/login/Configuration.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/javax/security/auth/login/LoginContext.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/Version.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtFileSystemProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BootLoader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/URLClassPath.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/logger/LoggerFinderLoader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/logger/SimpleConsoleLogger.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangReflectModuleAccess.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaUtilJarAccess.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ServicesCatalog.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/SystemModules.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/MethodAccessorGenerator.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/module-info.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/ResourceManager.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/ftp/FtpClientProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/sdp/SdpSupport.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/smtp/SmtpClient.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/MimeLauncher.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/AuthenticationHeader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/https/HttpsClient.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/netdoc/Handler.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/Net.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/ThreadPool.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/Util.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/FastCharsetProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/StandardCharsets.java.template	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/fs/Util.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/action/GetIntegerAction.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/action/GetPropertyAction.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/jca/ProviderConfig.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/pkcs/PKCS8Key.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/provider/DSAKeyFactory.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SHA5.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SunEntries.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/rsa/RSAKeyFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ClientKeyExchangeService.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/Debug.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HelloExtensions.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/StatusResponseManager.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/util/Debug.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/util/KeyStoreDelegator.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509Key.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarSystem.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/LocalGregorianCalendar.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/conf/security/java.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/share/conf/security/java.security	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystem.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/solaris/native/libnio/ch/DevPollArrayWrapper.c	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/java/io/UnixFileSystem.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/java/net/DefaultDatagramSocketImplFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/net/NetHooks.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/net/sdp/SdpProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/DefaultFileSystemProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixFileSystem.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/windows/classes/java/io/WinNTFileSystem.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsFileAttributes.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibleText.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityAction.m	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaTextAccessibility.m	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.m	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/awt/image/BufImgSurfaceData.c	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/SurfaceData.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/ByteIndexed.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/FourByteAbgr.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/FourByteAbgrPre.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgb.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgbBm.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/IntArgbPre.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/share/native/libawt/java2d/loops/LoopMacros.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/unix/native/common/awt/colordata.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk2_interface.c	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/unix/native/libawt_xawt/awt/gtk_interface.c	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/colordata.h	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/AsyncSSLDelegate.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/FilterFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/HttpClientImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/SSLDelegate.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.httpclient/share/classes/java/net/http/Utils.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.instrument/share/classes/sun/instrument/InstrumentationImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.logging/share/classes/java/util/logging/MemoryHandler.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.management/share/classes/javax/management/MBeanServerFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.management/share/classes/javax/management/remote/JMXConnectorFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.naming/share/classes/com/sun/naming/internal/FactoryEnumeration.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.naming/share/classes/com/sun/naming/internal/ResourceManager.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.naming/share/classes/javax/naming/ldap/StartTlsRequest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.naming/share/classes/javax/naming/spi/NamingManager.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.prefs/share/classes/java/util/prefs/Preferences.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.rmi/share/classes/java/rmi/activation/ActivationID.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.rmi/share/classes/java/rmi/server/RMIClassLoader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.rmi/share/classes/java/rmi/server/RemoteObject.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/Activation.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.smartcardio/share/classes/javax/smartcardio/TerminalFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/CachedRowSetImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SQLInputImpl.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/spi/SyncFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverSpi.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.accessibility/share/classes/com/sun/java/accessibility/util/Translator.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.charsets/share/classes/sun/nio/cs/ext/AbstractCharsetProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Util.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/SunPKCS11.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/native/libj2ucrypto/nativeCrypto.c	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.httpserver/share/classes/com/sun/net/httpserver/spi/HttpServerProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/TerminalFactory.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/WindowsTerminal.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/console/internal/ConsoleRunner.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/ProcessAttachingConnector.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/RawCommandLineLauncher.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/builder/ImageBuilder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageFileCreator.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginConfiguration.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImagePluginStack.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OptimizationPlugin.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModuleDescriptorPlugin.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/plugin/Plugin.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/provider/LocaleDataProvider.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/JarFileSystem.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileAttributes.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipPath.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/ProblemList.txt	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/TEST.ROOT	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/TEST.groups	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/com/sun/corba/5036554/TestCorbaBug.sh	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/com/sun/corba/se/impl/io/HookPutFieldsTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/com/sun/corba/se/impl/orb/SetDefaultORBTest.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/com/sun/net/httpserver/bugs/B6373555.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/lang/StackWalker/EmbeddedStackWalkTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/lang/StackWalker/StackRecorderUtil.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/lang/invoke/VarargsArrayTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/lang/module/ModuleFinderTest.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/QuickResponses.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/Server.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/SplitResponse.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/http2/BasicTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestExchange.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/http2/java.httpclient/java/net/http/Http2TestServerConnection.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/0.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/1.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/10.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/11.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/12.policy	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/15.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/2.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/3.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/4.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/5.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/6.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/7.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/8.policy	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/9.policy	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/net/httpclient/security/Security.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/nio/channels/AsynchronousSocketChannel/Basic.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/nio/channels/FileChannel/InterruptMapDeadlock.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/nio/charset/spi/basic.sh	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/nio/charset/spi/default-pol	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/security/SecureRandom/Serialize.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/time/tck/java/time/format/TCKDateTimeFormatterBuilder.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/time/test/java/time/format/TestDateTimeFormatterBuilder.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/java/util/jar/JarFile/MultiReleaseJarHttpProperties.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/crypto/Cipher/CipherStreamClose.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/smartcardio/CommandAPDUTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/smartcardio/HistoricalBytes.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/smartcardio/ResponseAPDUTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/smartcardio/Serialize.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/smartcardio/TerminalFactorySpiTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/smartcardio/TestCardPermission.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/smartcardio/TestCommandAPDU.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/xml/jaxp/common/8035437/run.sh	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/xml/soap/XmlTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/xml/ws/8043129/MailTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/xml/ws/clientjar/TestWsImport.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/xml/ws/publish/WSTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/javax/xml/ws/xsanymixed/Test.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/jdk/nio/zipfs/Basic.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/jdk/nio/zipfs/PathOps.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/sun/net/www/protocol/jar/MultiReleaseJarURLConnection.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.java	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/sun/security/provider/PolicyFile/Modules.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/sun/security/provider/SecureRandom/StrongSeedReader.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jar/modularJar/Basic.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jar/modularJar/src/bar/jdk/test/bar/Bar.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jlink/ImageFileCreatorTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jlink/IntegrationTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jlink/JLink2Test.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jlink/JLinkTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jlink/plugins/FileCopierPluginTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jlink/plugins/IncludeLocalesPluginTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/jmod/JmodNegativeTest.java	Wed Jul 05 21:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/launcher/ToolsOpts.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/launcher/modules/addmods/AddModsTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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	Wed Jul 05 21:39:34 2017 +0200
+++ /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:41:01 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:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/launcher/modules/addreads/AddReadsTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/launcher/modules/patch/PatchTest.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/jdk/test/tools/lib/tests/JImageGenerator.java	Wed Jul 05 21:41:01 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/langtools/.hgtags	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/.hgtags	Wed Jul 05 21:41:01 2017 +0200
@@ -359,3 +359,4 @@
 cba09a2e6ae969b029783eb59bb01017b78f8eef jdk-9+114
 31c8b18fdc5b94a2ddd5ea0694f350a2c907e9f7 jdk-9+115
 3e3553ee39d9e081573bc7c88a252214a3152763 jdk-9+116
+59adcdd0cd3b6724b4fc0083c258bf4682689f2f jdk-9+117
--- a/langtools/make/build.xml	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/make/build.xml	Wed Jul 05 21:41:01 2017 +0200
@@ -83,6 +83,17 @@
     <property name="build.jtreg" location="${build.dir}/jtreg"/>
     <property name="build.prevsrc" location="${build.dir}/prevsrc"/>
 
+    <pathconvert property="modules.names" pathsep=",">
+        <globmapper from="${src.dir}/*" to="*" />
+        <dirset dir="${src.dir}" includes="*.*"/>
+    </pathconvert>
+
+    <pathconvert property="xpatch.rest" pathsep=" -Xpatch:">
+        <regexpmapper from="${file.separator}([^${file.separator}]+)$" to="\1=${build.modules}${file.separator}\1" />
+        <dirset dir="${src.dir}" includes="*.*"/>
+    </pathconvert>
+
+    <property name="xpatch.cmd" value="-Xpatch:${xpatch.rest}"/>
 
     <!-- java.marker is set to a marker file to check for within a Java install dir.
          The best file to check for across Solaris/Linux/Windows/MacOS is one of the
@@ -190,7 +201,7 @@
             <arg line="-source ${javac.source} -target ${javac.target}" />
             <arg value="-d" />
             <arg value="${build.modules}" />
-            <arg line="${javac.opts} -modulesourcepath ${src.dir}${file.separator}*${file.separator}share${file.separator}classes:${build.gensrc} -m java.compiler,jdk.compiler,jdk.javadoc,jdk.jdeps,jdk.jshell" />
+            <arg line="${javac.opts} -modulesourcepath ${src.dir}${file.separator}*${file.separator}share${file.separator}classes:${build.gensrc} -m ${modules.names}" />
         </exec>
         <delete>
             <fileset dir="${build.modules}" includes="**/module-info.class"/>
@@ -229,7 +240,7 @@
         <replace file=".idea/ant.xml" token="@IDEA_JTREG_HOME@" value="${idea.jtreg.home}"/>
         <replace file=".idea/ant.xml" token="@IDEA_TARGET_JDK@" value="${idea.target.jdk}"/>
         <replace file=".idea/workspace.xml" token="@IDEA_TARGET_JDK@" value="${idea.target.jdk}"/>
-        <replace file=".idea/workspace.xml" token="@FILE_SEP@" value="${file.separator}"/>
+        <replace file=".idea/workspace.xml" token="@XPATCH@" value="${xpatch.cmd}"/>
         <replace file=".idea/workspace.xml" token="@PATH_SEP@" value="${path.separator}"/>
         <mkdir dir=".idea/classes"/>
         <javac srcdir="make/intellij/src"
@@ -285,6 +296,7 @@
             <attribute name="bin.dir" default="${build.bin}"/>
             <attribute name="java" default="${launcher.java}"/>
             <attribute name="main.class" default="${tool.@{name}.main.class}"/>
+            <attribute name="xpatch" default="${xpatch.cmd}"/>
             <sequential>
                 <mkdir dir="@{bin.dir}"/>
                 <copy file="${make.dir}/launcher.sh-template" tofile="@{bin.dir}/@{name}">
@@ -292,6 +304,7 @@
                         <filter token="PROGRAM" value="@{main.class}"/>
                         <filter token="TARGET_JAVA" value="@{java}"/>
                         <filter token="PS" value="${path.separator}"/>
+                        <filter token="XPATCH" value="${xpatch.cmd}"/>
                     </filterset>
                 </copy>
                 <chmod file="@{bin.dir}/@{name}" perm="ugo+rx"/>
@@ -330,7 +343,7 @@
                     jdk="@{jdk}"
                     agentvm="@{agentvm}" verbose="@{verbose}"
                     failonerror="false" resultproperty="jtreg.@{name}.result"
-                    vmoptions="${coverage.options} @{extra.jvmargs} -Xpatch:@{build.modules}">
+                    vmoptions="${coverage.options} @{extra.jvmargs} ${xpatch.cmd}">
                     <arg value="-debug:@{jpda.jvmargs}"/>
                     <arg line="@{keywords}"/>
                     <arg line="@{options}"/>
--- a/langtools/make/intellij/workspace.xml	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/make/intellij/workspace.xml	Wed Jul 05 21:41:01 2017 +0200
@@ -10,7 +10,7 @@
     <!-- javac -->
     <configuration default="false" name="javac" type="Application" factoryName="Application">
       <option name="MAIN_CLASS_NAME" value="com.sun.tools.javac.Main" />
-      <option name="VM_PARAMETERS" value="-Xpatch:build@FILE_SEP@modules" />
+      <option name="VM_PARAMETERS" value="@XPATCH@" />
       <option name="PROGRAM_PARAMETERS" value="" />
       <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
@@ -30,7 +30,7 @@
     <!-- javadoc -->
     <configuration default="false" name="javadoc" type="Application" factoryName="Application">
       <option name="MAIN_CLASS_NAME" value="com.sun.tools.javadoc.Main" />
-      <option name="VM_PARAMETERS" value="-Xpatch:build@FILE_SEP@modules" />
+      <option name="VM_PARAMETERS" value="@XPATCH@" />
       <option name="PROGRAM_PARAMETERS" value="" />
       <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
@@ -50,7 +50,7 @@
     <!-- javap -->
     <configuration default="false" name="javap" type="Application" factoryName="Application">
       <option name="MAIN_CLASS_NAME" value="com.sun.tools.javap.Main" />
-      <option name="VM_PARAMETERS" value="-Xpatch:build@FILE_SEP@modules" />
+      <option name="VM_PARAMETERS" value="@XPATCH@" />
       <option name="PROGRAM_PARAMETERS" value="" />
       <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
@@ -70,7 +70,7 @@
     <!-- javah -->
     <configuration default="false" name="javah" type="Application" factoryName="Application">
       <option name="MAIN_CLASS_NAME" value="com.sun.tools.javah.Main" />
-      <option name="VM_PARAMETERS" value="-Xpatch:build@FILE_SEP@modules" />
+      <option name="VM_PARAMETERS" value="@XPATCH@" />
       <option name="PROGRAM_PARAMETERS" value="" />
       <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
@@ -90,7 +90,7 @@
     <!-- sjavac -->
     <configuration default="false" name="sjavac" type="Application" factoryName="Application">
       <option name="MAIN_CLASS_NAME" value="com.sun.tools.sjavac.Main" />
-      <option name="VM_PARAMETERS" value="-Xpatch:build@FILE_SEP@modules" />
+      <option name="VM_PARAMETERS" value="@XPATCH@" />
       <option name="PROGRAM_PARAMETERS" value="" />
       <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
@@ -111,7 +111,7 @@
     <configuration default="false" name="jshell" type="Application" factoryName="Application">
       <extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
       <option name="MAIN_CLASS_NAME" value="jdk.internal.jshell.tool.JShellTool" />
-      <option name="VM_PARAMETERS" value="-Xpatch:build@FILE_SEP@modules -XaddExports:jdk.jshell/jdk.internal.jshell.tool=ALL-UNNAMED" />
+      <option name="VM_PARAMETERS" value="@XPATCH@ -XaddExports:jdk.jshell/jdk.internal.jshell.tool=ALL-UNNAMED" />
       <option name="PROGRAM_PARAMETERS" value="" />
       <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
       <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
--- a/langtools/make/launcher.sh-template	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/make/launcher.sh-template	Wed Jul 05 21:41:01 2017 +0200
@@ -25,17 +25,6 @@
 # questions.
 #
 
-mydir="`dirname $0`"
-case `uname -s` in
-    CYGWIN*)
-      mydir=`cygpath -m $mydir`
-      ;;
-esac
-mylib="$mydir/../modules"
-
-# patch langtools modules
-bcp=-Xpatch:"$mylib"
-
 # tools currently assumes that assertions are enabled in the launcher
 ea=-ea:com.sun.tools...
 
@@ -59,4 +48,4 @@
 unset DUALCASE
 
 IFS=$nl
-"#TARGET_JAVA#" $bcp ${ea} ${javaOpts} #PROGRAM# ${toolOpts}
+"#TARGET_JAVA#" "#XPATCH#" ${ea} ${javaOpts} #PROGRAM# ${toolOpts}
--- a/langtools/make/tools/crules/CodingRulesAnalyzerPlugin.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/make/tools/crules/CodingRulesAnalyzerPlugin.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2015, 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
@@ -48,6 +48,13 @@
 import com.sun.tools.javac.util.DefinedBy.Api;
 import com.sun.tools.javac.util.Log;
 
+/*
+ * This code must be run in a context that provides
+ * access to the following javac internal packages:
+ *      com.sun.tools.javac.api
+ *      com.sun.tools.javac.tree
+ *      com.sun.tools.javac.util
+ */
 public class CodingRulesAnalyzerPlugin implements Plugin {
 
     protected Log log;
@@ -55,11 +62,6 @@
 
     @DefinedBy(Api.COMPILER_TREE)
     public void init(JavacTask task, String... args) {
-        addExports("jdk.compiler",
-                "com.sun.tools.javac.api",
-                "com.sun.tools.javac.code",
-                "com.sun.tools.javac.tree",
-                "com.sun.tools.javac.util");
         BasicJavacTask impl = (BasicJavacTask)task;
         Context context = impl.getContext();
         log = Log.instance(context);
--- a/langtools/make/tools/crules/MutableFieldsAnalyzer.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/make/tools/crules/MutableFieldsAnalyzer.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2014, 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
@@ -25,8 +25,10 @@
 
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import com.sun.source.util.JavacTask;
 import com.sun.source.util.TaskEvent.Kind;
@@ -48,16 +50,8 @@
     }
 
     private boolean ignoreField(String className, String field) {
-        List<String> currentFieldsToIgnore =
-                classFieldsToIgnoreMap.get(className);
-        if (currentFieldsToIgnore != null) {
-            for (String fieldToIgnore : currentFieldsToIgnore) {
-                if (field.equals(fieldToIgnore)) {
-                    return true;
-                }
-            }
-        }
-        return false;
+        Set<String> fieldsToIgnore = classFieldsToIgnoreMap.get(className);
+        return (fieldsToIgnore) != null && fieldsToIgnore.contains(field);
     }
 
     class MutableFieldsVisitor extends TreeScanner {
@@ -89,34 +83,29 @@
 
     private static final String packageToCheck = "com.sun.tools.javac";
 
-    private static final Map<String, List<String>> classFieldsToIgnoreMap =
+    private static final Map<String, Set<String>> classFieldsToIgnoreMap =
                 new HashMap<>();
 
+    private static void ignoreFields(String className, String... fieldNames) {
+        classFieldsToIgnoreMap.put(className, new HashSet<>(Arrays.asList(fieldNames)));
+    };
+
     static {
-        classFieldsToIgnoreMap.
-                put("com.sun.tools.javac.util.JCDiagnostic",
-                    Arrays.asList("fragmentFormatter"));
-        classFieldsToIgnoreMap.
-                put("com.sun.tools.javac.util.JavacMessages",
-                    Arrays.asList("defaultBundle", "defaultMessages"));
-        classFieldsToIgnoreMap.
-                put("com.sun.tools.javac.file.ZipFileIndexCache",
-                    Arrays.asList("sharedInstance"));
-        classFieldsToIgnoreMap.
-                put("com.sun.tools.javac.file.JRTIndex",
-                    Arrays.asList("sharedInstance"));
-        classFieldsToIgnoreMap.
-                put("com.sun.tools.javac.main.JavaCompiler",
-                    Arrays.asList("versionRB"));
-        classFieldsToIgnoreMap.
-                put("com.sun.tools.javac.code.Type",
-                    Arrays.asList("moreInfo"));
-        classFieldsToIgnoreMap.
-                put("com.sun.tools.javac.util.SharedNameTable",
-                    Arrays.asList("freelist"));
-        classFieldsToIgnoreMap.
-                put("com.sun.tools.javac.util.Log",
-                    Arrays.asList("useRawMessages"));
+        ignoreFields("com.sun.tools.javac.util.JCDiagnostic", "fragmentFormatter");
+        ignoreFields("com.sun.tools.javac.util.JavacMessages", "defaultBundle", "defaultMessages");
+        ignoreFields("com.sun.tools.javac.file.JRTIndex", "sharedInstance");
+        ignoreFields("com.sun.tools.javac.main.JavaCompiler", "versionRB");
+        ignoreFields("com.sun.tools.javac.code.Type", "moreInfo");
+        ignoreFields("com.sun.tools.javac.util.SharedNameTable", "freelist");
+        ignoreFields("com.sun.tools.javac.util.Log", "useRawMessages");
+        ignoreFields("com.sun.tools.javac.util.ModuleWrappers$ModuleFinderHelper",
+                "moduleFinderInterface", "ofMethod", "emptyMethod");
+        ignoreFields("com.sun.tools.javac.util.ModuleWrappers$ConfigurationHelper",
+                "configurationClass", "resolveRequiresAndUsesMethod");
+        ignoreFields("com.sun.tools.javac.util.ModuleWrappers$LayerHelper",
+                "layerClass", "bootMethod", "defineModulesWithOneLoaderMethod", "configurationMethod");
+        ignoreFields("com.sun.tools.javac.util.ModuleHelper",
+                "addExportsMethod", "getUnnamedModuleMethod", "getModuleMethod");
     }
 
 }
--- a/langtools/make/tools/propertiesparser/PropertiesParser.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/make/tools/propertiesparser/PropertiesParser.java	Wed Jul 05 21:41:01 2017 +0200
@@ -28,24 +28,10 @@
 import propertiesparser.parser.MessageFile;
 import propertiesparser.gen.ClassGenerator;
 
-import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.lang.RuntimeException;
-import java.lang.Throwable;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
+import java.io.PrintStream;
 import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 
 /** Translates a .properties file into a .java file containing an enum-like Java class
  *  which defines static factory methods for all resource keys in a given resource file. <P>
@@ -64,13 +50,17 @@
     }
 
     public static void main(String[] args) {
-        PropertiesParser pp = new PropertiesParser(msg -> System.out.println(msg));
-        boolean ok = pp.run(args);
+        boolean ok = run(args, System.out);
         if ( !ok ) {
             System.exit(1);
         }
     }
 
+    public static boolean run(String[] args, PrintStream out) {
+        PropertiesParser pp = new PropertiesParser(msg -> out.println(msg));
+        return pp.run(args);
+    }
+
     public static interface Logger {
         void info(String msg);
     }
--- a/langtools/src/java.compiler/share/classes/javax/lang/model/util/Elements.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/java.compiler/share/classes/javax/lang/model/util/Elements.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, 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
@@ -49,12 +49,22 @@
     /**
      * Returns a package given its fully qualified name.
      *
-     * @param name  fully qualified package name, or "" for an unnamed package
+     * @param name  fully qualified package name, or an empty string for an unnamed package
      * @return the named package, or {@code null} if it cannot be found
      */
     PackageElement getPackageElement(CharSequence name);
 
     /**
+     * Returns a package given its fully qualified name, as seen from the given module.
+     *
+     * @param name  fully qualified package name, or an empty string for an unnamed package
+     * @param module module relative to which the lookup should happen
+     * @return the named package, or {@code null} if it cannot be found
+     * @since 9
+     */
+    PackageElement getPackageElement(ModuleElement module, CharSequence name);
+
+    /**
      * Returns a type element given its canonical name.
      *
      * @param name  the canonical name
@@ -63,6 +73,16 @@
     TypeElement getTypeElement(CharSequence name);
 
     /**
+     * Returns a type element given its canonical name, as seen from the given module.
+     *
+     * @param name  the canonical name
+     * @param module module relative to which the lookup should happen
+     * @return the named type element, or {@code null} if it cannot be found
+     * @since 9
+     */
+    TypeElement getTypeElement(ModuleElement module, CharSequence name);
+
+    /**
      * Returns a module element given its fully qualified name.
      *
      * @param name  the name
--- a/langtools/src/java.compiler/share/classes/javax/tools/ToolProvider.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/java.compiler/share/classes/javax/tools/ToolProvider.java	Wed Jul 05 21:41:01 2017 +0200
@@ -27,6 +27,8 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.Iterator;
 import java.util.ServiceConfigurationError;
 import java.util.ServiceLoader;
@@ -145,23 +147,26 @@
     }
 
     /**
-     * Determine if this is tho desired tool instance.
+     * Determine if this is the desired tool instance.
      * @param <T>        the interface of the tool
      * @param tool       the instance of the tool
      * @param moduleName the name of the module containing the desired implementation
      * @return true if and only if the tool matches the specified criteria
      */
     private static <T> boolean matches(T tool, String moduleName) {
-        // for now, use reflection to implement
-        //      return moduleName.equals(tool.getClass().getModule().getName());
-        try {
-            Method getModuleMethod = Class.class.getDeclaredMethod("getModule");
-            Object toolModule = getModuleMethod.invoke(tool.getClass());
-            Method getNameMethod = toolModule.getClass().getDeclaredMethod("getName");
-            String toolModuleName = (String) getNameMethod.invoke(toolModule);
-            return moduleName.equals(toolModuleName);
-        } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
-            return false;
-        }
+        PrivilegedAction<Boolean> pa = () -> {
+            // for now, use reflection to implement
+            //      return moduleName.equals(tool.getClass().getModule().getName());
+            try {
+                Method getModuleMethod = Class.class.getDeclaredMethod("getModule");
+                Object toolModule = getModuleMethod.invoke(tool.getClass());
+                Method getNameMethod = toolModule.getClass().getDeclaredMethod("getName");
+                String toolModuleName = (String) getNameMethod.invoke(toolModule);
+                return moduleName.equals(toolModuleName);
+            } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
+                return false;
+            }
+        };
+        return AccessController.doPrivileged(pa);
     }
 }
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java	Wed Jul 05 21:41:01 2017 +0200
@@ -960,12 +960,12 @@
             return n;
         }
 
-        @Override
+        @Override @DefinedBy(Api.LANGUAGE_MODEL)
         public <R, P> R accept(ElementVisitor<R, P> v, P p) {
             return v.visitModule(this, p);
         }
 
-        @Override
+        @Override @DefinedBy(Api.LANGUAGE_MODEL)
         public List<Symbol> getEnclosedElements() {
             List<Symbol> list = List.nil();
             for (Symbol sym : enclosedPackages) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Type.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -1588,17 +1588,17 @@
             return v.visitModuleType(this, s);
         }
 
-        @Override
+        @Override @DefinedBy(Api.LANGUAGE_MODEL)
         public String toString() {
             return tsym.getQualifiedName().toString();
         }
 
-        @Override
+        @Override @DefinedBy(Api.LANGUAGE_MODEL)
         public TypeKind getKind() {
             return TypeKind.MODULE;
         }
 
-        @Override
+        @Override @DefinedBy(Api.LANGUAGE_MODEL)
         public <R, P> R accept(TypeVisitor<R, P> v, P p) {
             return v.visitNoType(this, p);
         }
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java	Wed Jul 05 21:41:01 2017 +0200
@@ -102,6 +102,7 @@
 import com.sun.tools.javac.tree.JCTree.Tag;
 
 import static com.sun.tools.javac.code.Flags.ABSTRACT;
+import static com.sun.tools.javac.code.Flags.ENUM;
 import static com.sun.tools.javac.code.Flags.PUBLIC;
 import static com.sun.tools.javac.tree.JCTree.Tag.MODULEDEF;
 
@@ -131,6 +132,9 @@
 
     private final String moduleOverride;
 
+    private final Name java_se;
+    private final Name java_;
+
     ModuleSymbol defaultModule;
 
     private final String addExportsOpt;
@@ -173,6 +177,9 @@
         JNIWriter jniWriter = JNIWriter.instance(context);
         jniWriter.multiModuleMode = multiModuleMode;
 
+        java_se = names.fromString("java.se");
+        java_ = names.fromString("java.");
+
         addExportsOpt = options.get(Option.XADDEXPORTS);
         addReadsOpt = options.get(Option.XADDREADS);
         addModsOpt = options.get(Option.ADDMODS);
@@ -747,7 +754,10 @@
         @Override
         public void visitUses(JCUses tree) {
             Type st = attr.attribType(tree.qualid, env, syms.objectType);
-            if (st.hasTag(CLASS)) {
+            Symbol sym = TreeInfo.symbol(tree.qualid);
+            if ((sym.flags() & ENUM) != 0) {
+                log.error(tree.qualid.pos(), Errors.ServiceDefinitionIsEnum(st.tsym));
+            } else if (st.hasTag(CLASS)) {
                 ClassSymbol service = (ClassSymbol) st.tsym;
                 Directive.UsesDirective d = new Directive.UsesDirective(service);
                 if (!allUses.add(d)) {
@@ -761,17 +771,17 @@
         private void checkForCorrectness() {
             for (Directive.ProvidesDirective provides : allProvides) {
                 JCProvides tree = directiveToTreeMap.get(provides);
-                /** The implementation must be defined in the same module as the provides directive
-                 *  (else, error)
+                /* The implementation must be defined in the same module as the provides directive
+                 * (else, error)
                  */
                 PackageSymbol implementationDefiningPackage = provides.impl.packge();
                 if (implementationDefiningPackage.modle != msym) {
                     log.error(tree.pos(), Errors.ServiceImplementationNotInRightModule(implementationDefiningPackage.modle));
                 }
 
-                /** There is no inherent requirement that module that provides a service should actually
-                 *  use it itself. However, it is a pointless declaration if the service package is not
-                 *  exported and there is no uses for the service.
+                /* There is no inherent requirement that module that provides a service should actually
+                 * use it itself. However, it is a pointless declaration if the service package is not
+                 * exported and there is no uses for the service.
                  */
                 PackageSymbol interfaceDeclaringPackage = provides.service.packge();
                 boolean isInterfaceDeclaredInCurrentModule = interfaceDeclaringPackage.modle == msym;
@@ -826,8 +836,22 @@
         Set<ModuleSymbol> enabledRoot = new LinkedHashSet<>();
 
         if (rootModules.contains(syms.unnamedModule)) {
-            for (ModuleSymbol sym : syms.getAllModules()) {
-                if (systemModulePred.test(sym) && observablePred.test(sym)) {
+            ModuleSymbol javaSE = syms.getModule(java_se);
+            Predicate<ModuleSymbol> jdkModulePred;
+
+            if (javaSE != null && (observable == null || observable.contains(javaSE))) {
+                jdkModulePred = sym -> {
+                    sym.complete();
+                    return   !sym.name.startsWith(java_)
+                           && sym.exports.stream().anyMatch(e -> e.modules == null);
+                };
+                enabledRoot.add(javaSE);
+            } else {
+                jdkModulePred = sym -> true;
+            }
+
+            for (ModuleSymbol sym : new HashSet<>(syms.getAllModules())) {
+                if (systemModulePred.test(sym) && observablePred.test(sym) && jdkModulePred.test(sym)) {
                     enabledRoot.add(sym);
                 }
             }
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java	Wed Jul 05 21:41:01 2017 +0200
@@ -74,6 +74,8 @@
 import com.sun.tools.javac.main.Option;
 import com.sun.tools.javac.resources.CompilerProperties.Errors;
 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
+import com.sun.tools.javac.util.DefinedBy;
+import com.sun.tools.javac.util.DefinedBy.Api;
 import com.sun.tools.javac.util.ListBuffer;
 import com.sun.tools.javac.util.Log;
 import com.sun.tools.javac.util.Pair;
@@ -813,7 +815,7 @@
      * SYSTEM_MODULES and MODULE_PATH.
      *
      * The Location can be specified to accept overriding classes from the
-     * -Xpatch:dir parameter.
+     * {@code -Xpatch:<module>=<path> } parameter.
      */
     private class ModuleLocationHandler extends LocationHandler implements Location {
         protected final String name;
@@ -829,47 +831,27 @@
             this.searchPath = searchPath;
             this.output = output;
 
-            if (allowOverrides) {
-                if (patchMap != null) {
-                    SearchPath mPatch = patchMap.get(moduleName);
-                    if (mPatch != null) {
-                        SearchPath sp = new SearchPath();
-                        sp.addAll(mPatch);
-                        sp.addAll(searchPath);
-                        searchPathWithOverrides = sp;
-                    } else {
-                        searchPathWithOverrides = searchPath;
-                    }
+            if (allowOverrides && patchMap != null) {
+                SearchPath mPatch = patchMap.get(moduleName);
+                if (mPatch != null) {
+                    SearchPath sp = new SearchPath();
+                    sp.addAll(mPatch);
+                    sp.addAll(searchPath);
+                    searchPathWithOverrides = sp;
                 } else {
-                     // for old style patch option; retained for transition
-                    Set<Path> overrides = new LinkedHashSet<>();
-                    if (moduleOverrideSearchPath != null) {
-                       for (Path p: moduleOverrideSearchPath) {
-                           Path o = p.resolve(moduleName);
-                           if (Files.isDirectory(o)) {
-                               overrides.add(o);
-                           }
-                       }
-                    }
-
-                    if (!overrides.isEmpty()) {
-                        overrides.addAll(searchPath);
-                        searchPathWithOverrides = overrides;
-                    } else {
-                        searchPathWithOverrides = searchPath;
-                    }
+                    searchPathWithOverrides = searchPath;
                 }
             } else {
                 searchPathWithOverrides = searchPath;
             }
         }
 
-        @Override // defined by Location
+        @Override @DefinedBy(Api.COMPILER)
         public String getName() {
             return name;
         }
 
-        @Override // defined by Location
+        @Override @DefinedBy(Api.COMPILER)
         public boolean isOutputLocation() {
             return output;
         }
@@ -1522,41 +1504,33 @@
         }
     }
 
-    private SearchPath moduleOverrideSearchPath; // for old style patch option; retained for transition
     private Map<String, SearchPath> patchMap;
 
     boolean handleOption(Option option, String value) {
         switch (option) {
             case XPATCH:
-                if (value.contains("=")) {
-                    Map<String, SearchPath> map = new LinkedHashMap<>();
-                    for (String entry: value.split(",")) {
-                        int eq = entry.indexOf('=');
-                        if (eq > 0) {
-                            String mName = entry.substring(0, eq);
-                            SearchPath mPatchPath = new SearchPath()
-                                    .addFiles(entry.substring(eq + 1));
-                            boolean ok = true;
-                            for (Path p: mPatchPath) {
-                                Path mi = p.resolve("module-info.class");
-                                if (Files.exists(mi)) {
-                                    log.error(Errors.LocnModuleInfoNotAllowedOnPatchPath(mi));
-                                    ok = false;
-                                }
-                            }
-                            if (ok && !mPatchPath.isEmpty()) {
-                                map.computeIfAbsent(mName, (_x) -> new SearchPath())
-                                        .addAll(mPatchPath);
-                            }
-                        } else {
-                            log.error(Errors.LocnInvalidArgForXpatch(entry));
+                Map<String, SearchPath> map = new LinkedHashMap<>();
+                int eq = value.indexOf('=');
+                if (eq > 0) {
+                    String mName = value.substring(0, eq);
+                    SearchPath mPatchPath = new SearchPath()
+                            .addFiles(value.substring(eq + 1));
+                    boolean ok = true;
+                    for (Path p: mPatchPath) {
+                        Path mi = p.resolve("module-info.class");
+                        if (Files.exists(mi)) {
+                            log.error(Errors.LocnModuleInfoNotAllowedOnPatchPath(mi));
+                            ok = false;
                         }
                     }
-                    patchMap = map;
+                    if (ok && !mPatchPath.isEmpty()) {
+                        map.computeIfAbsent(mName, (_x) -> new SearchPath())
+                                .addAll(mPatchPath);
+                    }
                 } else {
-                     // for old style patch option; retained for transition
-                    moduleOverrideSearchPath = new SearchPath().addFiles(value);
+                    log.error(Errors.LocnInvalidArgForXpatch(value));
                 }
+                patchMap = map;
                 return true;
             default:
                 LocationHandler h = handlersForOption.get(option);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/main/Option.java	Wed Jul 05 21:41:01 2017 +0200
@@ -199,7 +199,7 @@
 
     SYSTEM("-system", "opt.arg.jdk", "opt.system", STANDARD, FILEMANAGER),
 
-    XPATCH("-Xpatch:", "opt.arg.path", "opt.Xpatch", EXTENDED, FILEMANAGER),
+    XPATCH("-Xpatch:", "opt.arg.patch", "opt.patch", EXTENDED, FILEMANAGER),
 
     BOOTCLASSPATH("-bootclasspath", "opt.arg.path", "opt.bootclasspath", STANDARD, FILEMANAGER) {
         @Override
@@ -529,83 +529,21 @@
     XADDEXPORTS("-XaddExports:", "opt.arg.addExports", "opt.addExports", EXTENDED, BASIC) {
         @Override
         public boolean process(OptionHelper helper, String option) {
-            if (option.matches(".*,.*=.*")) { // temporary, for backwards compatibility
-                return processOldStyle(helper, option);
-            }
             String p = option.substring(option.indexOf(':') + 1).trim();
             String prev = helper.get(XADDEXPORTS);
             helper.put(XADDEXPORTS.text, (prev == null) ? p : prev + '\0' + p);
             return false;
         }
-
-        // convert old style option into a series of new-style options
-        private boolean processOldStyle(OptionHelper helper, String option) {
-            String p = option.substring(option.indexOf(':') + 1).trim();
-            String[] entries = p.split("[ ,]+");
-            Map<String, String> map = new LinkedHashMap<>();
-            for (String e: entries) {
-                // Each entry is of the form   module/package=target
-                // we must group values for the same module/package together
-                int eq = e.indexOf('=');
-                if (eq == -1) {
-                    // don't bother with error message for backwards compatible support
-                    continue;
-                }
-                String modPkg = e.substring(0, eq);
-                String target = e.substring(eq + 1);
-                String targets = map.get(modPkg);
-                map.put(modPkg, (targets == null) ? target : targets + "," + target);
-            }
-            boolean ok = true;
-            for (Map.Entry<String, String> e: map.entrySet()) {
-                // process as new-style options
-                String key = e.getKey();
-                String value = e.getValue();
-                ok = ok & process(helper, XADDEXPORTS.text + key + "=" + value);
-            };
-            return ok;
-        }
     },
 
     XADDREADS("-XaddReads:", "opt.arg.addReads", "opt.addReads", EXTENDED, BASIC) {
         @Override
         public boolean process(OptionHelper helper, String option) {
-            if (option.matches(".*,.*=.*")) { // temporary, for backwards compatibility
-                return processOldStyle(helper, option);
-            }
             String p = option.substring(option.indexOf(':') + 1).trim();
             String prev = helper.get(XADDREADS);
             helper.put(XADDREADS.text, (prev == null) ? p : prev + '\0' + p);
             return false;
         }
-
-        // convert old style option into a series of new-style options
-        private boolean processOldStyle(OptionHelper helper, String option) {
-            String p = option.substring(option.indexOf(':') + 1).trim();
-            String[] entries = p.split("[ ,]+");
-            Map<String, String> map = new LinkedHashMap<>();
-            for (String e: entries) {
-                // Each entry is of the form   module=target
-                // we must group values for the same module together
-                int eq = e.indexOf('=');
-                if (eq == -1) {
-                    // don't bother with error message for backwards compatible support
-                    continue;
-                }
-                String modPkg = e.substring(0, eq);
-                String target = e.substring(eq + 1);
-                String targets = map.get(modPkg);
-                map.put(modPkg, (targets == null) ? target : targets + "," + target);
-            }
-            boolean ok = true;
-            for (Map.Entry<String, String> e: map.entrySet()) {
-                // process as new-style options
-                String key = e.getKey();
-                String value = e.getValue();
-                ok = ok & process(helper, XADDEXPORTS.text + key + "=" + value);
-            };
-            return ok;
-        }
     },
 
     XMODULE("-Xmodule:", "opt.arg.module", "opt.module", EXTENDED, BASIC) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/model/JavacElements.java	Wed Jul 05 21:41:01 2017 +0200
@@ -107,12 +107,13 @@
         return modules.getObservableModule(names.fromString(strName));
     }
 
-    @DefinedBy(Api.LANGUAGE_MODEL)
+    @Override @DefinedBy(Api.LANGUAGE_MODEL)
     public PackageSymbol getPackageElement(CharSequence name) {
         ensureEntered("getPackageElement");
         return getPackageElement(modules.getDefaultModule(), name);
     }
 
+    @Override @DefinedBy(Api.LANGUAGE_MODEL)
     public PackageSymbol getPackageElement(ModuleElement module, CharSequence name) {
         String strName = name.toString();
         if (strName.equals(""))
@@ -122,12 +123,13 @@
             : null;
     }
 
-    @DefinedBy(Api.LANGUAGE_MODEL)
+    @Override @DefinedBy(Api.LANGUAGE_MODEL)
     public ClassSymbol getTypeElement(CharSequence name) {
         ensureEntered("getTypeElement");
         return getTypeElement(modules.getDefaultModule(), name);
     }
 
+    @Override @DefinedBy(Api.LANGUAGE_MODEL)
     public ClassSymbol getTypeElement(ModuleElement module, CharSequence name) {
         String strName = name.toString();
         return SourceVersion.isName(strName)
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties	Wed Jul 05 21:41:01 2017 +0200
@@ -2719,6 +2719,10 @@
     the service definition is an inner class: {0}
 
 # 0: symbol
+compiler.err.service.definition.is.enum=\
+    the service definition is an enum: {0}
+
+# 0: symbol
 compiler.err.service.implementation.doesnt.have.a.no.args.constructor=\
     the service implementation does not have a default constructor: {0}
 
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties	Wed Jul 05 21:41:01 2017 +0200
@@ -53,12 +53,6 @@
     Override location of system modules
 javac.opt.upgrademodulepath=\
     Override location of upgradeable modules
-javac.opt.Xbootclasspath.p=\
-    Prepend to the bootstrap class path
-javac.opt.Xbootclasspath.a=\
-    Append to the bootstrap class path
-javac.opt.Xpatch=\
-    Specify location of module class files to patch
 javac.opt.endorseddirs=\
     Override location of endorsed standards path
 javac.opt.extdirs=\
@@ -160,6 +154,10 @@
     <pathname>
 javac.opt.arg.file=\
     <filename>
+javac.opt.Xbootclasspath.p=\
+    Prepend to the bootstrap class path
+javac.opt.Xbootclasspath.a=\
+    Append to the bootstrap class path
 javac.opt.Xlint=\
     Enable recommended warnings
 javac.opt.Xlint.all=\
@@ -286,6 +284,11 @@
 \        <other-module> may be ALL-UNNAMED to require the unnamed module.
 javac.opt.arg.addReads=\
     <module>=<other-module>(,<other-module>)*
+javac.opt.patch=\n\
+\        Override or augment a module with classes and resources\n\
+\        in JAR files or directories
+javac.opt.arg.patch=\
+    <module>=<file>(:<file>)*
 javac.opt.module=\
     Specify a module to which the classes being compiled belong.
 javac.opt.arg.module=\
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -2626,22 +2626,22 @@
         @Override
         public void accept(Visitor v) { v.visitModuleDef(this); }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public Kind getKind() {
             return Kind.MODULE;
         }
 
-//        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public JCExpression getName() {
             return qualId;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public List<JCDirective> getDirectives() {
             return directives;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
             return v.visitModule(this, d);
         }
@@ -2666,22 +2666,22 @@
         @Override
         public void accept(Visitor v) { v.visitExports(this); }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public Kind getKind() {
             return Kind.EXPORTS;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public JCExpression getExportName() {
             return qualid;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public List<JCExpression> getModuleNames() {
             return moduleNames;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
             return v.visitExports(this, d);
         }
@@ -2705,22 +2705,22 @@
         @Override
         public void accept(Visitor v) { v.visitProvides(this); }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public Kind getKind() {
             return Kind.PROVIDES;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
             return v.visitProvides(this, d);
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public JCExpression getServiceName() {
             return serviceName;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public JCExpression getImplementationName() {
             return implName;
         }
@@ -2745,22 +2745,22 @@
         @Override
         public void accept(Visitor v) { v.visitRequires(this); }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public Kind getKind() {
             return Kind.REQUIRES;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
             return v.visitRequires(this, d);
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public boolean isPublic() {
             return isPublic;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public JCExpression getModuleName() {
             return moduleName;
         }
@@ -2782,17 +2782,17 @@
         @Override
         public void accept(Visitor v) { v.visitUses(this); }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public Kind getKind() {
             return Kind.USES;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public JCExpression getServiceName() {
             return qualid;
         }
 
-        @Override
+        @Override @DefinedBy(Api.COMPILER_TREE)
         public <R, D> R accept(TreeVisitor<R, D> v, D d) {
             return v.visitUses(this, d);
         }
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeCopier.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeCopier.java	Wed Jul 05 21:41:01 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
@@ -505,7 +505,7 @@
         return M.at(t.pos).Wildcard(kind, inner);
     }
 
-    @Override
+    @Override @DefinedBy(Api.COMPILER_TREE)
     public JCTree visitModule(ModuleTree node, P p) {
         JCModuleDecl t = (JCModuleDecl) node;
         JCExpression qualId = copy(t.qualId);
@@ -513,7 +513,7 @@
         return M.at(t.pos).ModuleDef(qualId, directives);
     }
 
-    @Override
+    @Override @DefinedBy(Api.COMPILER_TREE)
     public JCExports visitExports(ExportsTree node, P p) {
         JCExports t = (JCExports) node;
         JCExpression qualId = copy(t.qualid, p);
@@ -521,7 +521,7 @@
         return M.at(t.pos).Exports(qualId, moduleNames);
     }
 
-    @Override
+    @Override @DefinedBy(Api.COMPILER_TREE)
     public JCProvides visitProvides(ProvidesTree node, P p) {
         JCProvides t = (JCProvides) node;
         JCExpression serviceName = copy(t.serviceName, p);
@@ -529,14 +529,14 @@
         return M.at(t.pos).Provides(serviceName, implName);
     }
 
-    @Override
+    @Override @DefinedBy(Api.COMPILER_TREE)
     public JCRequires visitRequires(RequiresTree node, P p) {
         JCRequires t = (JCRequires) node;
         JCExpression moduleName = copy(t.moduleName, p);
         return M.at(t.pos).Requires(t.isPublic, moduleName);
     }
 
-    @Override
+    @Override @DefinedBy(Api.COMPILER_TREE)
     public JCUses visitUses(UsesTree node, P p) {
         JCUses t = (JCUses) node;
         JCExpression serviceName = copy(t.qualid, p);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/ModuleWrappers.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/ModuleWrappers.java	Wed Jul 05 21:41:01 2017 +0200
@@ -25,7 +25,6 @@
 
 package com.sun.tools.javac.util;
 
-import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.nio.file.Path;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java	Wed Jul 05 21:41:01 2017 +0200
@@ -203,7 +203,7 @@
         return file;
     }
 
-    @Override
+    @Override @DefinedBy(Api.COMPILER)
     public Location getModuleLocation(Location location, JavaFileObject fo, String pkgName) throws IOException {
         return super.getModuleLocation(location, locUnwrap(fo), pkgName);
     }
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties	Wed Jul 05 21:41:01 2017 +0200
@@ -339,7 +339,8 @@
 
 doclet.xusage.xdoclint-package.name=Xdoclint/package:
 doclet.xusage.xdoclint-package.parameters=([-]<packages>)
-doclet.xusage.xdoclint-package.description=Enable or disable checks in specific packages. <packages> is a comma separated\n\
+doclet.xusage.xdoclint-package.description=\n\
+\        Enable or disable checks in specific packages. <packages> is a comma separated\n\
 \        list of package specifiers. Package specifier is either a qualified name of a package\n\
 \        or a package name prefix followed by .*, which expands to all sub-packages of\n\
 \        the given package. Prefix the package specifier with - to disable checks for\n\
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/Configuration.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1140,7 +1140,7 @@
          */
         @Override
         public String toString() {
-            String opt = name + " " + parameters;
+            String opt = name + (name.endsWith(":") ? "" : " ") + parameters;
             int optlen = opt.length();
             int spaces = 32 - optlen;
             StringBuffer sb = new StringBuffer("  -").append(opt);
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc.properties	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/resources/javadoc.properties	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 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
@@ -73,7 +73,9 @@
 \                                   given module. <other-module> may be ALL-UNNAMED to require\n\
 \                                   the unnamed module.\n\
 \  -Xmodule:<module-name>           Specify a module to which the classes being compiled belong.\n\
-\  -Xpatch:<path>                   Specify location of module class files to patch\n\
+\  -Xpatch:<module>=<file>(:<file>)*\n\
+\                                   Override or augment a module with classes and resources\n\
+\                                   in JAR files or directories\n\
 \  -Xold                            Invoke the legacy javadoc tool\n
 
 main.Xusage.foot=\
--- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/MemoryFileManager.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/MemoryFileManager.java	Wed Jul 05 21:41:01 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
@@ -231,6 +231,7 @@
     }
 
     // Make compatible with Jigsaw
+    @DefinedBy(Api.COMPILER)
     public String inferModuleName(Location location) {
         try {
             if (inferModuleNameMethod == null) {
@@ -249,6 +250,7 @@
     }
 
     // Make compatible with Jigsaw
+    @DefinedBy(Api.COMPILER)
     public Iterable<Set<Location>> listModuleLocations(Location location) throws IOException {
         try {
             if (listModuleLocationsMethod == null) {
--- a/langtools/test/ProblemList.txt	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/ProblemList.txt	Wed Jul 05 21:41:01 2017 +0200
@@ -95,5 +95,6 @@
 #
 # jdeps 
 
-tools/jdeps/modules/GenModuleInfo.java                                          8152502    windows-all    fails to clean up files
+tools/jdeps/modules/GenModuleInfo.java                                          8152502,8153481    generic-all    fails to clean up files, java.util.HashMap$Node cannot be cast to java.util.HashMap$TreeNode
+tools/jdeps/modules/ModuleTest.java                                             8153481    generic-all    java.util.HashMap$Node cannot be cast to java.util.HashMap$TreeNode
 
--- a/langtools/test/TEST.ROOT	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/TEST.ROOT	Wed Jul 05 21:41:01 2017 +0200
@@ -14,5 +14,8 @@
 # Group definitions
 groups=TEST.groups
 
-# Tests using jtreg 4.2 b01 features
-requiredVersion=4.2 b01
+# Tests using jtreg 4.2 b02 features
+requiredVersion=4.2 b02
+
+# Use new form of -Xpatch
+useNewXpatch=true
--- a/langtools/test/TEST.groups	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/TEST.groups	Wed Jul 05 21:41:01 2017 +0200
@@ -28,11 +28,13 @@
     jdk \
     lib \
     tools \
-    -jdk/jshell/ToolReloadTest.java
+    -jdk/jshell/ToolReloadTest.java \
+    -jdk/jshell/ToolLocaleMessageTest.java
 
 # (Almost) no langtools tests are tier 2.
 tier2 = \
-    jdk/jshell/ToolReloadTest.java
+    jdk/jshell/ToolReloadTest.java \
+    jdk/jshell/ToolLocaleMessageTest.java
 
 # No langtools tests are tier 3 either.
 tier3 = 
--- a/langtools/test/jdk/jshell/ToolLocaleMessageTest.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/jdk/jshell/ToolLocaleMessageTest.java	Wed Jul 05 21:41:01 2017 +0200
@@ -32,6 +32,7 @@
  *          jdk.jshell/jdk.internal.jshell.tool
  * @build KullaTesting TestingInputStream toolbox.ToolBox Compiler
  * @run testng ToolLocaleMessageTest
+ * @key intermittent
  */
 
 import java.util.Locale;
--- a/langtools/test/tools/all/RunCodingRules.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/all/RunCodingRules.java	Wed Jul 05 21:41:01 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
@@ -25,15 +25,14 @@
  * @test
  * @bug 8043643
  * @summary Run the langtools coding rules over the langtools source code.
- * @modules java.base/sun.reflect.annotation
- *          java.logging
- *          java.xml
- *          jdk.compiler/com.sun.tools.javac.resources
- *          jdk.compiler/com.sun.tools.javac.util
+ * @modules jdk.compiler/com.sun.tools.javac.util
  */
 
 
 import java.io.*;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -58,16 +57,18 @@
 
     public void run() throws Exception {
         Path testSrc = Paths.get(System.getProperty("test.src", "."));
-        Path targetDir = Paths.get(System.getProperty("test.classes", "."));
+        Path targetDir = Paths.get(".");
         List<Path> sourceDirs = null;
         Path crulesDir = null;
+        Path mainSrcDir = null;
         for (Path d = testSrc; d != null; d = d.getParent()) {
             if (Files.exists(d.resolve("TEST.ROOT"))) {
                 d = d.getParent();
                 Path toolsPath = d.resolve("make/tools");
                 if (Files.exists(toolsPath)) {
+                    mainSrcDir = d.resolve("src");
                     crulesDir = toolsPath;
-                    sourceDirs = Files.walk(d.resolve("src"), 1)
+                    sourceDirs = Files.walk(mainSrcDir, 1)
                                       .map(p -> p.resolve("share/classes"))
                                       .filter(p -> Files.isDirectory(p))
                                       .collect(Collectors.toList());
@@ -86,7 +87,10 @@
             DiagnosticListener<JavaFileObject> noErrors = diagnostic -> {
                 Assert.check(diagnostic.getKind() != Diagnostic.Kind.ERROR, diagnostic.toString());
             };
+            String FS = File.separator;
+            String PS = File.pathSeparator;
 
+            //compile crules:
             List<File> crulesFiles = Files.walk(crulesDir)
                                           .filter(entry -> entry.getFileName().toString().endsWith(".java"))
                                           .filter(entry -> entry.getParent().endsWith("crules"))
@@ -96,12 +100,11 @@
             Path crulesTarget = targetDir.resolve("crules");
             Files.createDirectories(crulesTarget);
             List<String> crulesOptions = Arrays.asList(
-                    "-XaddExports:"
-                        + "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED,"
-                        + "jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED,"
-                        + "jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED,"
-                        + "jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED,"
-                        + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+                    "-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+                    "-XaddExports:jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
+                    "-XaddExports:jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED",
+                    "-XaddExports:jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
+                    "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
                     "-d", crulesTarget.toString());
             javaCompiler.getTask(null, fm, noErrors, crulesOptions, null,
                     fm.getJavaFileObjectsFromFiles(crulesFiles)).call();
@@ -111,6 +114,47 @@
                 metaInfServices.write("crules.CodingRulesAnalyzerPlugin\n");
             }
 
+            //generate CompilerProperties.java:
+            List<File> propertiesParserFiles =
+                    Files.walk(crulesDir.resolve("propertiesparser"))
+                         .filter(entry -> entry.getFileName().toString().endsWith(".java"))
+                         .map(entry -> entry.toFile())
+                         .collect(Collectors.toList());
+
+            Path propertiesParserTarget = targetDir.resolve("propertiesParser");
+            Files.createDirectories(propertiesParserTarget);
+            List<String> propertiesParserOptions = Arrays.asList(
+                    "-d", propertiesParserTarget.toString());
+            javaCompiler.getTask(null, fm, noErrors, propertiesParserOptions, null,
+                    fm.getJavaFileObjectsFromFiles(propertiesParserFiles)).call();
+
+            Path genSrcTarget = targetDir.resolve("gensrc");
+
+            ClassLoader propertiesParserLoader = new URLClassLoader(new URL[] {
+                propertiesParserTarget.toUri().toURL(),
+                crulesDir.toUri().toURL()
+            });
+            Class propertiesParserClass =
+                    Class.forName("propertiesparser.PropertiesParser", false, propertiesParserLoader);
+            Method propertiesParserRun =
+                    propertiesParserClass.getDeclaredMethod("run", String[].class, PrintStream.class);
+            String compilerProperties =
+                    "jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties";
+            Path propertiesPath = mainSrcDir.resolve(compilerProperties.replace("/", FS));
+            Path genSrcTargetDir = genSrcTarget.resolve(mainSrcDir.relativize(propertiesPath.getParent()));
+
+            Files.createDirectories(genSrcTargetDir);
+            String[] propertiesParserRunOptions = new String[] {
+                "-compile", propertiesPath.toString(), genSrcTargetDir.toString()
+            };
+
+            Object result = propertiesParserRun.invoke(null, propertiesParserRunOptions, System.err);
+
+            if (!(result instanceof Boolean) || !(Boolean) result) {
+                throw new AssertionError("Cannot parse properties: " + result);
+            }
+
+            //compile langtools sources with crules enabled:
             List<File> sources = sourceDirs.stream()
                                            .flatMap(dir -> silentFilesWalk(dir))
                                            .filter(entry -> entry.getFileName().toString().endsWith(".java"))
@@ -119,9 +163,13 @@
 
             Path sourceTarget = targetDir.resolve("classes");
             Files.createDirectories(sourceTarget);
-            String processorPath = crulesTarget.toString() + File.pathSeparator + crulesDir.toString();
+            String processorPath = crulesTarget + PS + crulesDir;
+
             List<String> options = Arrays.asList(
                     "-d", sourceTarget.toString(),
+                    "-modulesourcepath", mainSrcDir + FS + "*" + FS + "share" + FS + "classes" + PS
+                                       + genSrcTarget + FS + "*" + FS + "share" + FS + "classes",
+                    "-XDaccessInternalAPI",
                     "-processorpath", processorPath,
                     "-Xplugin:coding_rules");
             javaCompiler.getTask(null, fm, noErrors, options, null,
--- a/langtools/test/tools/javac/T6358024.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/T6358024.java	Wed Jul 05 21:41:01 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
@@ -69,10 +69,10 @@
 
         JavacTool tool = JavacTool.create();
         List<String> flags = new ArrayList<String>();
-        flags.add("-XaddExports:"
-                + "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED");
+        flags.addAll(Arrays.asList(
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"));
         for (Option opt: opts) {
             flags.add(opt.name);
             for (Object arg : opt.args)
--- a/langtools/test/tools/javac/T6358166.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/T6358166.java	Wed Jul 05 21:41:01 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
@@ -42,8 +42,7 @@
 import com.sun.tools.javac.api.JavacTool;
 import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.main.JavaCompiler;
-import com.sun.tools.javac.util.*;
-import com.sun.tools.javac.util.List; // disambiguate
+import com.sun.tools.javac.util.Context;
 
 
 @SupportedAnnotationTypes("*")
@@ -56,22 +55,26 @@
         JavacFileManager fm = new JavacFileManager(new Context(), false, null);
         JavaFileObject f = fm.getJavaFileObject(testSrc + File.separatorChar + self + ".java");
 
-        String addExports = "-XaddExports:"
-                + "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED";
+        List<String> addExports = Arrays.asList(
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED");
 
         test(fm, f, addExports, "-verbose", "-d", ".");
 
         test(fm, f, addExports, "-verbose", "-d", ".", "-XprintRounds", "-processorpath", ".", "-processor", self);
     }
 
-    static void test(JavacFileManager fm, JavaFileObject f, String... args) throws Throwable {
+    static void test(JavacFileManager fm, JavaFileObject f, List<String> addExports, String... args) throws Throwable {
+        List<String> allArgs = new ArrayList<>();
+        allArgs.addAll(addExports);
+        allArgs.addAll(Arrays.asList(args));
+
         Context context = new Context();
 
         JavacTool tool = JavacTool.create();
-        JavacTaskImpl task = (JavacTaskImpl) tool.getTask(null, fm, null, Arrays.asList(args), null, List.of(f), context);
+        JavacTaskImpl task = (JavacTaskImpl) tool.getTask(null, fm, null, allArgs, null, List.of(f), context);
         task.call();
 
         JavaCompiler c = JavaCompiler.instance(context);
--- a/langtools/test/tools/javac/T6406771.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/T6406771.java	Wed Jul 05 21:41:01 2017 +0200
@@ -50,9 +50,8 @@
             JavaFileObject f = fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, self+".java"))).iterator().next();
 
             List<String> opts = Arrays.asList(
-                "-XaddExports:"
-                + "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
                 "-XDaccessInternalAPI",
                 "-d", ".",
                 "-processorpath", testClasses,
--- a/langtools/test/tools/javac/T8010737/ParameterNamesAreNotCopiedToAnonymousInitTest.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/T8010737/ParameterNamesAreNotCopiedToAnonymousInitTest.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2015, 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
@@ -143,12 +143,11 @@
                     Arrays.asList(new File(System.getProperty("test.src"),
                     this.getClass().getName() + ".java")));
             java.util.List<String> options = Arrays.asList(
-                "-XaddExports:"
-                    + "jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED,"
-                    + "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED,"
-                    + "jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED,"
-                    + "jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED,"
-                    + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+                "-XaddExports:jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
                 "-d", System.getProperty("user.dir")
             );
             JavacTask task = (JavacTask) c.getTask(null, fm, null, options, null, fos);
--- a/langtools/test/tools/javac/api/TestJavacTaskScanner.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/api/TestJavacTaskScanner.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, 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
@@ -73,11 +73,11 @@
         final Iterable<? extends JavaFileObject> compilationUnits =
             fm.getJavaFileObjects(new File[] {file});
         StandardJavaFileManager fm = getLocalFileManager(tool, null, null);
-        java.util.List<String> options = Arrays.asList("-XaddExports:"
-                + "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED");
+        java.util.List<String> options = Arrays.asList(
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED");
         task = (JavacTaskImpl)tool.getTask(null, fm, null, options, null, compilationUnits);
         task.getContext().put(ScannerFactory.scannerFactoryKey,
                 new MyScanner.Factory(task.getContext(), this));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest.java	Wed Jul 05 21:41:01 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.
+ */
+
+import javax.tools.ToolProvider;
+import java.util.Objects;
+
+/**
+ * @test
+ * @bug 8154190
+ * @summary Test javax.tools.ToolProvider running with security manager
+ * @modules java.compiler
+ *          jdk.compiler
+ * @run main/othervm ToolProviderTest
+ */
+
+// run in other vm to ensure the initialization code path is exercised.
+public class ToolProviderTest {
+    public static void main(String... args) {
+        System.setSecurityManager(new SecurityManager());
+
+        Objects.requireNonNull(ToolProvider.getSystemDocumentationTool());
+        Objects.requireNonNull(ToolProvider.getSystemJavaCompiler());
+        Objects.requireNonNull(ToolProvider.getSystemToolClassLoader());
+    }
+}
--- a/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest1.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/api/ToolProvider/ToolProviderTest1.java	Wed Jul 05 21:41:01 2017 +0200
@@ -43,7 +43,7 @@
 public class ToolProviderTest1 {
     public static void main(String... args) throws Exception {
         if (args.length > 0) {
-            System.err.println(Class.forName(args[0], true, null));
+            System.err.println(Class.forName(args[0], true, ClassLoader.getSystemClassLoader()));
             return;
         }
 
--- a/langtools/test/tools/javac/diags/CheckResourceKeys.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/diags/CheckResourceKeys.java	Wed Jul 05 21:41:01 2017 +0200
@@ -294,6 +294,7 @@
             "opt.Xlint.desc.",
             "count.",
             "illegal.",
+            "java.",
             "javac.",
             "verbose.",
             "locn."
--- a/langtools/test/tools/javac/diags/examples.not-yet.txt	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/diags/examples.not-yet.txt	Wed Jul 05 21:41:01 2017 +0200
@@ -146,6 +146,7 @@
 compiler.err.package.in.other.module
 compiler.err.processorpath.no.processormodulepath
 compiler.err.service.definition.is.inner
+compiler.err.service.definition.is.enum
 compiler.err.service.implementation.doesnt.have.a.no.args.constructor
 compiler.err.service.implementation.is.abstract
 compiler.err.service.implementation.is.inner
--- a/langtools/test/tools/javac/file/T7018098.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/file/T7018098.java	Wed Jul 05 21:41:01 2017 +0200
@@ -60,10 +60,9 @@
         _assert(!testDir.exists());
 
         compile(
-            "-XaddExports:"
-                + "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+            "-XaddExports:jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+            "-XaddExports:jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED",
+            "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
             "-XDaccessInternalAPI",
             "-proc:only",
             "-processor", myName,
@@ -74,10 +73,9 @@
         _assert(testDir.exists());
 
         compile(
-            "-XaddExports:"
-                + "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+            "-XaddExports:jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+            "-XaddExports:jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED",
+            "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
             "-XDaccessInternalAPI",
             "-proc:only",
             "-processor", myName,
--- a/langtools/test/tools/javac/modules/AddLimitMods.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/modules/AddLimitMods.java	Wed Jul 05 21:41:01 2017 +0200
@@ -40,6 +40,7 @@
 import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -69,7 +70,6 @@
 import toolbox.JavacTask;
 import toolbox.JavaTask;
 import toolbox.Task;
-import toolbox.ToolBox;
 
 public class AddLimitMods extends ModuleTestBase {
 
@@ -176,6 +176,58 @@
     }
 
     @Test
+    public void testObservableForUnnamed(Path base) throws Exception {
+        Path src = base.resolve("src");
+
+        tb.writeJavaFiles(src,
+                          "package test;\n" +
+                          "@javax.annotation.Generated(\"test\")\n" +
+                          "public class Test {\n" +
+                          "    com.sun.tools.javac.Main m;\n" +
+                          "    javax.xml.bind.JAXBException e;\n" +
+                          "}\n");
+
+        Path out = base.resolve("out");
+
+        Files.createDirectories(out);
+
+        for (Entry<String[], String> variant : variants) {
+            System.err.println("running variant: options=" + Arrays.asList(variant.getKey()) + ", expected log: " + variant.getValue());
+
+            List<String> options = new ArrayList<>();
+            options.add("-XDrawDiagnostics");
+            options.addAll(Arrays.asList(variant.getKey()));
+
+            String log = new JavacTask(tb)
+                    .options(options.toArray(new String[0]))
+                    .outdir(out)
+                    .files(findJavaFiles(src))
+                    .run(variant.getValue() == null ? Task.Expect.SUCCESS : Task.Expect.FAIL)
+                    .writeAll()
+                    .getOutput(Task.OutputKind.DIRECT);
+
+            log = log.replace(System.getProperty("line.separator"), "\n");
+
+            if (variant.getValue() != null && !log.equals(variant.getValue())) {
+                throw new AssertionError();
+            }
+        }
+    }
+
+    private static final List<Entry<String[], String>> variants = Arrays.asList(
+            new SimpleEntry<String[], String>(new String[] {},
+                                              "Test.java:2:18: compiler.err.doesnt.exist: javax.annotation\n"
+                                            + "Test.java:5:19: compiler.err.doesnt.exist: javax.xml.bind\n"
+                                            + "2 errors\n"),
+            new SimpleEntry<String[], String>(new String[] {"-addmods", "java.annotations.common,java.xml.bind"},
+                                              null),
+            new SimpleEntry<String[], String>(new String[] {"-limitmods", "java.xml.ws,jdk.compiler"},
+                                              null),
+            new SimpleEntry<String[], String>(new String[] {"-addmods", "ALL-SYSTEM"},
+                                              null)
+    );
+
+    @Test
     public void testAllModulePath(Path base) throws Exception {
         if (Files.isDirectory(base))
             tb.cleanDirectory(base);
--- a/langtools/test/tools/javac/modules/UsesTest.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/modules/UsesTest.java	Wed Jul 05 21:41:01 2017 +0200
@@ -82,6 +82,29 @@
     }
 
     @Test
+    public void testEnumAsAService(Path base) throws Exception {
+        Path src = base.resolve("src");
+        tb.writeJavaFiles(src,
+                "module m { uses pkg.EnumST; }",
+                "package pkg; public enum EnumST {A, B}");
+        Path classes = base.resolve("classes");
+        Files.createDirectories(classes);
+
+        List<String> output = new JavacTask(tb)
+                .options("-XDrawDiagnostics")
+                .outdir(classes)
+                .files(tb.findJavaFiles(src))
+                .run(Task.Expect.FAIL)
+                .writeAll()
+                .getOutputLines(Task.OutputKind.DIRECT);
+        List<String> expected = Arrays.asList("module-info.java:1:20: compiler.err.service.definition.is.enum: pkg.EnumST",
+                "1 error");
+        if (!output.containsAll(expected)) {
+            throw new Exception("Expected output not found");
+        }
+    }
+
+    @Test
     public void testSimpleAnnotation(Path base) throws Exception {
         Path src = base.resolve("src");
         tb.writeJavaFiles(src,
--- a/langtools/test/tools/javac/processing/loader/testClose/TestClose.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/processing/loader/testClose/TestClose.java	Wed Jul 05 21:41:01 2017 +0200
@@ -132,9 +132,8 @@
                         new MemFile("AnnoProc.java", annoProc),
                         new MemFile("Callback.java", callback));
                 List<String> options = Arrays.asList(
-                        "-XaddExports:"
-                        + "jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED,"
-                        + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+                        "-XaddExports:jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED",
+                        "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
                         "-XDaccessInternalAPI");
                 JavacTask task = tool.getTask(null, fm, null, options, null, files);
                 check(task.call());
--- a/langtools/test/tools/javac/processing/loader/testClose/TestClose2.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/processing/loader/testClose/TestClose2.java	Wed Jul 05 21:41:01 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
@@ -92,10 +92,9 @@
         Iterable<? extends JavaFileObject> files =
                 fm.getJavaFileObjects(new File(testSrc, TestClose2.class.getName() + ".java"));
         List<String> options = Arrays.asList(
-                "-XaddExports:"
-                    + "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED,"
-                    + "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED,"
-                    + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+                "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
                 "-processor", TestClose2.class.getName());
 
         JavacTask task = tool.getTask(null, fm, null, options, null, files);
--- a/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java	Wed Jul 05 21:41:01 2017 +0200
@@ -33,7 +33,6 @@
 import java.io.File;
 import java.util.*;
 import java.util.Map.Entry;
-import java.util.stream.StreamSupport;
 
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
@@ -42,14 +41,12 @@
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
 import javax.tools.*;
-import javax.tools.JavaFileManager.Location;
 
 import com.sun.source.util.JavacTask;
 import com.sun.tools.javac.model.JavacElements;
 
 import static javax.tools.StandardLocation.CLASS_PATH;
 import static javax.tools.StandardLocation.PLATFORM_CLASS_PATH;
-import static javax.tools.StandardLocation.SYSTEM_MODULES;
 import static javax.tools.JavaFileObject.Kind.CLASS;
 
 
@@ -67,11 +64,13 @@
     static JavacTask javac;
     static Elements elements;
 
+    static List<String> addmods_ALL_SYSTEM = Arrays.asList("-addmods", "ALL-SYSTEM");
+
     public static void main(String[] args) throws Exception {
         JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
         try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
             fm.setLocation(CLASS_PATH, Collections.<File>emptyList());
-            JavacTask javac = (JavacTask)tool.getTask(null, fm, null, null, null, null);
+            JavacTask javac = (JavacTask)tool.getTask(null, fm, null, addmods_ALL_SYSTEM, null, null);
             Elements elements = javac.getElements();
 
             final Map<String, Set<String>> packages = new LinkedHashMap<>();
@@ -109,11 +108,12 @@
             javac = null;
             elements = null;
 
-            javac = (JavacTask)tool.getTask(null, fm, null, null, null, null);
+            javac = (JavacTask)tool.getTask(null, fm, null, addmods_ALL_SYSTEM, null, null);
             elements = javac.getElements();
 
             for (Entry<String, Set<String>> module2Packages : packages.entrySet()) {
                 ModuleElement me = elements.getModuleElement(module2Packages.getKey());
+                me.getClass();
                 for (String name : module2Packages.getValue()) {
                     PackageElement pe = ((JavacElements) elements).getPackageElement(me, name);
                     for (Element e : pe.getEnclosedElements()) {
--- a/langtools/test/tools/javac/util/T6597678.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/javac/util/T6597678.java	Wed Jul 05 21:41:01 2017 +0200
@@ -59,9 +59,8 @@
         PrintWriter pw = new PrintWriter(sw);
 
         compile(sw, pw,
-            "-XaddExports:"
-                + "jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED,"
-                + "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+            "-XaddExports:jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED",
+            "-XaddExports:jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
             "-XDaccessInternalAPI",
             "-proc:only",
             "-processor", myName,
--- a/langtools/test/tools/jdeps/APIDeps.java	Wed Jul 05 21:39:34 2017 +0200
+++ b/langtools/test/tools/jdeps/APIDeps.java	Wed Jul 05 21:41:01 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, 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
@@ -65,11 +65,9 @@
         for (String s : testModules.split("\\s+")) {
             if (s.isEmpty()) continue;
             if (s.indexOf('/') != -1)
-                addExports.add(s.trim() + "=ALL-UNNAMED");
+                addExports.add("-XaddExports:" + s.trim() + "=ALL-UNNAMED");
         }
-        if (addExports.size() > 0) {
-            options.add(addExports.stream().collect(Collectors.joining(",", "-XaddExports:", "")));
-        }
+        options.addAll(addExports);
 
         for (String dir : srcDirs) {
             Path source = testsrc.resolve(dir);
--- a/make/CompileJavaModules.gmk	Wed Jul 05 21:39:34 2017 +0200
+++ b/make/CompileJavaModules.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/make/CreateBuildJdkCopy.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/make/CreateJmods.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/make/Images.gmk	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/make/Main.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/make/common/JavaCompilation.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/make/common/MakeBase.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/make/common/Modules.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/.hgtags	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/buildtools/nasgen/build.xml	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/buildtools/nasgen/project.properties	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/make/BuildNashorn.gmk	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/make/build-nasgen.xml	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/make/build.xml	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/make/project.properties	Wed Jul 05 21:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/module-info.java	Wed Jul 05 21:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/test/TEST.ROOT	Wed Jul 05 21:41:01 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:41:01 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:41:01 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	Wed Jul 05 21:39:34 2017 +0200
+++ b/nashorn/test/src/jdk/dynalink/test/DynamicLinkerFactoryTest.java	Wed Jul 05 21:41:01 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");
+    }
 }