Merge jdk9-b38
authorduke
Wed, 05 Jul 2017 20:06:12 +0200
changeset 27325 948cceef81ba
parent 27324 f54441c74373 (diff)
parent 27237 c6b4f475b842 (current diff)
child 27326 d5795322c6d3
child 27327 a7a2bc04c99b
child 27328 17f2bc9cd16a
child 27334 4d506c3aaee1
child 27336 8ab14d82f8a5
child 27337 89b967c599ce
child 27353 9f3693786717
child 27355 0331487788ba
child 27356 2d407b9be8b0
child 27372 4225051bf4c2
child 27373 6f891fc6e7f0
child 27376 eafa8898e1a0
child 27378 8e4fbeb86c23
child 27379 5ae894733e09
child 27436 edb2a1d98e1a
child 27597 1fb6ebaa4f9d
Merge
--- a/.hgtags-top-repo	Wed Jul 05 20:05:31 2017 +0200
+++ b/.hgtags-top-repo	Wed Jul 05 20:06:12 2017 +0200
@@ -279,3 +279,4 @@
 087b23f35631e68e950496a36fce8ccca612966a jdk9-b34
 c173ba994245380fb11ef077d1e59823386840eb jdk9-b35
 201d4e235d597a25a2d3ee1404394789ba386119 jdk9-b36
+723a67b0c442391447b1d8aad8b249d06d1032e8 jdk9-b37
--- a/common/autoconf/flags.m4	Wed Jul 05 20:05:31 2017 +0200
+++ b/common/autoconf/flags.m4	Wed Jul 05 20:06:12 2017 +0200
@@ -136,8 +136,8 @@
       SYSROOT_CFLAGS="-isysroot \"$SYSROOT\" -iframework\"$SYSROOT/System/Library/Frameworks\""
       SYSROOT_LDFLAGS=$SYSROOT_CFLAGS
     elif test "x$TOOLCHAIN_TYPE" = xgcc; then
-      SYSROOT_CFLAGS="--sysroot=\"$SYSROOT\""
-      SYSROOT_LDFLAGS="--sysroot=\"$SYSROOT\""
+      SYSROOT_CFLAGS="--sysroot=$SYSROOT"
+      SYSROOT_LDFLAGS="--sysroot=$SYSROOT"
     elif test "x$TOOLCHAIN_TYPE" = xclang; then
       SYSROOT_CFLAGS="-isysroot \"$SYSROOT\""
       SYSROOT_LDFLAGS="-isysroot \"$SYSROOT\""
--- a/common/autoconf/generated-configure.sh	Wed Jul 05 20:05:31 2017 +0200
+++ b/common/autoconf/generated-configure.sh	Wed Jul 05 20:06:12 2017 +0200
@@ -4328,7 +4328,7 @@
 #CUSTOM_AUTOCONF_INCLUDE
 
 # Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1413533532
+DATE_WHEN_GENERATED=1414663067
 
 ###############################################################################
 #
@@ -41681,8 +41681,8 @@
       SYSROOT_CFLAGS="-isysroot \"$SYSROOT\" -iframework\"$SYSROOT/System/Library/Frameworks\""
       SYSROOT_LDFLAGS=$SYSROOT_CFLAGS
     elif test "x$TOOLCHAIN_TYPE" = xgcc; then
-      SYSROOT_CFLAGS="--sysroot=\"$SYSROOT\""
-      SYSROOT_LDFLAGS="--sysroot=\"$SYSROOT\""
+      SYSROOT_CFLAGS="--sysroot=$SYSROOT"
+      SYSROOT_LDFLAGS="--sysroot=$SYSROOT"
     elif test "x$TOOLCHAIN_TYPE" = xclang; then
       SYSROOT_CFLAGS="-isysroot \"$SYSROOT\""
       SYSROOT_LDFLAGS="-isysroot \"$SYSROOT\""
@@ -44037,17 +44037,6 @@
         -R$OPENWIN_HOME/lib$OPENJDK_TARGET_CPU_ISADIR"
   fi
 
-  #
-  # Weird Sol10 something check...TODO change to try compile
-  #
-  if test "x${OPENJDK_TARGET_OS}" = xsolaris; then
-    if test "`uname -r`" = "5.10"; then
-      if test "`${EGREP} -c XLinearGradient ${OPENWIN_HOME}/share/include/X11/extensions/Xrender.h`" = "0"; then
-        X_CFLAGS="${X_CFLAGS} -DSOLARIS10_NO_XRENDER_STRUCTS"
-      fi
-    fi
-  fi
-
   ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -44055,7 +44044,7 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
   OLD_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS $X_CFLAGS"
+  CFLAGS="$CFLAGS $SYSROOT_CFLAGS $X_CFLAGS"
 
   # Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10
   for ac_header in X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h X11/Intrinsic.h
@@ -44079,6 +44068,31 @@
 done
 
 
+  # If XLinearGradient isn't available in Xrender.h, signal that it needs to be
+  # defined in libawt_xawt.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if XlinearGradient is defined in Xrender.h" >&5
+$as_echo_n "checking if XlinearGradient is defined in Xrender.h... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <X11/extensions/Xrender.h>
+int
+main ()
+{
+XLinearGradient x;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       X_CFLAGS="$X_CFLAGS -DSOLARIS10_NO_XRENDER_STRUCTS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
   CFLAGS="$OLD_CFLAGS"
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
--- a/common/autoconf/libraries.m4	Wed Jul 05 20:05:31 2017 +0200
+++ b/common/autoconf/libraries.m4	Wed Jul 05 20:06:12 2017 +0200
@@ -139,20 +139,9 @@
         -R$OPENWIN_HOME/lib$OPENJDK_TARGET_CPU_ISADIR"
   fi
 
-  #
-  # Weird Sol10 something check...TODO change to try compile
-  #
-  if test "x${OPENJDK_TARGET_OS}" = xsolaris; then
-    if test "`uname -r`" = "5.10"; then
-      if test "`${EGREP} -c XLinearGradient ${OPENWIN_HOME}/share/include/X11/extensions/Xrender.h`" = "0"; then
-        X_CFLAGS="${X_CFLAGS} -DSOLARIS10_NO_XRENDER_STRUCTS"
-      fi
-    fi
-  fi
-
   AC_LANG_PUSH(C)
   OLD_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS $X_CFLAGS"
+  CFLAGS="$CFLAGS $SYSROOT_CFLAGS $X_CFLAGS"
 
   # Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10
   AC_CHECK_HEADERS([X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h X11/Intrinsic.h],
@@ -164,6 +153,16 @@
       ]
   )
 
+  # If XLinearGradient isn't available in Xrender.h, signal that it needs to be
+  # defined in libawt_xawt.
+  AC_MSG_CHECKING([if XlinearGradient is defined in Xrender.h])
+  AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM([[#include <X11/extensions/Xrender.h>]],
+          [[XLinearGradient x;]])],
+      [AC_MSG_RESULT([yes])],
+      [AC_MSG_RESULT([no])
+       X_CFLAGS="$X_CFLAGS -DSOLARIS10_NO_XRENDER_STRUCTS"])
+
   CFLAGS="$OLD_CFLAGS"
   AC_LANG_POP(C)
 
--- a/corba/.hgtags	Wed Jul 05 20:05:31 2017 +0200
+++ b/corba/.hgtags	Wed Jul 05 20:06:12 2017 +0200
@@ -279,3 +279,4 @@
 24a0bad5910f775bb4002d1dacf8b3af87c63cd8 jdk9-b34
 9bc2dbd3dfb8c9fa88e00056b8b93a81ee6d306e jdk9-b35
 ffd90c81d4ef9d94d880fc852e2fc482ecd9b374 jdk9-b36
+7e9add74ad50841fb39dae75db56374aefa1de4c jdk9-b37
--- a/hotspot/.hgtags	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/.hgtags	Wed Jul 05 20:06:12 2017 +0200
@@ -439,3 +439,4 @@
 821164b0131a47ca065697c7d27d8f215e608c8d jdk9-b34
 438cb613151c4bd290bb732697517cba1cafcb04 jdk9-b35
 464ab653fbb17eb518d8ef60f8df301de7ef00d0 jdk9-b36
+b1c2dd843f247a1db19e1e85eb62ca405f72dc26 jdk9-b37
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -734,7 +734,7 @@
 
 // Move class loader data from main list to the unloaded list for unloading
 // and deallocation later.
-bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure) {
+bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure, bool clean_alive) {
   ClassLoaderData* data = _head;
   ClassLoaderData* prev = NULL;
   bool seen_dead_loader = false;
@@ -743,27 +743,9 @@
   // purging and we don't want to rewalk the previously unloaded class loader data.
   _saved_unloading = _unloading;
 
-  // mark metadata seen on the stack and code cache so we can delete
-  // unneeded entries.
-  bool has_redefined_a_class = JvmtiExport::has_redefined_a_class();
-  MetadataOnStackMark md_on_stack(has_redefined_a_class);
-  if (has_redefined_a_class) {
-    // purge_previous_versions also cleans weak method links. Because
-    // one method's MDO can reference another method from another
-    // class loader, we need to first clean weak method links for all
-    // class loaders here. Below, we can then free redefined methods
-    // for all class loaders.
-    while (data != NULL) {
-      if (data->is_alive(is_alive_closure)) {
-        data->classes_do(InstanceKlass::purge_previous_versions);
-      }
-      data = data->next();
-    }
-  }
   data = _head;
   while (data != NULL) {
     if (data->is_alive(is_alive_closure)) {
-      data->free_deallocate_list();
       prev = data;
       data = data->next();
       continue;
@@ -785,6 +767,11 @@
     _unloading = dead;
   }
 
+  if (clean_alive) {
+    // Clean previous versions and the deallocate list.
+    ClassLoaderDataGraph::clean_metaspaces();
+  }
+
   if (seen_dead_loader) {
     post_class_unload_events();
   }
@@ -792,6 +779,26 @@
   return seen_dead_loader;
 }
 
+void ClassLoaderDataGraph::clean_metaspaces() {
+  // mark metadata seen on the stack and code cache so we can delete unneeded entries.
+  bool has_redefined_a_class = JvmtiExport::has_redefined_a_class();
+  MetadataOnStackMark md_on_stack(has_redefined_a_class);
+
+  if (has_redefined_a_class) {
+    // purge_previous_versions also cleans weak method links. Because
+    // one method's MDO can reference another method from another
+    // class loader, we need to first clean weak method links for all
+    // class loaders here. Below, we can then free redefined methods
+    // for all class loaders.
+    for (ClassLoaderData* data = _head; data != NULL; data = data->next()) {
+      data->classes_do(InstanceKlass::purge_previous_versions);
+    }
+  }
+
+  // Need to purge the previous version before deallocating.
+  free_deallocate_lists();
+}
+
 void ClassLoaderDataGraph::purge() {
   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
   ClassLoaderData* list = _unloading;
@@ -819,6 +826,14 @@
 #endif
 }
 
+void ClassLoaderDataGraph::free_deallocate_lists() {
+  for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
+    // We need to keep this data until InstanceKlass::purge_previous_version has been
+    // called on all alive classes. See the comment in ClassLoaderDataGraph::clean_metaspaces.
+    cld->free_deallocate_list();
+  }
+}
+
 // CDS support
 
 // Global metaspaces for writing information to the shared archive.  When
--- a/hotspot/src/share/vm/classfile/classLoaderData.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/classfile/classLoaderData.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -71,6 +71,7 @@
 
   static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS);
   static void post_class_unload_events(void);
+  static void clean_metaspaces();
  public:
   static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
   static void purge();
@@ -90,7 +91,7 @@
   static void methods_do(void f(Method*));
   static void loaded_classes_do(KlassClosure* klass_closure);
   static void classes_unloading_do(void f(Klass* const));
-  static bool do_unloading(BoolObjectClosure* is_alive);
+  static bool do_unloading(BoolObjectClosure* is_alive, bool clean_alive);
 
   // CMS support.
   static void remember_new_clds(bool remember) { _saved_head = (remember ? _head : NULL); }
@@ -106,6 +107,8 @@
     }
   }
 
+  static void free_deallocate_lists();
+
   static void dump_on(outputStream * const out) PRODUCT_RETURN;
   static void dump() { dump_on(tty); }
   static void verify();
--- a/hotspot/src/share/vm/classfile/metadataOnStackMark.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/classfile/metadataOnStackMark.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -31,25 +31,23 @@
 #include "runtime/synchronizer.hpp"
 #include "runtime/thread.hpp"
 #include "services/threadService.hpp"
-#include "utilities/growableArray.hpp"
-
+#include "utilities/chunkedList.hpp"
 
-// Keep track of marked on-stack metadata so it can be cleared.
-GrowableArray<Metadata*>* _marked_objects = NULL;
+volatile MetadataOnStackBuffer* MetadataOnStackMark::_used_buffers = NULL;
+volatile MetadataOnStackBuffer* MetadataOnStackMark::_free_buffers = NULL;
+
 NOT_PRODUCT(bool MetadataOnStackMark::_is_active = false;)
 
 // Walk metadata on the stack and mark it so that redefinition doesn't delete
 // it.  Class unloading also walks the previous versions and might try to
 // delete it, so this class is used by class unloading also.
-MetadataOnStackMark::MetadataOnStackMark(bool has_redefined_a_class) {
+MetadataOnStackMark::MetadataOnStackMark(bool visit_code_cache) {
   assert(SafepointSynchronize::is_at_safepoint(), "sanity check");
+  assert(_used_buffers == NULL, "sanity check");
   NOT_PRODUCT(_is_active = true;)
-  if (_marked_objects == NULL) {
-    _marked_objects = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(1000, true);
-  }
 
   Threads::metadata_do(Metadata::mark_on_stack);
-  if (has_redefined_a_class) {
+  if (visit_code_cache) {
     CodeCache::alive_nmethods_do(nmethod::mark_on_stack);
   }
   CompileBroker::mark_on_stack();
@@ -62,15 +60,93 @@
   // Unmark everything that was marked.   Can't do the same walk because
   // redefine classes messes up the code cache so the set of methods
   // might not be the same.
-  for (int i = 0; i< _marked_objects->length(); i++) {
-    _marked_objects->at(i)->set_on_stack(false);
+
+  retire_buffer_for_thread(Thread::current());
+
+  MetadataOnStackBuffer* buffer = const_cast<MetadataOnStackBuffer* >(_used_buffers);
+  while (buffer != NULL) {
+    // Clear on stack state for all metadata.
+    size_t size = buffer->size();
+    for (size_t i  = 0; i < size; i++) {
+      Metadata* md = buffer->at(i);
+      md->set_on_stack(false);
+    }
+
+    MetadataOnStackBuffer* next = buffer->next_used();
+
+    // Move the buffer to the free list.
+    buffer->clear();
+    buffer->set_next_used(NULL);
+    buffer->set_next_free(const_cast<MetadataOnStackBuffer*>(_free_buffers));
+    _free_buffers = buffer;
+
+    // Step to next used buffer.
+    buffer = next;
   }
-  _marked_objects->clear();   // reuse growable array for next time.
+
+  _used_buffers = NULL;
+
   NOT_PRODUCT(_is_active = false;)
 }
 
+void MetadataOnStackMark::retire_buffer(MetadataOnStackBuffer* buffer) {
+  if (buffer == NULL) {
+    return;
+  }
+
+  MetadataOnStackBuffer* old_head;
+
+  do {
+    old_head = const_cast<MetadataOnStackBuffer*>(_used_buffers);
+    buffer->set_next_used(old_head);
+  } while (Atomic::cmpxchg_ptr(buffer, &_used_buffers, old_head) != old_head);
+}
+
+void MetadataOnStackMark::retire_buffer_for_thread(Thread* thread) {
+  retire_buffer(thread->metadata_on_stack_buffer());
+  thread->set_metadata_on_stack_buffer(NULL);
+}
+
+bool MetadataOnStackMark::has_buffer_for_thread(Thread* thread) {
+  return thread->metadata_on_stack_buffer() != NULL;
+}
+
+MetadataOnStackBuffer* MetadataOnStackMark::allocate_buffer() {
+  MetadataOnStackBuffer* allocated;
+  MetadataOnStackBuffer* new_head;
+
+  do {
+    allocated = const_cast<MetadataOnStackBuffer*>(_free_buffers);
+    if (allocated == NULL) {
+      break;
+    }
+    new_head = allocated->next_free();
+  } while (Atomic::cmpxchg_ptr(new_head, &_free_buffers, allocated) != allocated);
+
+  if (allocated == NULL) {
+    allocated = new MetadataOnStackBuffer();
+  }
+
+  assert(!allocated->is_full(), err_msg("Should not be full: " PTR_FORMAT, p2i(allocated)));
+
+  return allocated;
+}
+
 // Record which objects are marked so we can unmark the same objects.
-void MetadataOnStackMark::record(Metadata* m) {
+void MetadataOnStackMark::record(Metadata* m, Thread* thread) {
   assert(_is_active, "metadata on stack marking is active");
-  _marked_objects->push(m);
+
+  MetadataOnStackBuffer* buffer =  thread->metadata_on_stack_buffer();
+
+  if (buffer != NULL && buffer->is_full()) {
+    retire_buffer(buffer);
+    buffer = NULL;
+  }
+
+  if (buffer == NULL) {
+    buffer = allocate_buffer();
+    thread->set_metadata_on_stack_buffer(buffer);
+  }
+
+  buffer->push(m);
 }
--- a/hotspot/src/share/vm/classfile/metadataOnStackMark.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/classfile/metadataOnStackMark.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -26,9 +26,12 @@
 #define SHARE_VM_CLASSFILE_METADATAONSTACKMARK_HPP
 
 #include "memory/allocation.hpp"
+#include "utilities/chunkedList.hpp"
 
 class Metadata;
 
+typedef ChunkedList<Metadata*, mtInternal> MetadataOnStackBuffer;
+
 // Helper class to mark and unmark metadata used on the stack as either handles
 // or executing methods, so that it can't be deleted during class redefinition
 // and class unloading.
@@ -36,10 +39,20 @@
 // metadata during parsing, relocated methods, and methods in backtraces.
 class MetadataOnStackMark : public StackObj {
   NOT_PRODUCT(static bool _is_active;)
+
+  static volatile MetadataOnStackBuffer* _used_buffers;
+  static volatile MetadataOnStackBuffer* _free_buffers;
+
+  static MetadataOnStackBuffer* allocate_buffer();
+  static void retire_buffer(MetadataOnStackBuffer* buffer);
+
  public:
-  MetadataOnStackMark(bool has_redefined_a_class);
-  ~MetadataOnStackMark();
-  static void record(Metadata* m);
+  MetadataOnStackMark(bool visit_code_cache);
+   ~MetadataOnStackMark();
+
+  static void record(Metadata* m, Thread* thread);
+  static void retire_buffer_for_thread(Thread* thread);
+  static bool has_buffer_for_thread(Thread* thread);
 };
 
 #endif // SHARE_VM_CLASSFILE_METADATAONSTACKMARK_HPP
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -1690,9 +1690,9 @@
 
 // Assumes classes in the SystemDictionary are only unloaded at a safepoint
 // Note: anonymous classes are not in the SD.
-bool SystemDictionary::do_unloading(BoolObjectClosure* is_alive) {
+bool SystemDictionary::do_unloading(BoolObjectClosure* is_alive, bool clean_alive) {
   // First, mark for unload all ClassLoaderData referencing a dead class loader.
-  bool unloading_occurred = ClassLoaderDataGraph::do_unloading(is_alive);
+  bool unloading_occurred = ClassLoaderDataGraph::do_unloading(is_alive, clean_alive);
   if (unloading_occurred) {
     dictionary()->do_unloading();
     constraints()->purge_loader_constraints();
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -334,7 +334,7 @@
 
   // Unload (that is, break root links to) all unmarked classes and
   // loaders.  Returns "true" iff something was unloaded.
-  static bool do_unloading(BoolObjectClosure* is_alive);
+  static bool do_unloading(BoolObjectClosure* is_alive, bool clean_alive = true);
 
   // Used by DumpSharedSpaces only to remove classes that failed verification
   static void remove_classes_in_error_state();
--- a/hotspot/src/share/vm/code/nmethod.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/code/nmethod.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -1700,11 +1700,17 @@
   set_unload_reported();
 }
 
-void static clean_ic_if_metadata_is_dead(CompiledIC *ic, BoolObjectClosure *is_alive) {
+void static clean_ic_if_metadata_is_dead(CompiledIC *ic, BoolObjectClosure *is_alive, bool mark_on_stack) {
   if (ic->is_icholder_call()) {
     // The only exception is compiledICHolder oops which may
     // yet be marked below. (We check this further below).
     CompiledICHolder* cichk_oop = ic->cached_icholder();
+
+    if (mark_on_stack) {
+      Metadata::mark_on_stack(cichk_oop->holder_method());
+      Metadata::mark_on_stack(cichk_oop->holder_klass());
+    }
+
     if (cichk_oop->holder_method()->method_holder()->is_loader_alive(is_alive) &&
         cichk_oop->holder_klass()->is_loader_alive(is_alive)) {
       return;
@@ -1712,6 +1718,10 @@
   } else {
     Metadata* ic_oop = ic->cached_metadata();
     if (ic_oop != NULL) {
+      if (mark_on_stack) {
+        Metadata::mark_on_stack(ic_oop);
+      }
+
       if (ic_oop->is_klass()) {
         if (((Klass*)ic_oop)->is_loader_alive(is_alive)) {
           return;
@@ -1772,7 +1782,7 @@
     while(iter.next()) {
       if (iter.type() == relocInfo::virtual_call_type) {
         CompiledIC *ic = CompiledIC_at(&iter);
-        clean_ic_if_metadata_is_dead(ic, is_alive);
+        clean_ic_if_metadata_is_dead(ic, is_alive, false);
       }
     }
   }
@@ -1840,6 +1850,53 @@
   return clean_if_nmethod_is_unloaded(csc, csc->destination(), is_alive, from);
 }
 
+bool nmethod::unload_if_dead_at(RelocIterator* iter_at_oop, BoolObjectClosure *is_alive, bool unloading_occurred) {
+  assert(iter_at_oop->type() == relocInfo::oop_type, "Wrong relocation type");
+
+  oop_Relocation* r = iter_at_oop->oop_reloc();
+  // Traverse those oops directly embedded in the code.
+  // Other oops (oop_index>0) are seen as part of scopes_oops.
+  assert(1 == (r->oop_is_immediate()) +
+         (r->oop_addr() >= oops_begin() && r->oop_addr() < oops_end()),
+         "oop must be found in exactly one place");
+  if (r->oop_is_immediate() && r->oop_value() != NULL) {
+    // Unload this nmethod if the oop is dead.
+    if (can_unload(is_alive, r->oop_addr(), unloading_occurred)) {
+      return true;;
+    }
+  }
+
+  return false;
+}
+
+void nmethod::mark_metadata_on_stack_at(RelocIterator* iter_at_metadata) {
+  assert(iter_at_metadata->type() == relocInfo::metadata_type, "Wrong relocation type");
+
+  metadata_Relocation* r = iter_at_metadata->metadata_reloc();
+  // In this metadata, we must only follow those metadatas directly embedded in
+  // the code.  Other metadatas (oop_index>0) are seen as part of
+  // the metadata section below.
+  assert(1 == (r->metadata_is_immediate()) +
+         (r->metadata_addr() >= metadata_begin() && r->metadata_addr() < metadata_end()),
+         "metadata must be found in exactly one place");
+  if (r->metadata_is_immediate() && r->metadata_value() != NULL) {
+    Metadata* md = r->metadata_value();
+    if (md != _method) Metadata::mark_on_stack(md);
+  }
+}
+
+void nmethod::mark_metadata_on_stack_non_relocs() {
+    // Visit the metadata section
+    for (Metadata** p = metadata_begin(); p < metadata_end(); p++) {
+      if (*p == Universe::non_oop_word() || *p == NULL)  continue;  // skip non-oops
+      Metadata* md = *p;
+      Metadata::mark_on_stack(md);
+    }
+
+    // Visit metadata not embedded in the other places.
+    if (_method != NULL) Metadata::mark_on_stack(_method);
+}
+
 bool nmethod::do_unloading_parallel(BoolObjectClosure* is_alive, bool unloading_occurred) {
   ResourceMark rm;
 
@@ -1869,6 +1926,11 @@
     unloading_occurred = true;
   }
 
+  // When class redefinition is used all metadata in the CodeCache has to be recorded,
+  // so that unused "previous versions" can be purged. Since walking the CodeCache can
+  // be expensive, the "mark on stack" is piggy-backed on this parallel unloading code.
+  bool mark_metadata_on_stack = a_class_was_redefined;
+
   // Exception cache
   clean_exception_cache(is_alive);
 
@@ -1884,7 +1946,7 @@
       if (unloading_occurred) {
         // If class unloading occurred we first iterate over all inline caches and
         // clear ICs where the cached oop is referring to an unloaded klass or method.
-        clean_ic_if_metadata_is_dead(CompiledIC_at(&iter), is_alive);
+        clean_ic_if_metadata_is_dead(CompiledIC_at(&iter), is_alive, mark_metadata_on_stack);
       }
 
       postponed |= clean_if_nmethod_is_unloaded(CompiledIC_at(&iter), is_alive, this);
@@ -1900,24 +1962,21 @@
 
     case relocInfo::oop_type:
       if (!is_unloaded) {
-        // Unload check
-        oop_Relocation* r = iter.oop_reloc();
-        // Traverse those oops directly embedded in the code.
-        // Other oops (oop_index>0) are seen as part of scopes_oops.
-        assert(1 == (r->oop_is_immediate()) +
-                  (r->oop_addr() >= oops_begin() && r->oop_addr() < oops_end()),
-              "oop must be found in exactly one place");
-        if (r->oop_is_immediate() && r->oop_value() != NULL) {
-          if (can_unload(is_alive, r->oop_addr(), unloading_occurred)) {
-            is_unloaded = true;
-          }
-        }
+        is_unloaded = unload_if_dead_at(&iter, is_alive, unloading_occurred);
       }
       break;
 
+    case relocInfo::metadata_type:
+      if (mark_metadata_on_stack) {
+        mark_metadata_on_stack_at(&iter);
+      }
     }
   }
 
+  if (mark_metadata_on_stack) {
+    mark_metadata_on_stack_non_relocs();
+  }
+
   if (is_unloaded) {
     return postponed;
   }
@@ -2065,7 +2124,7 @@
     while (iter.next()) {
       if (iter.type() == relocInfo::metadata_type ) {
         metadata_Relocation* r = iter.metadata_reloc();
-        // In this lmetadata, we must only follow those metadatas directly embedded in
+        // In this metadata, we must only follow those metadatas directly embedded in
         // the code.  Other metadatas (oop_index>0) are seen as part of
         // the metadata section below.
         assert(1 == (r->metadata_is_immediate()) +
@@ -2099,7 +2158,7 @@
     f(md);
   }
 
-  // Call function Method*, not embedded in these other places.
+  // Visit metadata not embedded in the other places.
   if (_method != NULL) f(_method);
 }
 
--- a/hotspot/src/share/vm/code/nmethod.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/code/nmethod.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -615,9 +615,16 @@
   //  The parallel versions are used by G1.
   bool do_unloading_parallel(BoolObjectClosure* is_alive, bool unloading_occurred);
   void do_unloading_parallel_postponed(BoolObjectClosure* is_alive, bool unloading_occurred);
+
+ private:
   //  Unload a nmethod if the *root object is dead.
   bool can_unload(BoolObjectClosure* is_alive, oop* root, bool unloading_occurred);
+  bool unload_if_dead_at(RelocIterator *iter_at_oop, BoolObjectClosure* is_alive, bool unloading_occurred);
 
+  void mark_metadata_on_stack_at(RelocIterator* iter_at_metadata);
+  void mark_metadata_on_stack_non_relocs();
+
+ public:
   void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
                                      OopClosure* f);
   void oops_do(OopClosure* f) { oops_do(f, false); }
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -64,23 +64,6 @@
   set_hint(hint);
 }
 
-#ifndef PRODUCT
-template <class Chunk>
-void AdaptiveFreeList<Chunk>::assert_proper_lock_protection_work() const {
-  assert(protecting_lock() != NULL, "Don't call this directly");
-  assert(ParallelGCThreads > 0, "Don't call this directly");
-  Thread* thr = Thread::current();
-  if (thr->is_VM_thread() || thr->is_ConcurrentGC_thread()) {
-    // assert that we are holding the freelist lock
-  } else if (thr->is_GC_task_thread()) {
-    assert(protecting_lock()->owned_by_self(), "FreeList RACE DETECTED");
-  } else if (thr->is_Java_thread()) {
-    assert(!SafepointSynchronize::is_at_safepoint(), "Should not be executing");
-  } else {
-    ShouldNotReachHere();  // unaccounted thread type?
-  }
-}
-#endif
 template <class Chunk>
 void AdaptiveFreeList<Chunk>::init_statistics(bool split_birth) {
   _allocation_stats.initialize(split_birth);
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -81,8 +81,6 @@
   // Reset the head, tail, hint, and count of a free list.
   void reset(size_t hint);
 
-  void assert_proper_lock_protection_work() const PRODUCT_RETURN;
-
   void print_on(outputStream* st, const char* c = NULL) const;
 
   size_t hint() const {
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -149,18 +149,15 @@
   check_free_list_consistency();
 
   // Initialize locks for parallel case.
-
-  if (CollectedHeap::use_parallel_gc_threads()) {
-    for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
-      _indexedFreeListParLocks[i] = new Mutex(Mutex::leaf - 1, // == ExpandHeap_lock - 1
-                                              "a freelist par lock",
-                                              true);
-      DEBUG_ONLY(
-        _indexedFreeList[i].set_protecting_lock(_indexedFreeListParLocks[i]);
-      )
-    }
-    _dictionary->set_par_lock(&_parDictionaryAllocLock);
+  for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) {
+    _indexedFreeListParLocks[i] = new Mutex(Mutex::leaf - 1, // == ExpandHeap_lock - 1
+                                            "a freelist par lock",
+                                            true);
+    DEBUG_ONLY(
+      _indexedFreeList[i].set_protecting_lock(_indexedFreeListParLocks[i]);
+    )
   }
+  _dictionary->set_par_lock(&_parDictionaryAllocLock);
 }
 
 // Like CompactibleSpace forward() but always calls cross_threshold() to
@@ -622,17 +619,11 @@
         // Mark the boundary of the new block in BOT
         _bt.mark_block(prevEnd, value);
         // put it all in the linAB
-        if (ParallelGCThreads == 0) {
-          _smallLinearAllocBlock._ptr = prevEnd;
-          _smallLinearAllocBlock._word_size = newFcSize;
-          repairLinearAllocBlock(&_smallLinearAllocBlock);
-        } else { // ParallelGCThreads > 0
-          MutexLockerEx x(parDictionaryAllocLock(),
-                          Mutex::_no_safepoint_check_flag);
-          _smallLinearAllocBlock._ptr = prevEnd;
-          _smallLinearAllocBlock._word_size = newFcSize;
-          repairLinearAllocBlock(&_smallLinearAllocBlock);
-        }
+        MutexLockerEx x(parDictionaryAllocLock(),
+                        Mutex::_no_safepoint_check_flag);
+        _smallLinearAllocBlock._ptr = prevEnd;
+        _smallLinearAllocBlock._word_size = newFcSize;
+        repairLinearAllocBlock(&_smallLinearAllocBlock);
         // Births of chunks put into a LinAB are not recorded.  Births
         // of chunks as they are allocated out of a LinAB are.
       } else {
@@ -1740,10 +1731,7 @@
   assert(chunk != NULL && is_in_reserved(chunk), "Not in this space!");
   // One of the parallel gc task threads may be here
   // whilst others are allocating.
-  Mutex* lock = NULL;
-  if (ParallelGCThreads != 0) {
-    lock = &_parDictionaryAllocLock;
-  }
+  Mutex* lock = &_parDictionaryAllocLock;
   FreeChunk* ec;
   {
     MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
@@ -1760,7 +1748,7 @@
   }
   ec->set_size(size);
   debug_only(ec->mangleFreed(size));
-  if (size < SmallForDictionary && ParallelGCThreads != 0) {
+  if (size < SmallForDictionary) {
     lock = _indexedFreeListParLocks[size];
   }
   MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag);
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -887,10 +887,8 @@
   // along with all the other pointers into the heap but
   // compaction is expected to be a rare event with
   // a heap using cms so don't do it without seeing the need.
-  if (CollectedHeap::use_parallel_gc_threads()) {
-    for (uint i = 0; i < ParallelGCThreads; i++) {
-      _par_gc_thread_states[i]->promo.reset();
-    }
+  for (uint i = 0; i < ParallelGCThreads; i++) {
+    _par_gc_thread_states[i]->promo.reset();
   }
 }
 
@@ -2804,10 +2802,8 @@
   collector()->gc_epilogue(full);
 
   // Also reset promotion tracking in par gc thread states.
-  if (CollectedHeap::use_parallel_gc_threads()) {
-    for (uint i = 0; i < ParallelGCThreads; i++) {
-      _par_gc_thread_states[i]->promo.stopTrackingPromotions(i);
-    }
+  for (uint i = 0; i < ParallelGCThreads; i++) {
+    _par_gc_thread_states[i]->promo.stopTrackingPromotions(i);
   }
 }
 
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -23,6 +23,7 @@
  */
 
 #include "precompiled.hpp"
+#include "classfile/metadataOnStackMark.hpp"
 #include "classfile/symbolTable.hpp"
 #include "code/codeCache.hpp"
 #include "gc_implementation/g1/concurrentMark.inline.hpp"
@@ -611,74 +612,64 @@
             ConcGCThreads, ParallelGCThreads);
     return;
   }
-  if (ParallelGCThreads == 0) {
-    // if we are not running with any parallel GC threads we will not
-    // spawn any marking threads either
-    _parallel_marking_threads =       0;
-    _max_parallel_marking_threads =   0;
-    _sleep_factor             =     0.0;
-    _marking_task_overhead    =     1.0;
+  if (!FLAG_IS_DEFAULT(ConcGCThreads) && ConcGCThreads > 0) {
+    // Note: ConcGCThreads has precedence over G1MarkingOverheadPercent
+    // if both are set
+    _sleep_factor             = 0.0;
+    _marking_task_overhead    = 1.0;
+  } else if (G1MarkingOverheadPercent > 0) {
+    // We will calculate the number of parallel marking threads based
+    // on a target overhead with respect to the soft real-time goal
+    double marking_overhead = (double) G1MarkingOverheadPercent / 100.0;
+    double overall_cm_overhead =
+      (double) MaxGCPauseMillis * marking_overhead /
+      (double) GCPauseIntervalMillis;
+    double cpu_ratio = 1.0 / (double) os::processor_count();
+    double marking_thread_num = ceil(overall_cm_overhead / cpu_ratio);
+    double marking_task_overhead =
+      overall_cm_overhead / marking_thread_num *
+                                              (double) os::processor_count();
+    double sleep_factor =
+                       (1.0 - marking_task_overhead) / marking_task_overhead;
+
+    FLAG_SET_ERGO(uintx, ConcGCThreads, (uint) marking_thread_num);
+    _sleep_factor             = sleep_factor;
+    _marking_task_overhead    = marking_task_overhead;
   } else {
-    if (!FLAG_IS_DEFAULT(ConcGCThreads) && ConcGCThreads > 0) {
-      // Note: ConcGCThreads has precedence over G1MarkingOverheadPercent
-      // if both are set
-      _sleep_factor             = 0.0;
-      _marking_task_overhead    = 1.0;
-    } else if (G1MarkingOverheadPercent > 0) {
-      // We will calculate the number of parallel marking threads based
-      // on a target overhead with respect to the soft real-time goal
-      double marking_overhead = (double) G1MarkingOverheadPercent / 100.0;
-      double overall_cm_overhead =
-        (double) MaxGCPauseMillis * marking_overhead /
-        (double) GCPauseIntervalMillis;
-      double cpu_ratio = 1.0 / (double) os::processor_count();
-      double marking_thread_num = ceil(overall_cm_overhead / cpu_ratio);
-      double marking_task_overhead =
-        overall_cm_overhead / marking_thread_num *
-                                                (double) os::processor_count();
-      double sleep_factor =
-                         (1.0 - marking_task_overhead) / marking_task_overhead;
-
-      FLAG_SET_ERGO(uintx, ConcGCThreads, (uint) marking_thread_num);
-      _sleep_factor             = sleep_factor;
-      _marking_task_overhead    = marking_task_overhead;
-    } else {
-      // Calculate the number of parallel marking threads by scaling
-      // the number of parallel GC threads.
-      uint marking_thread_num = scale_parallel_threads((uint) ParallelGCThreads);
-      FLAG_SET_ERGO(uintx, ConcGCThreads, marking_thread_num);
-      _sleep_factor             = 0.0;
-      _marking_task_overhead    = 1.0;
-    }
-
-    assert(ConcGCThreads > 0, "Should have been set");
-    _parallel_marking_threads = (uint) ConcGCThreads;
-    _max_parallel_marking_threads = _parallel_marking_threads;
-
-    if (parallel_marking_threads() > 1) {
-      _cleanup_task_overhead = 1.0;
-    } else {
-      _cleanup_task_overhead = marking_task_overhead();
-    }
-    _cleanup_sleep_factor =
-                     (1.0 - cleanup_task_overhead()) / cleanup_task_overhead();
+    // Calculate the number of parallel marking threads by scaling
+    // the number of parallel GC threads.
+    uint marking_thread_num = scale_parallel_threads((uint) ParallelGCThreads);
+    FLAG_SET_ERGO(uintx, ConcGCThreads, marking_thread_num);
+    _sleep_factor             = 0.0;
+    _marking_task_overhead    = 1.0;
+  }
+
+  assert(ConcGCThreads > 0, "Should have been set");
+  _parallel_marking_threads = (uint) ConcGCThreads;
+  _max_parallel_marking_threads = _parallel_marking_threads;
+
+  if (parallel_marking_threads() > 1) {
+    _cleanup_task_overhead = 1.0;
+  } else {
+    _cleanup_task_overhead = marking_task_overhead();
+  }
+  _cleanup_sleep_factor =
+                   (1.0 - cleanup_task_overhead()) / cleanup_task_overhead();
 
 #if 0
-    gclog_or_tty->print_cr("Marking Threads          %d", parallel_marking_threads());
-    gclog_or_tty->print_cr("CM Marking Task Overhead %1.4lf", marking_task_overhead());
-    gclog_or_tty->print_cr("CM Sleep Factor          %1.4lf", sleep_factor());
-    gclog_or_tty->print_cr("CL Marking Task Overhead %1.4lf", cleanup_task_overhead());
-    gclog_or_tty->print_cr("CL Sleep Factor          %1.4lf", cleanup_sleep_factor());
+  gclog_or_tty->print_cr("Marking Threads          %d", parallel_marking_threads());
+  gclog_or_tty->print_cr("CM Marking Task Overhead %1.4lf", marking_task_overhead());
+  gclog_or_tty->print_cr("CM Sleep Factor          %1.4lf", sleep_factor());
+  gclog_or_tty->print_cr("CL Marking Task Overhead %1.4lf", cleanup_task_overhead());
+  gclog_or_tty->print_cr("CL Sleep Factor          %1.4lf", cleanup_sleep_factor());
 #endif
 
-    guarantee(parallel_marking_threads() > 0, "peace of mind");
-    _parallel_workers = new FlexibleWorkGang("G1 Parallel Marking Threads",
-         _max_parallel_marking_threads, false, true);
-    if (_parallel_workers == NULL) {
-      vm_exit_during_initialization("Failed necessary allocation.");
-    } else {
-      _parallel_workers->initialize_workers();
-    }
+  _parallel_workers = new FlexibleWorkGang("G1 Parallel Marking Threads",
+       _max_parallel_marking_threads, false, true);
+  if (_parallel_workers == NULL) {
+    vm_exit_during_initialization("Failed necessary allocation.");
+  } else {
+    _parallel_workers->initialize_workers();
   }
 
   if (FLAG_IS_DEFAULT(MarkStackSize)) {
@@ -1166,29 +1157,23 @@
 // Calculates the number of active workers for a concurrent
 // phase.
 uint ConcurrentMark::calc_parallel_marking_threads() {
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    uint n_conc_workers = 0;
-    if (!UseDynamicNumberOfGCThreads ||
-        (!FLAG_IS_DEFAULT(ConcGCThreads) &&
-         !ForceDynamicNumberOfGCThreads)) {
-      n_conc_workers = max_parallel_marking_threads();
-    } else {
-      n_conc_workers =
-        AdaptiveSizePolicy::calc_default_active_workers(
-                                     max_parallel_marking_threads(),
-                                     1, /* Minimum workers */
-                                     parallel_marking_threads(),
-                                     Threads::number_of_non_daemon_threads());
-      // Don't scale down "n_conc_workers" by scale_parallel_threads() because
-      // that scaling has already gone into "_max_parallel_marking_threads".
-    }
-    assert(n_conc_workers > 0, "Always need at least 1");
-    return n_conc_workers;
+  uint n_conc_workers = 0;
+  if (!UseDynamicNumberOfGCThreads ||
+      (!FLAG_IS_DEFAULT(ConcGCThreads) &&
+       !ForceDynamicNumberOfGCThreads)) {
+    n_conc_workers = max_parallel_marking_threads();
+  } else {
+    n_conc_workers =
+      AdaptiveSizePolicy::calc_default_active_workers(
+                                   max_parallel_marking_threads(),
+                                   1, /* Minimum workers */
+                                   parallel_marking_threads(),
+                                   Threads::number_of_non_daemon_threads());
+    // Don't scale down "n_conc_workers" by scale_parallel_threads() because
+    // that scaling has already gone into "_max_parallel_marking_threads".
   }
-  // If we are not running with any parallel GC threads we will not
-  // have spawned any marking threads either. Hence the number of
-  // concurrent workers should be 0.
-  return 0;
+  assert(n_conc_workers > 0, "Always need at least 1");
+  return n_conc_workers;
 }
 
 void ConcurrentMark::scanRootRegion(HeapRegion* hr, uint worker_id) {
@@ -1243,12 +1228,8 @@
     uint active_workers = MAX2(1U, parallel_marking_threads());
 
     CMRootRegionScanTask task(this);
-    if (use_parallel_marking_threads()) {
-      _parallel_workers->set_active_workers((int) active_workers);
-      _parallel_workers->run_task(&task);
-    } else {
-      task.work(0);
-    }
+    _parallel_workers->set_active_workers(active_workers);
+    _parallel_workers->run_task(&task);
 
     // It's possible that has_aborted() is true here without actually
     // aborting the survivor scan earlier. This is OK as it's
@@ -1279,15 +1260,11 @@
   set_concurrency_and_phase(active_workers, true /* concurrent */);
 
   CMConcurrentMarkingTask markingTask(this, cmThread());
-  if (use_parallel_marking_threads()) {
-    _parallel_workers->set_active_workers((int)active_workers);
-    // Don't set _n_par_threads because it affects MT in process_roots()
-    // and the decisions on that MT processing is made elsewhere.
-    assert(_parallel_workers->active_workers() > 0, "Should have been set");
-    _parallel_workers->run_task(&markingTask);
-  } else {
-    markingTask.work(0);
-  }
+  _parallel_workers->set_active_workers(active_workers);
+  // Don't set _n_par_threads because it affects MT in process_roots()
+  // and the decisions on that MT processing is made elsewhere.
+  assert(_parallel_workers->active_workers() > 0, "Should have been set");
+  _parallel_workers->run_task(&markingTask);
   print_stats();
 }
 
@@ -1714,11 +1691,7 @@
                                             _expected_card_bm,
                                             _verbose);
 
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      _g1h->heap_region_par_iterate(&verify_cl, worker_id, &_hrclaimer);
-    } else {
-      _g1h->heap_region_iterate(&verify_cl);
-    }
+    _g1h->heap_region_par_iterate(&verify_cl, worker_id, &_hrclaimer);
 
     Atomic::add(verify_cl.failures(), &_failures);
   }
@@ -1821,11 +1794,7 @@
                                                 _actual_region_bm,
                                                 _actual_card_bm);
 
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      _g1h->heap_region_par_iterate(&final_update_cl, worker_id, &_hrclaimer);
-    } else {
-      _g1h->heap_region_iterate(&final_update_cl);
-    }
+    _g1h->heap_region_par_iterate(&final_update_cl, worker_id, &_hrclaimer);
   }
 };
 
@@ -1922,11 +1891,7 @@
     HRRSCleanupTask hrrs_cleanup_task;
     G1NoteEndOfConcMarkClosure g1_note_end(_g1h, &local_cleanup_list,
                                            &hrrs_cleanup_task);
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      _g1h->heap_region_par_iterate(&g1_note_end, worker_id, &_hrclaimer);
-    } else {
-      _g1h->heap_region_iterate(&g1_note_end);
-    }
+    _g1h->heap_region_par_iterate(&g1_note_end, worker_id, &_hrclaimer);
     assert(g1_note_end.complete(), "Shouldn't have yielded!");
 
     // Now update the lists
@@ -1977,11 +1942,7 @@
   }
 
   void work(uint worker_id) {
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      _g1rs->scrub_par(_region_bm, _card_bm, worker_id, &_hrclaimer);
-    } else {
-      _g1rs->scrub(_region_bm, _card_bm);
-    }
+    _g1rs->scrub(_region_bm, _card_bm, worker_id, &_hrclaimer);
   }
 
 };
@@ -2020,18 +1981,13 @@
   // Do counting once more with the world stopped for good measure.
   G1ParFinalCountTask g1_par_count_task(g1h, &_region_bm, &_card_bm);
 
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    g1h->set_par_threads();
-    n_workers = g1h->n_par_threads();
-    assert(g1h->n_par_threads() == n_workers,
-           "Should not have been reset");
-    g1h->workers()->run_task(&g1_par_count_task);
-    // Done with the parallel phase so reset to 0.
-    g1h->set_par_threads(0);
-  } else {
-    n_workers = 1;
-    g1_par_count_task.work(0);
-  }
+  g1h->set_par_threads();
+  n_workers = g1h->n_par_threads();
+  assert(g1h->n_par_threads() == n_workers,
+         "Should not have been reset");
+  g1h->workers()->run_task(&g1_par_count_task);
+  // Done with the parallel phase so reset to 0.
+  g1h->set_par_threads(0);
 
   if (VerifyDuringGC) {
     // Verify that the counting data accumulated during marking matches
@@ -2047,14 +2003,10 @@
                                                  &expected_region_bm,
                                                  &expected_card_bm);
 
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      g1h->set_par_threads((int)n_workers);
-      g1h->workers()->run_task(&g1_par_verify_task);
-      // Done with the parallel phase so reset to 0.
-      g1h->set_par_threads(0);
-    } else {
-      g1_par_verify_task.work(0);
-    }
+    g1h->set_par_threads((int)n_workers);
+    g1h->workers()->run_task(&g1_par_verify_task);
+    // Done with the parallel phase so reset to 0.
+    g1h->set_par_threads(0);
 
     guarantee(g1_par_verify_task.failures() == 0, "Unexpected accounting failures");
   }
@@ -2078,13 +2030,9 @@
 
   // Note end of marking in all heap regions.
   G1ParNoteEndTask g1_par_note_end_task(g1h, &_cleanup_list, n_workers);
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    g1h->set_par_threads((int)n_workers);
-    g1h->workers()->run_task(&g1_par_note_end_task);
-    g1h->set_par_threads(0);
-  } else {
-    g1_par_note_end_task.work(0);
-  }
+  g1h->set_par_threads((int)n_workers);
+  g1h->workers()->run_task(&g1_par_note_end_task);
+  g1h->set_par_threads(0);
   g1h->check_gc_time_stamps();
 
   if (!cleanup_list_is_empty()) {
@@ -2099,13 +2047,9 @@
   if (G1ScrubRemSets) {
     double rs_scrub_start = os::elapsedTime();
     G1ParScrubRemSetTask g1_par_scrub_rs_task(g1h, &_region_bm, &_card_bm, n_workers);
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      g1h->set_par_threads((int)n_workers);
-      g1h->workers()->run_task(&g1_par_scrub_rs_task);
-      g1h->set_par_threads(0);
-    } else {
-      g1_par_scrub_rs_task.work(0);
-    }
+    g1h->set_par_threads((int)n_workers);
+    g1h->workers()->run_task(&g1_par_scrub_rs_task);
+    g1h->set_par_threads(0);
 
     double rs_scrub_end = os::elapsedTime();
     double this_rs_scrub_time = (rs_scrub_end - rs_scrub_start);
@@ -2502,7 +2446,7 @@
     // is not multi-threaded we use the current (VMThread) thread,
     // otherwise we use the work gang from the G1CollectedHeap and
     // we utilize all the worker threads we can.
-    bool processing_is_mt = rp->processing_is_mt() && g1h->workers() != NULL;
+    bool processing_is_mt = rp->processing_is_mt();
     uint active_workers = (processing_is_mt ? g1h->workers()->active_workers() : 1U);
     active_workers = MAX2(MIN2(active_workers, _max_worker_id), 1U);
 
@@ -2564,17 +2508,27 @@
     G1CMTraceTime trace("Unloading", G1Log::finer());
 
     if (ClassUnloadingWithConcurrentMark) {
+      // Cleaning of klasses depends on correct information from MetadataMarkOnStack. The CodeCache::mark_on_stack
+      // part is too slow to be done serially, so it is handled during the weakRefsWorkParallelPart phase.
+      // Defer the cleaning until we have complete on_stack data.
+      MetadataOnStackMark md_on_stack(false /* Don't visit the code cache at this point */);
+
       bool purged_classes;
 
       {
         G1CMTraceTime trace("System Dictionary Unloading", G1Log::finest());
-        purged_classes = SystemDictionary::do_unloading(&g1_is_alive);
+        purged_classes = SystemDictionary::do_unloading(&g1_is_alive, false /* Defer klass cleaning */);
       }
 
       {
         G1CMTraceTime trace("Parallel Unloading", G1Log::finest());
         weakRefsWorkParallelPart(&g1_is_alive, purged_classes);
       }
+
+      {
+        G1CMTraceTime trace("Deallocate Metadata", G1Log::finest());
+        ClassLoaderDataGraph::free_deallocate_lists();
+      }
     }
 
     if (G1StringDedup::is_enabled()) {
@@ -2611,16 +2565,15 @@
   G1CMOopClosure _cm_cl;
   MarkingCodeBlobClosure _code_cl;
   int _thread_parity;
-  bool _is_par;
 
  public:
-  G1RemarkThreadsClosure(G1CollectedHeap* g1h, CMTask* task, bool is_par) :
+  G1RemarkThreadsClosure(G1CollectedHeap* g1h, CMTask* task) :
     _cm_obj(task), _cm_cl(g1h, g1h->concurrent_mark(), task), _code_cl(&_cm_cl, !CodeBlobToOopClosure::FixRelocations),
-    _thread_parity(SharedHeap::heap()->strong_roots_parity()), _is_par(is_par) {}
+    _thread_parity(SharedHeap::heap()->strong_roots_parity()) {}
 
   void do_thread(Thread* thread) {
     if (thread->is_Java_thread()) {
-      if (thread->claim_oops_do(_is_par, _thread_parity)) {
+      if (thread->claim_oops_do(true, _thread_parity)) {
         JavaThread* jt = (JavaThread*)thread;
 
         // In theory it should not be neccessary to explicitly walk the nmethods to find roots for concurrent marking
@@ -2634,7 +2587,7 @@
         jt->satb_mark_queue().apply_closure_and_empty(&_cm_obj);
       }
     } else if (thread->is_VM_thread()) {
-      if (thread->claim_oops_do(_is_par, _thread_parity)) {
+      if (thread->claim_oops_do(true, _thread_parity)) {
         JavaThread::satb_mark_queue_set().shared_satb_queue()->apply_closure_and_empty(&_cm_obj);
       }
     }
@@ -2644,7 +2597,6 @@
 class CMRemarkTask: public AbstractGangTask {
 private:
   ConcurrentMark* _cm;
-  bool            _is_serial;
 public:
   void work(uint worker_id) {
     // Since all available tasks are actually started, we should
@@ -2656,14 +2608,14 @@
         ResourceMark rm;
         HandleMark hm;
 
-        G1RemarkThreadsClosure threads_f(G1CollectedHeap::heap(), task, !_is_serial);
+        G1RemarkThreadsClosure threads_f(G1CollectedHeap::heap(), task);
         Threads::threads_do(&threads_f);
       }
 
       do {
         task->do_marking_step(1000000000.0 /* something very large */,
                               true         /* do_termination       */,
-                              _is_serial);
+                              false        /* is_serial            */);
       } while (task->has_aborted() && !_cm->has_overflown());
       // If we overflow, then we do not want to restart. We instead
       // want to abort remark and do concurrent marking again.
@@ -2671,8 +2623,8 @@
     }
   }
 
-  CMRemarkTask(ConcurrentMark* cm, int active_workers, bool is_serial) :
-    AbstractGangTask("Par Remark"), _cm(cm), _is_serial(is_serial) {
+  CMRemarkTask(ConcurrentMark* cm, int active_workers) :
+    AbstractGangTask("Par Remark"), _cm(cm) {
     _cm->terminator()->reset_for_reuse(active_workers);
   }
 };
@@ -2686,43 +2638,28 @@
 
   g1h->ensure_parsability(false);
 
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    G1CollectedHeap::StrongRootsScope srs(g1h);
-    // this is remark, so we'll use up all active threads
-    uint active_workers = g1h->workers()->active_workers();
-    if (active_workers == 0) {
-      assert(active_workers > 0, "Should have been set earlier");
-      active_workers = (uint) ParallelGCThreads;
-      g1h->workers()->set_active_workers(active_workers);
-    }
-    set_concurrency_and_phase(active_workers, false /* concurrent */);
-    // Leave _parallel_marking_threads at it's
-    // value originally calculated in the ConcurrentMark
-    // constructor and pass values of the active workers
-    // through the gang in the task.
-
-    CMRemarkTask remarkTask(this, active_workers, false /* is_serial */);
-    // We will start all available threads, even if we decide that the
-    // active_workers will be fewer. The extra ones will just bail out
-    // immediately.
-    g1h->set_par_threads(active_workers);
-    g1h->workers()->run_task(&remarkTask);
-    g1h->set_par_threads(0);
-  } else {
-    G1CollectedHeap::StrongRootsScope srs(g1h);
-    uint active_workers = 1;
-    set_concurrency_and_phase(active_workers, false /* concurrent */);
-
-    // Note - if there's no work gang then the VMThread will be
-    // the thread to execute the remark - serially. We have
-    // to pass true for the is_serial parameter so that
-    // CMTask::do_marking_step() doesn't enter the sync
-    // barriers in the event of an overflow. Doing so will
-    // cause an assert that the current thread is not a
-    // concurrent GC thread.
-    CMRemarkTask remarkTask(this, active_workers, true /* is_serial*/);
-    remarkTask.work(0);
+  G1CollectedHeap::StrongRootsScope srs(g1h);
+  // this is remark, so we'll use up all active threads
+  uint active_workers = g1h->workers()->active_workers();
+  if (active_workers == 0) {
+    assert(active_workers > 0, "Should have been set earlier");
+    active_workers = (uint) ParallelGCThreads;
+    g1h->workers()->set_active_workers(active_workers);
   }
+  set_concurrency_and_phase(active_workers, false /* concurrent */);
+  // Leave _parallel_marking_threads at it's
+  // value originally calculated in the ConcurrentMark
+  // constructor and pass values of the active workers
+  // through the gang in the task.
+
+  CMRemarkTask remarkTask(this, active_workers);
+  // We will start all available threads, even if we decide that the
+  // active_workers will be fewer. The extra ones will just bail out
+  // immediately.
+  g1h->set_par_threads(active_workers);
+  g1h->workers()->run_task(&remarkTask);
+  g1h->set_par_threads(0);
+
   SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
   guarantee(has_overflown() ||
             satb_mq_set.completed_buffers_num() == 0,
@@ -3268,30 +3205,20 @@
   void work(uint worker_id) {
     AggregateCountDataHRClosure cl(_g1h, _cm_card_bm, _max_worker_id);
 
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      _g1h->heap_region_par_iterate(&cl, worker_id, &_hrclaimer);
-    } else {
-      _g1h->heap_region_iterate(&cl);
-    }
+    _g1h->heap_region_par_iterate(&cl, worker_id, &_hrclaimer);
   }
 };
 
 
 void ConcurrentMark::aggregate_count_data() {
-  int n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
-                        _g1h->workers()->active_workers() :
-                        1);
+  int n_workers = _g1h->workers()->active_workers();
 
   G1AggregateCountDataTask g1_par_agg_task(_g1h, this, &_card_bm,
                                            _max_worker_id, n_workers);
 
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    _g1h->set_par_threads(n_workers);
-    _g1h->workers()->run_task(&g1_par_agg_task);
-    _g1h->set_par_threads(0);
-  } else {
-    g1_par_agg_task.work(0);
-  }
+  _g1h->set_par_threads(n_workers);
+  _g1h->workers()->run_task(&g1_par_agg_task);
+  _g1h->set_par_threads(0);
   _g1h->allocation_context_stats().update_at_remark();
 }
 
@@ -3419,9 +3346,7 @@
 }
 
 void ConcurrentMark::print_worker_threads_on(outputStream* st) const {
-  if (use_parallel_marking_threads()) {
-    _parallel_workers->print_worker_threads_on(st);
-  }
+  _parallel_workers->print_worker_threads_on(st);
 }
 
 void ConcurrentMark::print_on_error(outputStream* st) const {
@@ -3942,32 +3867,17 @@
 
   CMObjectClosure oc(this);
   SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set();
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    satb_mq_set.set_par_closure(_worker_id, &oc);
-  } else {
-    satb_mq_set.set_closure(&oc);
-  }
+  satb_mq_set.set_closure(_worker_id, &oc);
 
   // This keeps claiming and applying the closure to completed buffers
   // until we run out of buffers or we need to abort.
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    while (!has_aborted() &&
-           satb_mq_set.par_apply_closure_to_completed_buffer(_worker_id)) {
-      if (_cm->verbose_medium()) {
-        gclog_or_tty->print_cr("[%u] processed an SATB buffer", _worker_id);
-      }
-      statsOnly( ++_satb_buffers_processed );
-      regular_clock_call();
+  while (!has_aborted() &&
+         satb_mq_set.apply_closure_to_completed_buffer(_worker_id)) {
+    if (_cm->verbose_medium()) {
+      gclog_or_tty->print_cr("[%u] processed an SATB buffer", _worker_id);
     }
-  } else {
-    while (!has_aborted() &&
-           satb_mq_set.apply_closure_to_completed_buffer()) {
-      if (_cm->verbose_medium()) {
-        gclog_or_tty->print_cr("[%u] processed an SATB buffer", _worker_id);
-      }
-      statsOnly( ++_satb_buffers_processed );
-      regular_clock_call();
-    }
+    statsOnly( ++_satb_buffers_processed );
+    regular_clock_call();
   }
 
   _draining_satb_buffers = false;
@@ -3976,11 +3886,7 @@
          concurrent() ||
          satb_mq_set.completed_buffers_num() == 0, "invariant");
 
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    satb_mq_set.set_par_closure(_worker_id, NULL);
-  } else {
-    satb_mq_set.set_closure(NULL);
-  }
+  satb_mq_set.set_closure(_worker_id, NULL);
 
   // again, this was a potentially expensive operation, decrease the
   // limits to get the regular clock call early
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -519,15 +519,6 @@
   double cleanup_sleep_factor()             { return _cleanup_sleep_factor; }
   double cleanup_task_overhead()            { return _cleanup_task_overhead;}
 
-  bool use_parallel_marking_threads() const {
-    assert(parallel_marking_threads() <=
-           max_parallel_marking_threads(), "sanity");
-    assert((_parallel_workers == NULL && parallel_marking_threads() == 0) ||
-           parallel_marking_threads() > 0,
-           "parallel workers not set up correctly");
-    return _parallel_workers != NULL;
-  }
-
   HeapWord*               finger()          { return _finger;   }
   bool                    concurrent()      { return _concurrent; }
   uint                    active_tasks()    { return _active_tasks; }
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -28,6 +28,7 @@
 #endif
 
 #include "precompiled.hpp"
+#include "classfile/metadataOnStackMark.hpp"
 #include "classfile/stringTable.hpp"
 #include "code/codeCache.hpp"
 #include "code/icBuffer.hpp"
@@ -1438,36 +1439,31 @@
       }
 
       // Rebuild remembered sets of all regions.
-      if (G1CollectedHeap::use_parallel_gc_threads()) {
-        uint n_workers =
-          AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
-                                                  workers()->active_workers(),
-                                                  Threads::number_of_non_daemon_threads());
-        assert(UseDynamicNumberOfGCThreads ||
-               n_workers == workers()->total_workers(),
-               "If not dynamic should be using all the  workers");
-        workers()->set_active_workers(n_workers);
-        // Set parallel threads in the heap (_n_par_threads) only
-        // before a parallel phase and always reset it to 0 after
-        // the phase so that the number of parallel threads does
-        // no get carried forward to a serial phase where there
-        // may be code that is "possibly_parallel".
-        set_par_threads(n_workers);
-
-        ParRebuildRSTask rebuild_rs_task(this);
-        assert(UseDynamicNumberOfGCThreads ||
-               workers()->active_workers() == workers()->total_workers(),
-               "Unless dynamic should use total workers");
-        // Use the most recent number of  active workers
-        assert(workers()->active_workers() > 0,
-               "Active workers not properly set");
-        set_par_threads(workers()->active_workers());
-        workers()->run_task(&rebuild_rs_task);
-        set_par_threads(0);
-      } else {
-        RebuildRSOutOfRegionClosure rebuild_rs(this);
-        heap_region_iterate(&rebuild_rs);
-      }
+      uint n_workers =
+        AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
+                                                workers()->active_workers(),
+                                                Threads::number_of_non_daemon_threads());
+      assert(UseDynamicNumberOfGCThreads ||
+             n_workers == workers()->total_workers(),
+             "If not dynamic should be using all the  workers");
+      workers()->set_active_workers(n_workers);
+      // Set parallel threads in the heap (_n_par_threads) only
+      // before a parallel phase and always reset it to 0 after
+      // the phase so that the number of parallel threads does
+      // no get carried forward to a serial phase where there
+      // may be code that is "possibly_parallel".
+      set_par_threads(n_workers);
+
+      ParRebuildRSTask rebuild_rs_task(this);
+      assert(UseDynamicNumberOfGCThreads ||
+             workers()->active_workers() == workers()->total_workers(),
+             "Unless dynamic should use total workers");
+      // Use the most recent number of  active workers
+      assert(workers()->active_workers() > 0,
+             "Active workers not properly set");
+      set_par_threads(workers()->active_workers());
+      workers()->run_task(&rebuild_rs_task);
+      set_par_threads(0);
 
       // Rebuild the strong code root lists for each region
       rebuild_strong_code_roots();
@@ -2482,6 +2478,7 @@
 
   unsigned int gc_count_before;
   unsigned int old_marking_count_before;
+  unsigned int full_gc_count_before;
   bool retry_gc;
 
   do {
@@ -2492,6 +2489,7 @@
 
       // Read the GC count while holding the Heap_lock
       gc_count_before = total_collections();
+      full_gc_count_before = total_full_collections();
       old_marking_count_before = _old_marking_cycles_started;
     }
 
@@ -2536,7 +2534,7 @@
         VMThread::execute(&op);
       } else {
         // Schedule a Full GC.
-        VM_G1CollectFull op(gc_count_before, old_marking_count_before, cause);
+        VM_G1CollectFull op(gc_count_before, full_gc_count_before, cause);
         VMThread::execute(&op);
       }
     }
@@ -2678,27 +2676,25 @@
   // Then thread t will start at region floor ((t * n) / p)
 
   result = g1_policy()->collection_set();
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    uint cs_size = g1_policy()->cset_region_length();
-    uint active_workers = workers()->active_workers();
-    assert(UseDynamicNumberOfGCThreads ||
-             active_workers == workers()->total_workers(),
-             "Unless dynamic should use total workers");
-
-    uint end_ind   = (cs_size * worker_i) / active_workers;
-    uint start_ind = 0;
-
-    if (worker_i > 0 &&
-        _worker_cset_start_region_time_stamp[worker_i - 1] == gc_time_stamp) {
-      // Previous workers starting region is valid
-      // so let's iterate from there
-      start_ind = (cs_size * (worker_i - 1)) / active_workers;
-      result = _worker_cset_start_region[worker_i - 1];
-    }
-
-    for (uint i = start_ind; i < end_ind; i++) {
-      result = result->next_in_collection_set();
-    }
+  uint cs_size = g1_policy()->cset_region_length();
+  uint active_workers = workers()->active_workers();
+  assert(UseDynamicNumberOfGCThreads ||
+           active_workers == workers()->total_workers(),
+           "Unless dynamic should use total workers");
+
+  uint end_ind   = (cs_size * worker_i) / active_workers;
+  uint start_ind = 0;
+
+  if (worker_i > 0 &&
+      _worker_cset_start_region_time_stamp[worker_i - 1] == gc_time_stamp) {
+    // Previous workers starting region is valid
+    // so let's iterate from there
+    start_ind = (cs_size * (worker_i - 1)) / active_workers;
+    result = _worker_cset_start_region[worker_i - 1];
+  }
+
+  for (uint i = start_ind; i < end_ind; i++) {
+    result = result->next_in_collection_set();
   }
 
   // Note: the calculated starting heap region may be NULL
@@ -3373,9 +3369,7 @@
 }
 
 void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    workers()->print_worker_threads_on(st);
-  }
+  workers()->print_worker_threads_on(st);
   _cmThread->print_on(st);
   st->cr();
   _cm->print_worker_threads_on(st);
@@ -3386,9 +3380,7 @@
 }
 
 void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    workers()->threads_do(tc);
-  }
+  workers()->threads_do(tc);
   tc->do_thread(_cmThread);
   _cg1r->threads_do(tc);
   if (G1StringDedup::is_enabled()) {
@@ -3683,7 +3675,7 @@
   print_taskqueue_stats_hdr(st);
 
   TaskQueueStats totals;
-  const int n = workers() != NULL ? workers()->total_workers() : 1;
+  const int n = workers()->total_workers();
   for (int i = 0; i < n; ++i) {
     st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
     totals += task_queue(i)->stats;
@@ -3694,7 +3686,7 @@
 }
 
 void G1CollectedHeap::reset_taskqueue_stats() {
-  const int n = workers() != NULL ? workers()->total_workers() : 1;
+  const int n = workers()->total_workers();
   for (int i = 0; i < n; ++i) {
     task_queue(i)->stats.reset();
   }
@@ -3792,8 +3784,7 @@
 
     TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
 
-    int active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
-                                workers()->active_workers() : 1);
+    int active_workers = workers()->active_workers();
     double pause_start_sec = os::elapsedTime();
     g1_policy()->phase_times()->note_gc_start(active_workers);
     log_gc_header();
@@ -4787,12 +4778,10 @@
   int _symbols_processed;
   int _symbols_removed;
 
-  bool _do_in_parallel;
 public:
   G1StringSymbolTableUnlinkTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols) :
     AbstractGangTask("String/Symbol Unlinking"),
     _is_alive(is_alive),
-    _do_in_parallel(G1CollectedHeap::use_parallel_gc_threads()),
     _process_strings(process_strings), _strings_processed(0), _strings_removed(0),
     _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0) {
 
@@ -4807,10 +4796,10 @@
   }
 
   ~G1StringSymbolTableUnlinkTask() {
-    guarantee(!_process_strings || !_do_in_parallel || StringTable::parallel_claimed_index() >= _initial_string_table_size,
+    guarantee(!_process_strings || StringTable::parallel_claimed_index() >= _initial_string_table_size,
               err_msg("claim value %d after unlink less than initial string table size %d",
                       StringTable::parallel_claimed_index(), _initial_string_table_size));
-    guarantee(!_process_symbols || !_do_in_parallel || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size,
+    guarantee(!_process_symbols || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size,
               err_msg("claim value %d after unlink less than initial symbol table size %d",
                       SymbolTable::parallel_claimed_index(), _initial_symbol_table_size));
 
@@ -4824,28 +4813,19 @@
   }
 
   void work(uint worker_id) {
-    if (_do_in_parallel) {
-      int strings_processed = 0;
-      int strings_removed = 0;
-      int symbols_processed = 0;
-      int symbols_removed = 0;
-      if (_process_strings) {
-        StringTable::possibly_parallel_unlink(_is_alive, &strings_processed, &strings_removed);
-        Atomic::add(strings_processed, &_strings_processed);
-        Atomic::add(strings_removed, &_strings_removed);
-      }
-      if (_process_symbols) {
-        SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed);
-        Atomic::add(symbols_processed, &_symbols_processed);
-        Atomic::add(symbols_removed, &_symbols_removed);
-      }
-    } else {
-      if (_process_strings) {
-        StringTable::unlink(_is_alive, &_strings_processed, &_strings_removed);
-      }
-      if (_process_symbols) {
-        SymbolTable::unlink(&_symbols_processed, &_symbols_removed);
-      }
+    int strings_processed = 0;
+    int strings_removed = 0;
+    int symbols_processed = 0;
+    int symbols_removed = 0;
+    if (_process_strings) {
+      StringTable::possibly_parallel_unlink(_is_alive, &strings_processed, &strings_removed);
+      Atomic::add(strings_processed, &_strings_processed);
+      Atomic::add(strings_removed, &_strings_removed);
+    }
+    if (_process_symbols) {
+      SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed);
+      Atomic::add(symbols_processed, &_symbols_processed);
+      Atomic::add(symbols_removed, &_symbols_removed);
     }
   }
 
@@ -5013,6 +4993,10 @@
         clean_nmethod(claimed_nmethods[i]);
       }
     }
+
+    // The nmethod cleaning helps out and does the CodeCache part of MetadataOnStackMark.
+    // Need to retire the buffers now that this thread has stopped cleaning nmethods.
+    MetadataOnStackMark::retire_buffer_for_thread(Thread::current());
   }
 
   void work_second_pass(uint worker_id) {
@@ -5065,6 +5049,9 @@
     // G1 specific cleanup work that has
     // been moved here to be done in parallel.
     ik->clean_dependent_nmethods();
+    if (JvmtiExport::has_redefined_a_class()) {
+      InstanceKlass::purge_previous_versions(ik);
+    }
   }
 
   void work() {
@@ -5099,8 +5086,18 @@
       _klass_cleaning_task(is_alive) {
   }
 
+  void pre_work_verification() {
+    assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current()), "Should be empty");
+  }
+
+  void post_work_verification() {
+    assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current()), "Should be empty");
+  }
+
   // The parallel work done by all worker threads.
   void work(uint worker_id) {
+    pre_work_verification();
+
     // Do first pass of code cache cleaning.
     _code_cache_task.work_first_pass(worker_id);
 
@@ -5119,6 +5116,8 @@
 
     // Clean all klasses that were not unloaded.
     _klass_cleaning_task.work();
+
+    post_work_verification();
   }
 };
 
@@ -5127,33 +5126,23 @@
                                         bool process_strings,
                                         bool process_symbols,
                                         bool class_unloading_occurred) {
-  uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
-                    workers()->active_workers() : 1);
+  uint n_workers = workers()->active_workers();
 
   G1ParallelCleaningTask g1_unlink_task(is_alive, process_strings, process_symbols,
                                         n_workers, class_unloading_occurred);
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    set_par_threads(n_workers);
-    workers()->run_task(&g1_unlink_task);
-    set_par_threads(0);
-  } else {
-    g1_unlink_task.work(0);
-  }
+  set_par_threads(n_workers);
+  workers()->run_task(&g1_unlink_task);
+  set_par_threads(0);
 }
 
 void G1CollectedHeap::unlink_string_and_symbol_table(BoolObjectClosure* is_alive,
                                                      bool process_strings, bool process_symbols) {
   {
-    uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
-                     _g1h->workers()->active_workers() : 1);
+    uint n_workers = _g1h->workers()->active_workers();
     G1StringSymbolTableUnlinkTask g1_unlink_task(is_alive, process_strings, process_symbols);
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      set_par_threads(n_workers);
-      workers()->run_task(&g1_unlink_task);
-      set_par_threads(0);
-    } else {
-      g1_unlink_task.work(0);
-    }
+    set_par_threads(n_workers);
+    workers()->run_task(&g1_unlink_task);
+    set_par_threads(0);
   }
 
   if (G1StringDedup::is_enabled()) {
@@ -5171,11 +5160,7 @@
     double start_time = os::elapsedTime();
 
     RedirtyLoggedCardTableEntryClosure cl;
-    if (G1CollectedHeap::heap()->use_parallel_gc_threads()) {
-      _queue->par_apply_closure_to_all_completed_buffers(&cl);
-    } else {
-      _queue->apply_closure_to_all_completed_buffers(&cl);
-    }
+    _queue->par_apply_closure_to_all_completed_buffers(&cl);
 
     G1GCPhaseTimes* timer = G1CollectedHeap::heap()->g1_policy()->phase_times();
     timer->record_redirty_logged_cards_time_ms(worker_id, (os::elapsedTime() - start_time) * 1000.0);
@@ -5186,18 +5171,13 @@
 void G1CollectedHeap::redirty_logged_cards() {
   double redirty_logged_cards_start = os::elapsedTime();
 
-  uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
-                   _g1h->workers()->active_workers() : 1);
+  uint n_workers = _g1h->workers()->active_workers();
 
   G1RedirtyLoggedCardsTask redirty_task(&dirty_card_queue_set());
   dirty_card_queue_set().reset_for_par_iteration();
-  if (use_parallel_gc_threads()) {
-    set_par_threads(n_workers);
-    workers()->run_task(&redirty_task);
-    set_par_threads(0);
-  } else {
-    redirty_task.work(0);
-  }
+  set_par_threads(n_workers);
+  workers()->run_task(&redirty_task);
+  set_par_threads(0);
 
   DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
   dcq.merge_bufferlists(&dirty_card_queue_set());
@@ -5587,20 +5567,14 @@
   // referents points to another object which is also referenced by an
   // object discovered by the STW ref processor.
 
-  assert(!G1CollectedHeap::use_parallel_gc_threads() ||
-           no_of_gc_workers == workers()->active_workers(),
-           "Need to reset active GC workers");
+  assert(no_of_gc_workers == workers()->active_workers(), "Need to reset active GC workers");
 
   set_par_threads(no_of_gc_workers);
   G1ParPreserveCMReferentsTask keep_cm_referents(this,
                                                  no_of_gc_workers,
                                                  _task_queues);
 
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    workers()->run_task(&keep_cm_referents);
-  } else {
-    keep_cm_referents.work(0);
-  }
+  workers()->run_task(&keep_cm_referents);
 
   set_par_threads(0);
 
@@ -5727,21 +5701,15 @@
   hot_card_cache->set_use_cache(false);
 
   uint n_workers;
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    n_workers =
-      AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
-                                     workers()->active_workers(),
-                                     Threads::number_of_non_daemon_threads());
-    assert(UseDynamicNumberOfGCThreads ||
-           n_workers == workers()->total_workers(),
-           "If not dynamic should be using all the  workers");
-    workers()->set_active_workers(n_workers);
-    set_par_threads(n_workers);
-  } else {
-    assert(n_par_threads() == 0,
-           "Should be the original non-parallel value");
-    n_workers = 1;
-  }
+  n_workers =
+    AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
+                                   workers()->active_workers(),
+                                   Threads::number_of_non_daemon_threads());
+  assert(UseDynamicNumberOfGCThreads ||
+         n_workers == workers()->total_workers(),
+         "If not dynamic should be using all the  workers");
+  workers()->set_active_workers(n_workers);
+  set_par_threads(n_workers);
 
   G1ParTask g1_par_task(this, _task_queues);
 
@@ -5760,18 +5728,13 @@
       ClassLoaderDataGraph::clear_claimed_marks();
     }
 
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      // The individual threads will set their evac-failure closures.
-      if (PrintTerminationStats) G1ParScanThreadState::print_termination_stats_hdr();
-      // These tasks use ShareHeap::_process_strong_tasks
-      assert(UseDynamicNumberOfGCThreads ||
-             workers()->active_workers() == workers()->total_workers(),
-             "If not dynamic should be using all the  workers");
-      workers()->run_task(&g1_par_task);
-    } else {
-      g1_par_task.set_for_termination(n_workers);
-      g1_par_task.work(0);
-    }
+     // The individual threads will set their evac-failure closures.
+     if (PrintTerminationStats) G1ParScanThreadState::print_termination_stats_hdr();
+     // These tasks use ShareHeap::_process_strong_tasks
+     assert(UseDynamicNumberOfGCThreads ||
+            workers()->active_workers() == workers()->total_workers(),
+            "If not dynamic should be using all the  workers");
+    workers()->run_task(&g1_par_task);
     end_par_time_sec = os::elapsedTime();
 
     // Closing the inner scope will execute the destructor
@@ -6077,22 +6040,9 @@
     // Iterate over the dirty cards region list.
     G1ParCleanupCTTask cleanup_task(ct_bs, this);
 
-    if (G1CollectedHeap::use_parallel_gc_threads()) {
-      set_par_threads();
-      workers()->run_task(&cleanup_task);
-      set_par_threads(0);
-    } else {
-      while (_dirty_cards_region_list) {
-        HeapRegion* r = _dirty_cards_region_list;
-        cleanup_task.clear_cards(r);
-        _dirty_cards_region_list = r->get_next_dirty_cards_region();
-        if (_dirty_cards_region_list == r) {
-          // The last region.
-          _dirty_cards_region_list = NULL;
-        }
-        r->set_next_dirty_cards_region(NULL);
-      }
-    }
+    set_par_threads();
+    workers()->run_task(&cleanup_task);
+    set_par_threads(0);
 #ifndef PRODUCT
     if (G1VerifyCTCleanup || VerifyAfterGC) {
       G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
@@ -6632,7 +6582,6 @@
 void G1CollectedHeap::set_par_threads() {
   // Don't change the number of workers.  Use the value previously set
   // in the workgroup.
-  assert(G1CollectedHeap::use_parallel_gc_threads(), "shouldn't be here otherwise");
   uint n_workers = workers()->active_workers();
   assert(UseDynamicNumberOfGCThreads ||
            n_workers == workers()->total_workers(),
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -84,8 +84,7 @@
 };
 
 G1CollectorPolicy::G1CollectorPolicy() :
-  _parallel_gc_threads(G1CollectedHeap::use_parallel_gc_threads()
-                        ? ParallelGCThreads : 1),
+  _parallel_gc_threads(ParallelGCThreads),
 
   _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
   _stop_world_start(0.0),
@@ -1544,32 +1543,6 @@
   }
 }
 
-class KnownGarbageClosure: public HeapRegionClosure {
-  G1CollectedHeap* _g1h;
-  CollectionSetChooser* _hrSorted;
-
-public:
-  KnownGarbageClosure(CollectionSetChooser* hrSorted) :
-    _g1h(G1CollectedHeap::heap()), _hrSorted(hrSorted) { }
-
-  bool doHeapRegion(HeapRegion* r) {
-    // We only include humongous regions in collection
-    // sets when concurrent mark shows that their contained object is
-    // unreachable.
-
-    // Do we have any marking information for this region?
-    if (r->is_marked()) {
-      // We will skip any region that's currently used as an old GC
-      // alloc region (we should not consider those for collection
-      // before we fill them up).
-      if (_hrSorted->should_add(r) && !_g1h->is_old_gc_alloc_region(r)) {
-        _hrSorted->add_region(r);
-      }
-    }
-    return false;
-  }
-};
-
 class ParKnownGarbageHRClosure: public HeapRegionClosure {
   G1CollectedHeap* _g1h;
   CSetChooserParUpdater _cset_updater;
@@ -1617,34 +1590,29 @@
   _collectionSetChooser->clear();
 
   uint region_num = _g1->num_regions();
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    const uint OverpartitionFactor = 4;
-    uint WorkUnit;
-    // The use of MinChunkSize = 8 in the original code
-    // causes some assertion failures when the total number of
-    // region is less than 8.  The code here tries to fix that.
-    // Should the original code also be fixed?
-    if (no_of_gc_threads > 0) {
-      const uint MinWorkUnit = MAX2(region_num / no_of_gc_threads, 1U);
-      WorkUnit = MAX2(region_num / (no_of_gc_threads * OverpartitionFactor),
-                      MinWorkUnit);
-    } else {
-      assert(no_of_gc_threads > 0,
-        "The active gc workers should be greater than 0");
-      // In a product build do something reasonable to avoid a crash.
-      const uint MinWorkUnit = MAX2(region_num / (uint) ParallelGCThreads, 1U);
-      WorkUnit =
-        MAX2(region_num / (uint) (ParallelGCThreads * OverpartitionFactor),
-             MinWorkUnit);
-    }
-    _collectionSetChooser->prepare_for_par_region_addition(_g1->num_regions(),
-                                                           WorkUnit);
-    ParKnownGarbageTask parKnownGarbageTask(_collectionSetChooser, WorkUnit, (uint) no_of_gc_threads);
-    _g1->workers()->run_task(&parKnownGarbageTask);
+  const uint OverpartitionFactor = 4;
+  uint WorkUnit;
+  // The use of MinChunkSize = 8 in the original code
+  // causes some assertion failures when the total number of
+  // region is less than 8.  The code here tries to fix that.
+  // Should the original code also be fixed?
+  if (no_of_gc_threads > 0) {
+    const uint MinWorkUnit = MAX2(region_num / no_of_gc_threads, 1U);
+    WorkUnit = MAX2(region_num / (no_of_gc_threads * OverpartitionFactor),
+                    MinWorkUnit);
   } else {
-    KnownGarbageClosure knownGarbagecl(_collectionSetChooser);
-    _g1->heap_region_iterate(&knownGarbagecl);
+    assert(no_of_gc_threads > 0,
+      "The active gc workers should be greater than 0");
+    // In a product build do something reasonable to avoid a crash.
+    const uint MinWorkUnit = MAX2(region_num / (uint) ParallelGCThreads, 1U);
+    WorkUnit =
+      MAX2(region_num / (uint) (ParallelGCThreads * OverpartitionFactor),
+           MinWorkUnit);
   }
+  _collectionSetChooser->prepare_for_par_region_addition(_g1->num_regions(),
+                                                         WorkUnit);
+  ParKnownGarbageTask parKnownGarbageTask(_collectionSetChooser, WorkUnit, (uint) no_of_gc_threads);
+  _g1->workers()->run_task(&parKnownGarbageTask);
 
   _collectionSetChooser->sort_regions();
 
--- a/hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -292,36 +292,25 @@
   if (_root_region_scan_wait_time_ms > 0.0) {
     print_stats(1, "Root Region Scan Waiting", _root_region_scan_wait_time_ms);
   }
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    print_stats(1, "Parallel Time", _cur_collection_par_time_ms, _active_gc_threads);
-    _last_gc_worker_start_times_ms.print(2, "GC Worker Start (ms)");
-    _last_ext_root_scan_times_ms.print(2, "Ext Root Scanning (ms)");
-    if (_last_satb_filtering_times_ms.sum() > 0.0) {
-      _last_satb_filtering_times_ms.print(2, "SATB Filtering (ms)");
-    }
-    _last_update_rs_times_ms.print(2, "Update RS (ms)");
-      _last_update_rs_processed_buffers.print(3, "Processed Buffers");
-    _last_scan_rs_times_ms.print(2, "Scan RS (ms)");
-    _last_strong_code_root_scan_times_ms.print(2, "Code Root Scanning (ms)");
-    _last_obj_copy_times_ms.print(2, "Object Copy (ms)");
-    _last_termination_times_ms.print(2, "Termination (ms)");
-    if (G1Log::finest()) {
-      _last_termination_attempts.print(3, "Termination Attempts");
-    }
-    _last_gc_worker_other_times_ms.print(2, "GC Worker Other (ms)");
-    _last_gc_worker_times_ms.print(2, "GC Worker Total (ms)");
-    _last_gc_worker_end_times_ms.print(2, "GC Worker End (ms)");
-  } else {
-    _last_ext_root_scan_times_ms.print(1, "Ext Root Scanning (ms)");
-    if (_last_satb_filtering_times_ms.sum() > 0.0) {
-      _last_satb_filtering_times_ms.print(1, "SATB Filtering (ms)");
-    }
-    _last_update_rs_times_ms.print(1, "Update RS (ms)");
-      _last_update_rs_processed_buffers.print(2, "Processed Buffers");
-    _last_scan_rs_times_ms.print(1, "Scan RS (ms)");
-    _last_strong_code_root_scan_times_ms.print(1, "Code Root Scanning (ms)");
-    _last_obj_copy_times_ms.print(1, "Object Copy (ms)");
+  print_stats(1, "Parallel Time", _cur_collection_par_time_ms, _active_gc_threads);
+  _last_gc_worker_start_times_ms.print(2, "GC Worker Start (ms)");
+  _last_ext_root_scan_times_ms.print(2, "Ext Root Scanning (ms)");
+  if (_last_satb_filtering_times_ms.sum() > 0.0) {
+    _last_satb_filtering_times_ms.print(2, "SATB Filtering (ms)");
   }
+  _last_update_rs_times_ms.print(2, "Update RS (ms)");
+    _last_update_rs_processed_buffers.print(3, "Processed Buffers");
+  _last_scan_rs_times_ms.print(2, "Scan RS (ms)");
+  _last_strong_code_root_scan_times_ms.print(2, "Code Root Scanning (ms)");
+  _last_obj_copy_times_ms.print(2, "Object Copy (ms)");
+  _last_termination_times_ms.print(2, "Termination (ms)");
+  if (G1Log::finest()) {
+    _last_termination_attempts.print(3, "Termination Attempts");
+  }
+  _last_gc_worker_other_times_ms.print(2, "GC Worker Other (ms)");
+  _last_gc_worker_times_ms.print(2, "GC Worker Total (ms)");
+  _last_gc_worker_end_times_ms.print(2, "GC Worker End (ms)");
+
   print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms);
   print_stats(1, "Code Root Purge", _cur_strong_code_root_purge_time_ms);
   if (G1StringDedup::is_enabled()) {
--- a/hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -43,7 +43,7 @@
     _hot_cache_idx = 0;
 
     // For refining the cards in the hot cache in parallel
-    _hot_cache_par_chunk_size = (ParallelGCThreads > 0 ? ClaimChunkSize : _hot_cache_size);
+    _hot_cache_par_chunk_size = ClaimChunkSize;
     _hot_cache_par_claimed_idx = 0;
 
     _card_counts.initialize(card_counts_storage);
@@ -119,7 +119,7 @@
             // RSet updating while within an evacuation pause.
             // In this case worker_i should be the id of a GC worker thread
             assert(SafepointSynchronize::is_at_safepoint(), "Should be at a safepoint");
-            assert(worker_i < (ParallelGCThreads == 0 ? 1 : ParallelGCThreads),
+            assert(worker_i < ParallelGCThreads,
                    err_msg("incorrect worker id: %u", worker_i));
 
             into_cset_dcq->enqueue(card_ptr);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -80,7 +80,6 @@
     _prev_period_summary()
 {
   _seq_task = new SubTasksDone(NumSeqTasks);
-  guarantee(n_workers() > 0, "There should be some workers");
   _cset_rs_update_cl = NEW_C_HEAP_ARRAY(OopsInHeapRegionClosure*, n_workers(), mtGC);
   for (uint i = 0; i < n_workers(); i++) {
     _cset_rs_update_cl[i] = NULL;
@@ -282,7 +281,7 @@
     // is during RSet updating within an evacuation pause.
     // In this case worker_i should be the id of a GC worker thread.
     assert(SafepointSynchronize::is_at_safepoint(), "not during an evacuation pause");
-    assert(worker_i < (ParallelGCThreads == 0 ? 1 : ParallelGCThreads), "should be a GC worker");
+    assert(worker_i < ParallelGCThreads, "should be a GC worker");
 
     if (_g1rs->refine_card(card_ptr, worker_i, true)) {
       // 'card_ptr' contains references that point into the collection
@@ -343,8 +342,6 @@
   // DirtyCardQueueSet that is used to manage RSet updates
   DirtyCardQueue into_cset_dcq(&_g1->into_cset_dirty_card_queue_set());
 
-  assert((ParallelGCThreads > 0) || worker_i == 0, "invariant");
-
   updateRS(&into_cset_dcq, worker_i);
   scanRS(oc, code_root_cl, worker_i);
 
@@ -420,12 +417,7 @@
   }
 };
 
-void G1RemSet::scrub(BitMap* region_bm, BitMap* card_bm) {
-  ScrubRSClosure scrub_cl(region_bm, card_bm);
-  _g1->heap_region_iterate(&scrub_cl);
-}
-
-void G1RemSet::scrub_par(BitMap* region_bm, BitMap* card_bm, uint worker_num, HeapRegionClaimer *hrclaimer) {
+void G1RemSet::scrub(BitMap* region_bm, BitMap* card_bm, uint worker_num, HeapRegionClaimer *hrclaimer) {
   ScrubRSClosure scrub_cl(region_bm, card_bm);
   _g1->heap_region_par_iterate(&scrub_cl, worker_num, hrclaimer);
 }
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -124,14 +124,10 @@
   // Requires "region_bm" and "card_bm" to be bitmaps with 1 bit per region
   // or card, respectively, such that a region or card with a corresponding
   // 0 bit contains no part of any live object.  Eliminates any remembered
-  // set entries that correspond to dead heap ranges.
-  void scrub(BitMap* region_bm, BitMap* card_bm);
-
-  // Like the above, but assumes is called in parallel: "worker_num" is the
-  // parallel thread id of the current thread, and "hrclaimer" is the shared
-  // HeapRegionClaimer that should be used to claim heap regions.
-  void scrub_par(BitMap* region_bm, BitMap* card_bm,
-                 uint worker_num, HeapRegionClaimer* hrclaimer);
+  // set entries that correspond to dead heap ranges. "worker_num" is the
+  // parallel thread id of the current thread, and "hrclaimer" is the
+  // HeapRegionClaimer that should be used.
+  void scrub(BitMap* region_bm, BitMap* card_bm, uint worker_num, HeapRegionClaimer* hrclaimer);
 
   // Refine the card corresponding to "card_ptr".
   // If check_for_refs_into_cset is true, a true result is returned
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -31,11 +31,7 @@
 #include "oops/oop.inline.hpp"
 
 inline uint G1RemSet::n_workers() {
-  if (_g1->workers() != NULL) {
-    return _g1->workers()->total_workers();
-  } else {
-    return 1;
-  }
+  return _g1->workers()->total_workers();
 }
 
 template <class T>
--- a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -154,14 +154,10 @@
   double fixup_start = os::elapsedTime();
 
   G1StringDedupUnlinkOrOopsDoTask task(is_alive, keep_alive, allow_resize_and_rehash);
-  if (G1CollectedHeap::use_parallel_gc_threads()) {
-    G1CollectedHeap* g1h = G1CollectedHeap::heap();
-    g1h->set_par_threads();
-    g1h->workers()->run_task(&task);
-    g1h->set_par_threads(0);
-  } else {
-    task.work(0);
-  }
+  G1CollectedHeap* g1h = G1CollectedHeap::heap();
+  g1h->set_par_threads();
+  g1h->workers()->run_task(&task);
+  g1h->set_par_threads(0);
 
   double fixup_time_ms = (os::elapsedTime() - fixup_start) * 1000.0;
   g1p->phase_times()->record_string_dedup_fixup_time(fixup_time_ms);
--- a/hotspot/src/share/vm/gc_implementation/g1/satbQueue.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/satbQueue.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -202,7 +202,7 @@
 #endif // _MSC_VER
 
 SATBMarkQueueSet::SATBMarkQueueSet() :
-  PtrQueueSet(), _closure(NULL), _par_closures(NULL),
+  PtrQueueSet(), _closures(NULL),
   _shared_satb_queue(this, true /*perm*/) { }
 
 void SATBMarkQueueSet::initialize(Monitor* cbl_mon, Mutex* fl_lock,
@@ -210,9 +210,7 @@
                                   Mutex* lock) {
   PtrQueueSet::initialize(cbl_mon, fl_lock, process_completed_threshold, -1);
   _shared_satb_queue.set_lock(lock);
-  if (ParallelGCThreads > 0) {
-    _par_closures = NEW_C_HEAP_ARRAY(ObjectClosure*, ParallelGCThreads, mtGC);
-  }
+  _closures = NEW_C_HEAP_ARRAY(ObjectClosure*, ParallelGCThreads, mtGC);
 }
 
 void SATBMarkQueueSet::handle_zero_index_for_thread(JavaThread* t) {
@@ -276,17 +274,13 @@
   shared_satb_queue()->filter();
 }
 
-void SATBMarkQueueSet::set_closure(ObjectClosure* closure) {
-  _closure = closure;
+void SATBMarkQueueSet::set_closure(uint worker, ObjectClosure* closure) {
+  assert(_closures != NULL, "Precondition");
+  assert(worker < ParallelGCThreads, "Worker index must be in range [0...ParallelGCThreads)");
+  _closures[worker] = closure;
 }
 
-void SATBMarkQueueSet::set_par_closure(int i, ObjectClosure* par_closure) {
-  assert(ParallelGCThreads > 0 && _par_closures != NULL, "Precondition");
-  _par_closures[i] = par_closure;
-}
-
-bool SATBMarkQueueSet::apply_closure_to_completed_buffer_work(bool par,
-                                                              uint worker) {
+bool SATBMarkQueueSet::apply_closure_to_completed_buffer(uint worker) {
   BufferNode* nd = NULL;
   {
     MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag);
@@ -298,7 +292,7 @@
       if (_n_completed_buffers == 0) _process_completed = false;
     }
   }
-  ObjectClosure* cl = (par ? _par_closures[worker] : _closure);
+  ObjectClosure* cl = _closures[worker];
   if (nd != NULL) {
     void **buf = BufferNode::make_buffer_from_node(nd);
     ObjPtrQueue::apply_closure_to_buffer(cl, buf, 0, _sz);
--- a/hotspot/src/share/vm/gc_implementation/g1/satbQueue.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/satbQueue.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -78,16 +78,10 @@
 };
 
 class SATBMarkQueueSet: public PtrQueueSet {
-  ObjectClosure* _closure;
-  ObjectClosure** _par_closures;  // One per ParGCThread.
+  ObjectClosure** _closures;  // One per ParGCThread.
 
   ObjPtrQueue _shared_satb_queue;
 
-  // Utility function to support sequential and parallel versions.  If
-  // "par" is true, then "worker" is the par thread id; if "false", worker
-  // is ignored.
-  bool apply_closure_to_completed_buffer_work(bool par, uint worker);
-
 #ifdef ASSERT
   void dump_active_states(bool expected_active);
   void verify_active_states(bool expected_active);
@@ -111,26 +105,16 @@
   // Filter all the currently-active SATB buffers.
   void filter_thread_buffers();
 
-  // Register "blk" as "the closure" for all queues.  Only one such closure
-  // is allowed.  The "apply_closure_to_completed_buffer" method will apply
-  // this closure to a completed buffer, and "iterate_closure_all_threads"
+  // Register closure for the given worker thread. The "apply_closure_to_completed_buffer"
+  // method will apply this closure to a completed buffer, and "iterate_closure_all_threads"
   // applies it to partially-filled buffers (the latter should only be done
   // with the world stopped).
-  void set_closure(ObjectClosure* closure);
-  // Set the parallel closures: pointer is an array of pointers to
-  // closures, one for each parallel GC thread.
-  void set_par_closure(int i, ObjectClosure* closure);
+  void set_closure(uint worker, ObjectClosure* closure);
 
   // If there exists some completed buffer, pop it, then apply the
   // registered closure to all its elements, and return true.  If no
   // completed buffers exist, return false.
-  bool apply_closure_to_completed_buffer() {
-    return apply_closure_to_completed_buffer_work(false, 0);
-  }
-  // Parallel version of the above.
-  bool par_apply_closure_to_completed_buffer(uint worker) {
-    return apply_closure_to_completed_buffer_work(true, worker);
-  }
+  bool apply_closure_to_completed_buffer(uint worker);
 
   // Apply the given closure on enqueued and currently-active buffers
   // respectively. Both methods are read-only, i.e., they do not
--- a/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/g1/vm_operations_g1.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -60,7 +60,7 @@
   VM_G1CollectFull(unsigned int gc_count_before,
                    unsigned int full_gc_count_before,
                    GCCause::Cause cause)
-    : VM_GC_Operation(gc_count_before, cause, full_gc_count_before) { }
+    : VM_GC_Operation(gc_count_before, cause, full_gc_count_before, true) { }
   virtual VMOp_Type type() const { return VMOp_G1CollectFull; }
   virtual void doit();
   virtual const char* name() const {
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -479,7 +479,7 @@
     _next_gen.par_oop_since_save_marks_iterate_done(i);
   }
 
-  if (UseConcMarkSweepGC && ParallelGCThreads > 0) {
+  if (UseConcMarkSweepGC) {
     // We need to call this even when ResizeOldPLAB is disabled
     // so as to avoid breaking some asserts. While we may be able
     // to avoid this by reorganizing the code a bit, I am loathe
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -47,11 +47,6 @@
   // Do basic sizing work
   GenCollectorPolicy::initialize_flags();
 
-  assert(UseSerialGC ||
-          !FLAG_IS_DEFAULT(ParallelGCThreads) ||
-          (ParallelGCThreads > 0),
-         "ParallelGCThreads should be set before flag initialization");
-
   // The survivor ratio's are calculated "raw", unlike the
   // default gc, which adds 2 to the ratio value. We need to
   // make sure the values are valid before using them.
--- a/hotspot/src/share/vm/memory/freeBlockDictionary.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/memory/freeBlockDictionary.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -43,12 +43,10 @@
 
 template <class Chunk> void FreeBlockDictionary<Chunk>::verify_par_locked() const {
 #ifdef ASSERT
-  if (ParallelGCThreads > 0) {
-    Thread* my_thread = Thread::current();
-    if (my_thread->is_GC_task_thread()) {
-      assert(par_lock() != NULL, "Should be using locking?");
-      assert_lock_strong(par_lock());
-    }
+  Thread* my_thread = Thread::current();
+  if (my_thread->is_GC_task_thread()) {
+    assert(par_lock() != NULL, "Should be using locking?");
+    assert_lock_strong(par_lock());
   }
 #endif // ASSERT
 }
--- a/hotspot/src/share/vm/memory/freeList.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/memory/freeList.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -287,11 +287,14 @@
   return false;
 }
 
-#ifndef PRODUCT
+#ifdef ASSERT
 template <class Chunk>
 void FreeList<Chunk>::assert_proper_lock_protection_work() const {
-  assert(protecting_lock() != NULL, "Don't call this directly");
-  assert(ParallelGCThreads > 0, "Don't call this directly");
+  // Nothing to do if the list has no assigned protecting lock
+  if (protecting_lock() == NULL) {
+    return;
+  }
+
   Thread* thr = Thread::current();
   if (thr->is_VM_thread() || thr->is_ConcurrentGC_thread()) {
     // assert that we are holding the freelist lock
--- a/hotspot/src/share/vm/memory/freeList.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/memory/freeList.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -56,15 +56,12 @@
 
 #ifdef ASSERT
   Mutex*        _protecting_lock;
+  void assert_proper_lock_protection_work() const;
 #endif
 
   // Asserts false if the protecting lock (if any) is not held.
-  void assert_proper_lock_protection_work() const PRODUCT_RETURN;
   void assert_proper_lock_protection() const {
-#ifdef ASSERT
-    if (_protecting_lock != NULL)
-      assert_proper_lock_protection_work();
-#endif
+    DEBUG_ONLY(assert_proper_lock_protection_work());
   }
 
   void increment_count()    {
--- a/hotspot/src/share/vm/memory/sharedHeap.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/memory/sharedHeap.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -68,11 +68,9 @@
     vm_exit_during_initialization("Failed necessary allocation.");
   }
   _sh = this;  // ch is static, should be set only once.
-  if ((UseParNewGC ||
-      (UseConcMarkSweepGC && (CMSParallelInitialMarkEnabled ||
-                              CMSParallelRemarkEnabled)) ||
-       UseG1GC) &&
-      ParallelGCThreads > 0) {
+  if (UseParNewGC ||
+      UseG1GC ||
+      (UseConcMarkSweepGC && (CMSParallelInitialMarkEnabled || CMSParallelRemarkEnabled) && use_parallel_gc_threads())) {
     _workers = new FlexibleWorkGang("Parallel GC Threads", ParallelGCThreads,
                             /* are_GC_task_threads */true,
                             /* are_ConcurrentGC_threads */false);
--- a/hotspot/src/share/vm/oops/constantPool.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/oops/constantPool.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -1779,11 +1779,22 @@
 
 void ConstantPool::set_on_stack(const bool value) {
   if (value) {
-    _flags |= _on_stack;
+    int old_flags = *const_cast<volatile int *>(&_flags);
+    while ((old_flags & _on_stack) == 0) {
+      int new_flags = old_flags | _on_stack;
+      int result = Atomic::cmpxchg(new_flags, &_flags, old_flags);
+
+      if (result == old_flags) {
+        // Succeeded.
+        MetadataOnStackMark::record(this, Thread::current());
+        return;
+      }
+      old_flags = result;
+    }
   } else {
+    // Clearing is done single-threadedly.
     _flags &= ~_on_stack;
   }
-  if (value) MetadataOnStackMark::record(this);
 }
 
 // JSR 292 support for patching constant pool oops after the class is linked and
--- a/hotspot/src/share/vm/oops/method.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/oops/method.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -1862,9 +1862,12 @@
 void Method::set_on_stack(const bool value) {
   // Set both the method itself and its constant pool.  The constant pool
   // on stack means some method referring to it is also on the stack.
-  _access_flags.set_on_stack(value);
   constants()->set_on_stack(value);
-  if (value) MetadataOnStackMark::record(this);
+
+  bool succeeded = _access_flags.set_on_stack(value);
+  if (value && succeeded) {
+    MetadataOnStackMark::record(this, Thread::current());
+  }
 }
 
 // Called when the class loader is unloaded to make all methods weak.
--- a/hotspot/src/share/vm/prims/jni.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/prims/jni.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -3861,6 +3861,7 @@
 void TestBitMap_test();
 void TestAsUtf8();
 void Test_linked_list();
+void TestChunkedList_test();
 #if INCLUDE_ALL_GCS
 void TestOldFreeSpaceCalculation_test();
 void TestG1BiasedArray_test();
@@ -3894,6 +3895,7 @@
     run_unit_test(TestAsUtf8());
     run_unit_test(ObjectMonitor::sanity_checks());
     run_unit_test(Test_linked_list());
+    run_unit_test(TestChunkedList_test());
 #if INCLUDE_VM_STRUCTS
     run_unit_test(VMStructs::test());
 #endif
--- a/hotspot/src/share/vm/runtime/arguments.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/runtime/arguments.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -3782,27 +3782,33 @@
   bool settings_file_specified = false;
   bool needs_hotspotrc_warning = false;
 
-  ArgumentsExt::process_options(args);
-
   const char* flags_file;
   int index;
   for (index = 0; index < args->nOptions; index++) {
     const JavaVMOption *option = args->options + index;
+    if (ArgumentsExt::process_options(option)) {
+      continue;
+    }
     if (match_option(option, "-XX:Flags=", &tail)) {
       flags_file = tail;
       settings_file_specified = true;
+      continue;
     }
     if (match_option(option, "-XX:+PrintVMOptions", &tail)) {
       PrintVMOptions = true;
+      continue;
     }
     if (match_option(option, "-XX:-PrintVMOptions", &tail)) {
       PrintVMOptions = false;
+      continue;
     }
     if (match_option(option, "-XX:+IgnoreUnrecognizedVMOptions", &tail)) {
       IgnoreUnrecognizedVMOptions = true;
+      continue;
     }
     if (match_option(option, "-XX:-IgnoreUnrecognizedVMOptions", &tail)) {
       IgnoreUnrecognizedVMOptions = false;
+      continue;
     }
     if (match_option(option, "-XX:+PrintFlagsInitial", &tail)) {
       CommandLineFlags::printFlags(tty, false);
@@ -3824,6 +3830,7 @@
       } else {
         vm_exit_during_initialization("Syntax error, expecting -XX:NativeMemoryTracking=[off|summary|detail]", NULL);
       }
+      continue;
     }
 #endif
 
--- a/hotspot/src/share/vm/runtime/arguments_ext.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/runtime/arguments_ext.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -34,7 +34,10 @@
   static inline bool check_gc_consistency_user();
   static inline bool check_gc_consistency_ergo();
   static inline bool check_vm_args_consistency();
-  static        void process_options(const JavaVMInitArgs* args) {}
+  // The argument processing extension. Returns true if there is
+  // no additional parsing needed in Arguments::parse() for the option.
+  // Otherwise returns false.
+  static inline bool process_options(const JavaVMOption *option) { return false; }
 };
 
 void ArgumentsExt::select_gc_ergonomically() {
--- a/hotspot/src/share/vm/runtime/thread.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/runtime/thread.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -201,6 +201,8 @@
   // This initial value ==> never claimed.
   _oops_do_parity = 0;
 
+  _metadata_on_stack_buffer = NULL;
+
   // the handle mark links itself to last_handle_mark
   new HandleMark(this);
 
--- a/hotspot/src/share/vm/runtime/thread.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/runtime/thread.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -42,11 +42,10 @@
 #include "runtime/threadLocalStorage.hpp"
 #include "runtime/thread_ext.hpp"
 #include "runtime/unhandledOops.hpp"
-#include "utilities/macros.hpp"
-
 #include "trace/traceBackend.hpp"
 #include "trace/traceMacros.hpp"
 #include "utilities/exceptions.hpp"
+#include "utilities/macros.hpp"
 #include "utilities/top.hpp"
 #if INCLUDE_ALL_GCS
 #include "gc_implementation/g1/dirtyCardQueue.hpp"
@@ -83,6 +82,10 @@
 class ThreadClosure;
 class IdealGraphPrinter;
 
+class Metadata;
+template <class T, MEMFLAGS F> class ChunkedList;
+typedef ChunkedList<Metadata*, mtInternal> MetadataOnStackBuffer;
+
 DEBUG_ONLY(class ResourceMark;)
 
 class WorkerThread;
@@ -255,6 +258,9 @@
   jlong _allocated_bytes;                       // Cumulative number of bytes allocated on
                                                 // the Java heap
 
+  // Thread-local buffer used by MetadataOnStackMark.
+  MetadataOnStackBuffer* _metadata_on_stack_buffer;
+
   TRACE_DATA _trace_data;                       // Thread-local data for tracing
 
   ThreadExt _ext;
@@ -490,7 +496,10 @@
   // creation fails due to lack of memory, too many threads etc.
   bool set_as_starting_thread();
 
- protected:
+  void set_metadata_on_stack_buffer(MetadataOnStackBuffer* buffer) { _metadata_on_stack_buffer = buffer; }
+  MetadataOnStackBuffer* metadata_on_stack_buffer() const          { return _metadata_on_stack_buffer; }
+
+protected:
   // OS data associated with the thread
   OSThread* _osthread;  // Platform-specific thread information
 
--- a/hotspot/src/share/vm/utilities/accessFlags.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/utilities/accessFlags.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -47,6 +47,21 @@
   } while(f != old_flags);
 }
 
+// Returns true iff this thread succeeded setting the bit.
+bool AccessFlags::atomic_set_one_bit(jint bit) {
+  // Atomically update the flags with the bit given
+  jint old_flags, new_flags, f;
+  bool is_setting_bit = false;
+  do {
+    old_flags = _flags;
+    new_flags = old_flags | bit;
+    is_setting_bit = old_flags != new_flags;
+    f = Atomic::cmpxchg(new_flags, &_flags, old_flags);
+  } while(f != old_flags);
+
+  return is_setting_bit;
+}
+
 #if !defined(PRODUCT) || INCLUDE_JVMTI
 
 void AccessFlags::print_on(outputStream* st) const {
--- a/hotspot/src/share/vm/utilities/accessFlags.hpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/hotspot/src/share/vm/utilities/accessFlags.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -172,6 +172,7 @@
 
   // Atomic update of flags
   void atomic_set_bits(jint bits);
+  bool atomic_set_one_bit(jint bit);
   void atomic_clear_bits(jint bits);
 
  private:
@@ -233,12 +234,13 @@
                                          atomic_set_bits(JVM_ACC_FIELD_HAS_GENERIC_SIGNATURE);
                                        }
 
-  void set_on_stack(const bool value)
+  bool set_on_stack(const bool value)
                                        {
                                          if (value) {
-                                           atomic_set_bits(JVM_ACC_ON_STACK);
+                                           return atomic_set_one_bit(JVM_ACC_ON_STACK);
                                          } else {
                                            atomic_clear_bits(JVM_ACC_ON_STACK);
+                                           return true; // Ignored
                                          }
                                        }
   // Conversion
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/utilities/chunkedList.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,109 @@
+/*
+ * 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.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "utilities/chunkedList.hpp"
+#include "utilities/debug.hpp"
+
+/////////////// Unit tests ///////////////
+
+#ifndef PRODUCT
+
+template <typename T>
+class TestChunkedList {
+  typedef ChunkedList<T, mtOther> ChunkedListT;
+
+ public:
+  static void testEmpty() {
+    ChunkedListT buffer;
+    assert(buffer.size() == 0, "assert");
+  }
+
+  static void testFull() {
+    ChunkedListT buffer;
+    for (uintptr_t i = 0; i < ChunkedListT::BufferSize; i++) {
+      buffer.push((T)i);
+    }
+    assert(buffer.size() == ChunkedListT::BufferSize, "assert");
+    assert(buffer.is_full(), "assert");
+  }
+
+  static void testSize() {
+    ChunkedListT buffer;
+    for (uintptr_t i = 0; i < ChunkedListT::BufferSize; i++) {
+      assert(buffer.size() == i, "assert");
+      buffer.push((T)i);
+      assert(buffer.size() == i + 1, "assert");
+    }
+  }
+
+  static void testClear() {
+    ChunkedListT buffer;
+
+    buffer.clear();
+    assert(buffer.size() == 0, "assert");
+
+    for (uintptr_t i = 0; i < ChunkedListT::BufferSize / 2; i++) {
+      buffer.push((T)i);
+    }
+    buffer.clear();
+    assert(buffer.size() == 0, "assert");
+
+    for (uintptr_t i = 0; i < ChunkedListT::BufferSize; i++) {
+      buffer.push((T)i);
+    }
+    buffer.clear();
+    assert(buffer.size() == 0, "assert");
+  }
+
+  static void testAt() {
+    ChunkedListT buffer;
+
+    for (uintptr_t i = 0; i < ChunkedListT::BufferSize; i++) {
+      buffer.push((T)i);
+      assert(buffer.at(i) == (T)i, "assert");
+    }
+
+    for (uintptr_t i = 0; i < ChunkedListT::BufferSize; i++) {
+      assert(buffer.at(i) == (T)i, "assert");
+    }
+  }
+
+  static void test() {
+    testEmpty();
+    testFull();
+    testSize();
+    testClear();
+    testAt();
+  }
+};
+
+class Metadata;
+
+void TestChunkedList_test() {
+  TestChunkedList<Metadata*>::test();
+  TestChunkedList<size_t>::test();
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/utilities/chunkedList.hpp	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef SHARE_VM_UTILITIES_CHUNKED_LIST_HPP
+#define SHARE_VM_UTILITIES_CHUNKED_LIST_HPP
+
+#include "memory/allocation.hpp"
+#include "utilities/debug.hpp"
+
+template <class T, MEMFLAGS F> class ChunkedList : public CHeapObj<F> {
+  template <class U> friend class TestChunkedList;
+
+  static const size_t BufferSize = 64;
+
+  T  _values[BufferSize];
+  T* _top;
+
+  ChunkedList<T, F>* _next_used;
+  ChunkedList<T, F>* _next_free;
+
+  T const * end() const {
+    return &_values[BufferSize];
+  }
+
+ public:
+  ChunkedList<T, F>() : _top(_values), _next_used(NULL), _next_free(NULL) {}
+
+  bool is_full() const {
+    return _top == end();
+  }
+
+  void clear() {
+    _top = _values;
+    // Don't clear the next pointers since that would interfere
+    // with other threads trying to iterate through the lists.
+  }
+
+  void push(T m) {
+    assert(!is_full(), "Buffer is full");
+    *_top = m;
+    _top++;
+  }
+
+  void set_next_used(ChunkedList<T, F>* buffer) { _next_used = buffer; }
+  void set_next_free(ChunkedList<T, F>* buffer) { _next_free = buffer; }
+
+  ChunkedList<T, F>* next_used() const          { return _next_used; }
+  ChunkedList<T, F>* next_free() const          { return _next_free; }
+
+  size_t size() const {
+    return pointer_delta(_top, _values, sizeof(T));
+  }
+
+  T at(size_t i) {
+    assert(i < size(), err_msg("IOOBE i: " SIZE_FORMAT " size(): " SIZE_FORMAT, i, size()));
+    return _values[i];
+  }
+};
+
+#endif // SHARE_VM_UTILITIES_CHUNKED_LIST_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/CommandLine/TestVMOptions.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8060256
+ * @summary Test various command line options
+ * @library /testlibrary
+ * @run main TestVMOptions
+ */
+
+import com.oracle.java.testlibrary.*;
+import java.io.File;
+
+public class TestVMOptions {
+  public static void main(String[] args) throws Exception {
+    ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+        "-XX:bogus",
+        "-XX:+IgnoreUnrecognizedVMOptions",
+        "-XX:+PrintFlagsInitial");
+    OutputAnalyzer output = new OutputAnalyzer(pb.start());
+    output.shouldContain("bool PrintGCDetails");
+
+    pb = ProcessTools.createJavaProcessBuilder(
+        "-XX:-PrintVMOptions", "-version");
+    output = new OutputAnalyzer(pb.start());
+    output.shouldContain("java version");
+
+    File dir = new File(System.getProperty("test.src", "."));
+    File file = new File(dir, "flagfile.txt");
+    String s = file.getAbsolutePath();
+    pb = ProcessTools.createJavaProcessBuilder("-XX:Flags="+s);
+    output = new OutputAnalyzer(pb.start());
+    output.shouldContain("VM option '-IgnoreUnrecognizedVMOptions'");
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/CommandLine/flagfile.txt	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,1 @@
++PrintVMOptions -IgnoreUnrecognizedVMOptions
--- a/jaxp/.hgtags	Wed Jul 05 20:05:31 2017 +0200
+++ b/jaxp/.hgtags	Wed Jul 05 20:06:12 2017 +0200
@@ -279,3 +279,4 @@
 6b343b9b7a7008f5f699a2d99881163cab7a2986 jdk9-b34
 b9370464572fc663a38956047aa612d6e7854c3d jdk9-b35
 61b4c9acaa58e482db6601ec5dc4fc3d2d8dbb55 jdk9-b36
+48e4ec70cc1c8651e4a0324d91f193c4edd83af9 jdk9-b37
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/io/UTF8Reader.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/impl/io/UTF8Reader.java	Wed Jul 05 20:06:12 2017 +0200
@@ -529,6 +529,16 @@
                     invalidByte(4, 4, b2);
                 }
 
+                // check if output buffer is large enough to hold 2 surrogate chars
+                if (out + 1 >= ch.length) {
+                    fBuffer[0] = (byte)b0;
+                    fBuffer[1] = (byte)b1;
+                    fBuffer[2] = (byte)b2;
+                    fBuffer[3] = (byte)b3;
+                    fOffset = 4;
+                    return out - offset;
+                }
+
                 // decode bytes into surrogate characters
                 int uuuuu = ((b0 << 2) & 0x001C) | ((b1 >> 4) & 0x0003);
                 if (uuuuu > 0x10) {
--- a/jaxws/.hgtags	Wed Jul 05 20:05:31 2017 +0200
+++ b/jaxws/.hgtags	Wed Jul 05 20:06:12 2017 +0200
@@ -282,3 +282,4 @@
 28ea43d925f1e5250976097a2977dd3e66e11f0b jdk9-b34
 afe0c89e2edbdfb1a7ceff3d9b3ff46c4186202f jdk9-b35
 84803c3be7f79d29c7dc40749d7743675f64107a jdk9-b36
+90de6ecbff46386a3f9d6f7ca876e7aa6381f50a jdk9-b37
--- a/jdk/.hgtags	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/.hgtags	Wed Jul 05 20:06:12 2017 +0200
@@ -279,3 +279,4 @@
 21568031434d7a9dbb0cc6516cc3183d349c2253 jdk9-b34
 e549291a0227031310fa91c574891f892d27f959 jdk9-b35
 cdcf2e599e42935c2d1d19a24bb19e808aeb43b5 jdk9-b36
+27c3345d6dce39a22c262f30bb1f0e0b00c3709e jdk9-b37
--- a/jdk/make/copy/Copy-java.base.gmk	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/copy/Copy-java.base.gmk	Wed Jul 05 20:06:12 2017 +0200
@@ -48,22 +48,6 @@
 
 ################################################################################
 
-CALENDARS_SRC := $(JDK_TOPDIR)/src/java.base/share/conf
-
-$(LIB_DST_DIR)/calendars.properties: $(CALENDARS_SRC)/calendars.properties
-	$(call install-file)
-
-BASE_CONF_FILES += $(LIB_DST_DIR)/calendars.properties
-
-$(LIB_DST_DIR)/hijrah-config-umalqura.properties: $(CALENDARS_SRC)/hijrah-config-umalqura.properties
-	$(MKDIR) -p $(@D)
-	$(RM) $@
-	$(CP) $< $@
-
-BASE_CONF_FILES += $(LIB_DST_DIR)/hijrah-config-umalqura.properties
-
-################################################################################
-
 ifneq ($(findstring $(OPENJDK_TARGET_OS), windows aix),)
 
   TZMAPPINGS_SRC := $(JDK_TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS)/conf
--- a/jdk/make/copy/Copy-java.desktop.gmk	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/copy/Copy-java.desktop.gmk	Wed Jul 05 20:06:12 2017 +0200
@@ -67,8 +67,11 @@
     FREETYPE_TARGET_LIB := $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR)/$(call SHARED_LIBRARY,freetype).6
   endif
 
+  # We can't use $(install-file) in this rule because it preserves symbolic links and
+  # libfreetype.so is usually a symbolic link to something like libfreetype.so.6 on Unix.
   $(FREETYPE_TARGET_LIB): $(FREETYPE_BUNDLE_LIB_PATH)/$(call SHARED_LIBRARY,freetype)
-	$(install-file)
+	$(MKDIR) -p $(@D)
+	$(CP) $< $@
         ifeq ($(OPENJDK_BUILD_OS), windows)
 	  $(CHMOD) +rx $@
         endif
--- a/jdk/make/data/tzdata/VERSION	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/data/tzdata/VERSION	Wed Jul 05 20:06:12 2017 +0200
@@ -21,4 +21,4 @@
 # or visit www.oracle.com if you need additional information or have any
 # questions.
 #
-tzdata2014g
+tzdata2014i
--- a/jdk/make/data/tzdata/africa	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/data/tzdata/africa	Wed Jul 05 20:06:12 2017 +0200
@@ -133,23 +133,13 @@
 # See Africa/Lagos.
 
 # Botswana
-# From Paul Eggert (2013-02-21):
-# Milne says they were regulated by the Cape Town Signal in 1899;
-# assume they switched to 2:00 when Cape Town did.
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Africa/Gaborone	1:43:40 -	LMT	1885
-			1:30	-	SAST	1903 Mar
-			2:00	-	CAT	1943 Sep 19  2:00
-			2:00	1:00	CAST	1944 Mar 19  2:00
-			2:00	-	CAT
+# See Africa/Maputo.
 
 # Burkina Faso
 # See Africa/Abidjan.
 
 # Burundi
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone Africa/Bujumbura	1:57:28	-	LMT	1890
-			2:00	-	CAT
+# See Africa/Maputo.
 
 # Cameroon
 # See Africa/Lagos.
@@ -184,10 +174,7 @@
 			3:00	-	EAT
 
 # Democratic Republic of the Congo
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone Africa/Lubumbashi	1:49:52 -	LMT	1897 Nov 9
-			2:00	-	CAT
-# The above is for the eastern part; see Africa/Lagos for the western part.
+# See Africa/Lagos for the western part and Africa/Maputo for the eastern.
 
 # Republic of the Congo
 # See Africa/Lagos.
@@ -339,7 +326,7 @@
 # Egypt is to change back to Daylight system on May 15
 # http://english.ahram.org.eg/NewsContent/1/64/100735/Egypt/Politics-/Egypts-government-to-reapply-daylight-saving-time-.aspx
 
-# From Gunther Vermier (2015-05-13):
+# From Gunther Vermier (2014-05-13):
 # our Egypt office confirms that the change will be at 15 May "midnight" (24:00)
 
 # From Imed Chihi (2014-06-04):
@@ -489,11 +476,7 @@
 			3:00	-	EAT
 
 # Lesotho
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Africa/Maseru	1:50:00 -	LMT	1903 Mar
-			2:00	-	SAST	1943 Sep 19  2:00
-			2:00	1:00	SAST	1944 Mar 19  2:00
-			2:00	-	SAST
+# See Africa/Johannesburg.
 
 # Liberia
 # From Paul Eggert (2006-03-22):
@@ -575,9 +558,7 @@
 			3:00	-	EAT
 
 # Malawi
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Africa/Blantyre	2:20:00 -	LMT	1903 Mar
-			2:00	-	CAT
+# See Africa/Maputo.
 
 # Mali
 # Mauritania
@@ -987,6 +968,13 @@
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Africa/Maputo	2:10:20 -	LMT	1903 Mar
 			2:00	-	CAT
+Link Africa/Maputo Africa/Blantyre	# Malawi
+Link Africa/Maputo Africa/Bujumbura	# Burundi
+Link Africa/Maputo Africa/Gaborone	# Botswana
+Link Africa/Maputo Africa/Harare	# Zimbabwe
+Link Africa/Maputo Africa/Kigali	# Rwanda
+Link Africa/Maputo Africa/Lubumbashi	# E Dem. Rep. of Congo
+Link Africa/Maputo Africa/Lusaka	# Zambia
 
 # Namibia
 # The 1994-04-03 transition is from Shanks & Pottenger.
@@ -1054,9 +1042,7 @@
 # Tromelin - inhabited until at least 1958
 
 # Rwanda
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Africa/Kigali	2:00:16 -	LMT	1935 Jun
-			2:00	-	CAT
+# See Africa/Maputo.
 
 # St Helena
 # See Africa/Abidjan.
@@ -1100,6 +1086,9 @@
 Zone Africa/Johannesburg 1:52:00 -	LMT	1892 Feb 8
 			1:30	-	SAST	1903 Mar
 			2:00	SA	SAST
+Link Africa/Johannesburg Africa/Maseru	   # Lesotho
+Link Africa/Johannesburg Africa/Mbabane    # Swaziland
+#
 # Marion and Prince Edward Is
 # scientific station since 1947
 # no information
@@ -1127,9 +1116,7 @@
 Link Africa/Khartoum Africa/Juba
 
 # Swaziland
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Africa/Mbabane	2:04:24 -	LMT	1903 Mar
-			2:00	-	SAST
+# See Africa/Johannesburg.
 
 # Tanzania
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -1250,11 +1237,5 @@
 			3:00	-	EAT
 
 # Zambia
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Africa/Lusaka	1:53:08 -	LMT	1903 Mar
-			2:00	-	CAT
-
 # Zimbabwe
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Africa/Harare	2:04:12 -	LMT	1903 Mar
-			2:00	-	CAT
+# See Africa/Maputo.
--- a/jdk/make/data/tzdata/asia	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/data/tzdata/asia	Wed Jul 05 20:06:12 2017 +0200
@@ -70,10 +70,11 @@
 #	3:30 IRST IRDT	Iran
 #	4:00 GST	Gulf*
 #	5:30 IST	India
-#	7:00 ICT	Indochina*
+#	7:00 ICT	Indochina, most times and locations*
 #	7:00 WIB	west Indonesia (Waktu Indonesia Barat)
 #	8:00 WITA	central Indonesia (Waktu Indonesia Tengah)
 #	8:00 CST	China
+#	8:00 IDT	Indochina, 1943-45, 1947-55, 1960-75 (some locations)*
 #	8:00 JWST	Western Standard Time (Japan, 1896/1937)*
 #	9:00 JCST	Central Standard Time (Japan, 1896/1937)
 #	9:00 WIT	east Indonesia (Waktu Indonesia Timur)
@@ -294,12 +295,8 @@
 			6:30	-	MMT	# Myanmar Time
 
 # Cambodia
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Asia/Phnom_Penh	6:59:40 -	LMT	1906 Jun  9
-			7:06:20	-	SMT	1911 Mar 11  0:01 # Saigon MT?
-			7:00	-	ICT	1912 May
-			8:00	-	ICT	1931 May
-			7:00	-	ICT
+# See Asia/Bangkok.
+
 
 # China
 
@@ -916,6 +913,10 @@
 
 # Indonesia
 #
+# From Paul Eggert (2014-09-06):
+# The 1876 Report of the Secretary of the [US] Navy, p 306 says that Batavia
+# civil time was 7:07:12.5; round to even for Jakarta.
+#
 # From Gwillim Law (2001-05-28), overriding Shanks & Pottenger:
 # http://www.sumatera-inc.com/go_to_invest/about_indonesia.asp#standtime
 # says that Indonesia's time zones changed on 1988-01-01.  Looking at some
@@ -1733,12 +1734,8 @@
 			3:00	-	AST
 
 # Laos
-# Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Asia/Vientiane	6:50:24 -	LMT	1906 Jun  9       # or Viangchan
-			7:06:20	-	SMT	1911 Mar 11  0:01 # Saigon MT?
-			7:00	-	ICT	1912 May
-			8:00	-	ICT	1931 May
-			7:00	-	ICT
+# See Asia/Bangkok.
+
 
 # Lebanon
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
@@ -2751,6 +2748,8 @@
 Zone	Asia/Bangkok	6:42:04	-	LMT	1880
 			6:42:04	-	BMT	1920 Apr # Bangkok Mean Time
 			7:00	-	ICT
+Link Asia/Bangkok Asia/Phnom_Penh	# Cambodia
+Link Asia/Bangkok Asia/Vientiane	# Laos
 
 # Turkmenistan
 # From Shanks & Pottenger.
@@ -2788,22 +2787,65 @@
 
 # Vietnam
 
-# From Paul Eggert (2013-02-21):
+# From Paul Eggert (2014-10-04):
 # Milne gives 7:16:56 for the meridian of Saigon in 1899, as being
 # used in Lower Laos, Cambodia, and Annam.  But this is quite a ways
 # from Saigon's location.  For now, ignore this and stick with Shanks
-# and Pottenger.
+# and Pottenger for LMT before 1906.
 
 # From Arthur David Olson (2008-03-18):
 # The English-language name of Vietnam's most populous city is "Ho Chi Minh
 # City"; use Ho_Chi_Minh below to avoid a name of more than 14 characters.
 
-# From Shanks & Pottenger:
+# From Paul Eggert (2014-10-21) after a heads-up from Trần Ngọc Quân:
+# Trần Tiến Bình's authoritative book "Lịch Việt Nam: thế kỷ XX-XXI (1901-2100)"
+# (Nhà xuất bản Văn Hoá - Thông Tin, Hanoi, 2005), pp 49-50,
+# is quoted verbatim in:
+# http://www.thoigian.com.vn/?mPage=P80D01
+# is translated by Brian Inglis in:
+# http://mm.icann.org/pipermail/tz/2014-October/021654.html
+# and is the basis for the information below.
+#
+# The 1906 transition was effective July 1 and standardized Indochina to
+# Phù Liễn Observatory, legally 104 deg. 17'17" east of Paris.
+# It's unclear whether this meant legal Paris Mean Time (00:09:21) or
+# the Paris Meridian (2 deg. 20'14.03" E); the former yields 07:06:30.1333...
+# and the latter 07:06:29.333... so either way it rounds to 07:06:30,
+# which is used below even though the modern-day Phù Liễn Observatory
+# is closer to 07:06:31.  Abbreviate Phù Liễn Mean Time as PLMT.
+#
+# The following transitions occurred in Indochina in general (before 1954)
+# and in South Vietnam in particular (after 1954):
+# To 07:00 on 1911-05-01.
+# To 08:00 on 1942-12-31 at 23:00.
+# To 09:00 in 1945-03-14 at 23:00.
+# To 07:00 on 1945-09-02 in Vietnam.
+# To 08:00 on 1947-04-01 in French-controlled Indochina.
+# To 07:00 on 1955-07-01 in South Vietnam.
+# To 08:00 on 1959-12-31 at 23:00 in South Vietnam.
+# To 07:00 on 1975-06-13 in South Vietnam.
+#
+# Trần cites the following sources; it's unclear which supplied the info above.
+#
+# Hoàng Xuân Hãn: "Lịch và lịch Việt Nam". Tập san Khoa học Xã hội,
+# No. 9, Paris, February 1982.
+#
+# Lê Thành Lân: "Lịch và niên biểu lịch sử hai mươi thế kỷ (0001-2010)",
+# NXB Thống kê, Hanoi, 2000.
+#
+# Lê Thành Lân: "Lịch hai thế kỷ (1802-2010) và các lịch vĩnh cửu",
+# NXB Thuận Hoá, Huế, 1995.
+
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
-Zone	Asia/Ho_Chi_Minh	7:06:40 -	LMT	1906 Jun  9
-			7:06:20	-	SMT	1911 Mar 11  0:01 # Saigon MT?
-			7:00	-	ICT	1912 May
-			8:00	-	ICT	1931 May
+Zone Asia/Ho_Chi_Minh	7:06:40 -	LMT	1906 Jul  1
+			7:06:30	-	PLMT	1911 May  1
+			7:00	-	ICT	1942 Dec 31 23:00
+			8:00	-	IDT	1945 Mar 14 23:00
+			9:00	-	JST	1945 Sep  2
+			7:00	-	ICT	1947 Apr  1
+			8:00	-	IDT	1955 Jul  1
+			7:00	-	ICT	1959 Dec 31 23:00
+			8:00	-	IDT	1975 Jun 13
 			7:00	-	ICT
 
 # Yemen
--- a/jdk/make/data/tzdata/australasia	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/data/tzdata/australasia	Wed Jul 05 20:06:12 2017 +0200
@@ -354,20 +354,27 @@
 # Fiji will end DST on 2014-01-19 02:00:
 # http://www.fiji.gov.fj/Media-Center/Press-Releases/DAYLIGHT-SAVINGS-TO-END-THIS-MONTH-%281%29.aspx
 
-# From Paul Eggert (2014-01-10):
-# For now, guess that Fiji springs forward the Sunday before the fourth
-# Monday in October, and springs back the penultimate Sunday in January.
-# This is ad hoc, but matches recent practice.
+# From Ken Rylander (2014-10-20):
+# DST will start Nov. 2 this year.
+# http://www.fiji.gov.fj/Media-Center/Press-Releases/DAYLIGHT-SAVING-STARTS-ON-SUNDAY,-NOVEMBER-2ND.aspx
+
+# From Paul Eggert (2014-10-20):
+# For now, guess DST from 02:00 the first Sunday in November to
+# 03:00 the first Sunday on or after January 18.  Although ad hoc, it
+# matches this year's plan and seems more likely to match future
+# practice than guessing no DST.
 
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER/S
 Rule	Fiji	1998	1999	-	Nov	Sun>=1	2:00	1:00	S
 Rule	Fiji	1999	2000	-	Feb	lastSun	3:00	0	-
 Rule	Fiji	2009	only	-	Nov	29	2:00	1:00	S
 Rule	Fiji	2010	only	-	Mar	lastSun	3:00	0	-
-Rule	Fiji	2010	max	-	Oct	Sun>=21	2:00	1:00	S
+Rule	Fiji	2010	2013	-	Oct	Sun>=21	2:00	1:00	S
 Rule	Fiji	2011	only	-	Mar	Sun>=1	3:00	0	-
 Rule	Fiji	2012	2013	-	Jan	Sun>=18	3:00	0	-
-Rule	Fiji	2014	max	-	Jan	Sun>=18	2:00	0	-
+Rule	Fiji	2014	only	-	Jan	Sun>=18	2:00	0	-
+Rule	Fiji	2014	max	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Fiji	2015	max	-	Jan	Sun>=18	3:00	0	-
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Pacific/Fiji	11:55:44 -	LMT	1915 Oct 26 # Suva
 			12:00	Fiji	FJ%sT	# Fiji Time
@@ -542,6 +549,30 @@
 Zone Pacific/Port_Moresby 9:48:40 -	LMT	1880
 			9:48:32	-	PMMT	1895 # Port Moresby Mean Time
 			10:00	-	PGT	# Papua New Guinea Time
+#
+# From Paul Eggert (2014-10-13):
+# Base the Bougainville entry on the Arawa-Kieta region, which appears to have
+# the most people even though it was devastated in the Bougainville Civil War.
+#
+# Although Shanks gives 1942-03-15 / 1943-11-01 for JST, these dates
+# are apparently rough guesswork from the starts of military campaigns.
+# The World War II entries below are instead based on Arawa-Kieta.
+# The Japanese occupied Kieta in July 1942,
+# according to the Pacific War Online Encyclopedia
+# http://pwencycl.kgbudge.com/B/o/Bougainville.htm
+# and seem to have controlled it until their 1945-08-21 surrender.
+#
+# The Autonomous Region of Bougainville plans to switch from UTC+10 to UTC+11
+# on 2014-12-28 at 02:00.  They call UTC+11 "Bougainville Standard Time";
+# abbreviate this as BST.  See:
+# http://www.bougainville24.com/bougainville-issues/bougainville-gets-own-timezone/
+#
+Zone Pacific/Bougainville 10:22:16 -	LMT	1880
+			 9:48:32 -	PMMT	1895
+			10:00	-	PGT	1942 Jul
+			 9:00	-	JST	1945 Aug 21
+			10:00	-	PGT	2014 Dec 28  2:00
+			11:00	-	BST
 
 # Pitcairn
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
@@ -826,6 +857,7 @@
 #	 10:00	AEST	AEDT	Eastern Australia
 #	 10:00	ChST		Chamorro
 #	 10:30	LHST	LHDT	Lord Howe*
+#	 11:00	BST		Bougainville*
 #	 11:30	NZMT	NZST	New Zealand through 1945
 #	 12:00	NZST	NZDT	New Zealand 1946-present
 #	 12:15	CHAST		Chatham through 1945*
--- a/jdk/make/data/tzdata/europe	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/data/tzdata/europe	Wed Jul 05 20:06:12 2017 +0200
@@ -91,10 +91,11 @@
 #        0:00       WET WEST WEMT Western Europe
 #        0:19:32.13 AMT NST       Amsterdam, Netherlands Summer (1835-1937)*
 #        0:20       NET NEST      Netherlands (1937-1940)*
+#        1:00       BST           British Standard (1968-1971)
 #        1:00       CET CEST CEMT Central Europe
 #        1:00:14    SET           Swedish (1879-1899)*
 #        2:00       EET EEST      Eastern Europe
-#        3:00       FET           Further-eastern Europe*
+#        3:00       FET           Further-eastern Europe (2011-2014)*
 #        3:00       MSK MSD  MSM* Moscow
 
 # From Peter Ilieve (1994-12-04),
@@ -746,6 +747,13 @@
 # http://www.belta.by/ru/all_news/society/V-Belarusi-otmenjaetsja-perexod-na-sezonnoe-vremja_i_572952.html
 # http://naviny.by/rubrics/society/2011/09/16/ic_articles_116_175144/
 # http://news.tut.by/society/250578.html
+#
+# From Alexander Bokovoy (2014-10-09):
+# Belarussian government decided against changing to winter time....
+# http://eng.belta.by/all_news/society/Belarus-decides-against-adjusting-time-in-Russias-wake_i_76335.html
+# From Paul Eggert (2014-10-08):
+# Hence Belarus can share time zone abbreviations with Moscow again.
+#
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Minsk	1:50:16 -	LMT	1880
 			1:50	-	MMT	1924 May  2 # Minsk Mean Time
@@ -758,7 +766,8 @@
 			2:00	-	EET	1992 Mar 29  0:00s
 			2:00	1:00	EEST	1992 Sep 27  0:00s
 			2:00	Russia	EE%sT	2011 Mar 27  2:00s
-			3:00	-	FET
+			3:00	-	FET	2014 Oct 26  1:00s
+			3:00	-	MSK
 
 # Belgium
 #
@@ -2524,7 +2533,7 @@
 # The Kemerovo region will remain at UTC+7 through the 2014-10-26 change, thus
 # realigning itself with KRAT.
 
-Zone Asia/Novokuznetsk	 5:48:48 -	NMT	1920 Jan  6
+Zone Asia/Novokuznetsk	 5:48:48 -	LMT	1924 May  1
 			 6:00	-	KRAT	1930 Jun 21 # Krasnoyarsk Time
 			 7:00	Russia	KRA%sT	1991 Mar 31  2:00s
 			 6:00	Russia	KRA%sT	1992 Jan 19  2:00s
--- a/jdk/make/data/tzdata/northamerica	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/data/tzdata/northamerica	Wed Jul 05 20:06:12 2017 +0200
@@ -300,6 +300,12 @@
 # time zone, but we do go by the Eastern time zone because so many people work
 # in Columbus."
 
+# From Paul Eggert (2014-09-06):
+# Monthly Notices of the Royal Astronomical Society 44, 4 (1884-02-08), 208
+# says that New York City Hall time was 3 minutes 58.4 seconds fast of
+# Eastern time (i.e., -4:56:01.6) just before the 1883 switch.  Round to the
+# nearest second.
+
 # Rule	NAME	FROM	TO	TYPE	IN	ON	AT	SAVE	LETTER
 Rule	NYC	1920	only	-	Mar	lastSun	2:00	1:00	D
 Rule	NYC	1920	only	-	Oct	lastSun	2:00	0	S
@@ -1118,17 +1124,16 @@
 # An amendment to the Interpretation Act was registered on February 19/2007....
 # http://action.attavik.ca/home/justice-gn/attach/2007/gaz02part2.pdf
 
-# From Paul Eggert (2006-04-25):
+# From Paul Eggert (2014-10-18):
 # H. David Matthews and Mary Vincent's map
 # "It's about TIME", _Canadian Geographic_ (September-October 1998)
-# http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp
+# http://www.canadiangeographic.ca/Magazine/SO98/alacarte.asp
 # contains detailed boundaries for regions observing nonstandard
 # time and daylight saving time arrangements in Canada circa 1998.
 #
-# INMS, the Institute for National Measurement Standards in Ottawa, has
-# information about standard and daylight saving time zones in Canada.
-# http://inms-ienm.nrc-cnrc.gc.ca/en/time_services/daylight_saving_e.php
-# (updated periodically).
+# National Research Council Canada maintains info about time zones and DST.
+# http://www.nrc-cnrc.gc.ca/eng/services/time/time_zones.html
+# http://www.nrc-cnrc.gc.ca/eng/services/time/faq/index.html#Q5
 # Its unofficial information is often taken from Matthews and Vincent.
 
 # From Paul Eggert (2006-06-27):
@@ -1993,10 +1998,7 @@
 # [Also see <http://www.nunatsiaq.com/nunavut/nvt10309_06.html> (2001-03-09).]
 
 # From Gwillim Law (2005-05-21):
-# According to maps at
-# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SWE.jpg
-# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SSE.jpg
-# (both dated 2003), and
+# According to ...
 # http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp
 # (from a 1998 Canadian Geographic article), the de facto and de jure time
 # for Southampton Island (at the north end of Hudson Bay) is UTC-5 all year
@@ -2005,9 +2007,11 @@
 # predates the creation of Nunavut, it probably goes back many years....
 # The Inuktitut name of Coral Harbour is Sallit, but it's rarely used.
 #
-# From Paul Eggert (2005-07-26):
+# From Paul Eggert (2014-10-17):
 # For lack of better information, assume that Southampton Island observed
-# daylight saving only during wartime.
+# daylight saving only during wartime.  Gwillim Law's email also
+# mentioned maps now maintained by National Research Council Canada;
+# see above for an up-to-date link.
 
 # From Chris Walton (2007-03-01):
 # ... the community of Resolute (located on Cornwallis Island in
@@ -3008,10 +3012,21 @@
 # Shanks & Pottenger give -5:07:12, but Milne records -5:07:10.41 from an
 # unspecified official document, and says "This time is used throughout the
 # island".  Go with Milne.  Round to the nearest second as required by zic.
+#
+# Shanks & Pottenger give April 28 for the 1974 spring-forward transition, but
+# Lance Neita writes that Prime Minister Michael Manley decreed it January 5.
+# Assume Neita meant Jan 6 02:00, the same as the US.  Neita also writes that
+# Manley's supporters associated this act with Manley's nickname "Joshua"
+# (recall that in the Bible the sun stood still at Joshua's request),
+# and with the Rod of Correction which Manley said he had received from
+# Haile Selassie, Emperor of Ethiopia.  See:
+# Neita L. The politician in all of us. Jamaica Observer 2014-09-20
+# http://www.jamaicaobserver.com/columns/The-politician-in-all-of-us_17573647
+#
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	America/Jamaica	-5:07:11 -	LMT	1890        # Kingston
 			-5:07:11 -	KMT	1912 Feb    # Kingston Mean Time
-			-5:00	-	EST	1974 Apr 28  2:00
+			-5:00	-	EST	1974
 			-5:00	US	E%sT	1984
 			-5:00	-	EST
 
--- a/jdk/make/data/tzdata/zone.tab	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/data/tzdata/zone.tab	Wed Jul 05 20:06:12 2017 +0200
@@ -330,7 +330,8 @@
 PF	-1732-14934	Pacific/Tahiti	Society Islands
 PF	-0900-13930	Pacific/Marquesas	Marquesas Islands
 PF	-2308-13457	Pacific/Gambier	Gambier Islands
-PG	-0930+14710	Pacific/Port_Moresby
+PG	-0930+14710	Pacific/Port_Moresby	most locations
+PG	-0613+15534	Pacific/Bougainville	Bougainville
 PH	+1435+12100	Asia/Manila
 PK	+2452+06703	Asia/Karachi
 PL	+5215+02100	Europe/Warsaw
--- a/jdk/make/mapfiles/libjava/mapfile-vers	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/mapfiles/libjava/mapfile-vers	Wed Jul 05 20:06:12 2017 +0200
@@ -75,6 +75,7 @@
 
 		Java_java_io_FileDescriptor_initIDs;
 		Java_java_io_FileDescriptor_sync;
+		Java_java_io_FileDescriptor_getAppend;
 		Java_java_io_FileInputStream_available;
 		Java_java_io_FileInputStream_close0;
 		Java_java_io_FileInputStream_initIDs;
--- a/jdk/make/profile-includes.txt	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/make/profile-includes.txt	Wed Jul 05 20:06:12 2017 +0200
@@ -54,14 +54,12 @@
     $(OPENJDK_TARGET_CPU_LEGACY_LIB)/server/$(LIBRARY_PREFIX)jvm$(SHARED_LIBRARY_SUFFIX) \
     $(OPENJDK_TARGET_CPU_LEGACY_LIB)/server/$(LIBRARY_PREFIX)jvm.diz \
     $(OPENJDK_TARGET_CPU_LEGACY_LIB)/server/Xusage.txt \
-    calendars.properties \
     classlist \
     ext/localedata.jar \
     ext/meta-index \
     ext/sunec.jar \
     ext/sunjce_provider.jar \
     ext/sunpkcs11.jar \
-    hijrah-config-umalqura.properties \
     jce.jar \
     jsse.jar \
     logging.properties \
--- a/jdk/src/java.base/share/classes/java/io/File.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/io/File.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1588,7 +1588,7 @@
     /**
      * A convenience method to set the owner's read permission for this abstract
      * pathname. On some platforms it may be possible to start the Java virtual
-     * machine with special privileges that allow it to read files that that are
+     * machine with special privileges that allow it to read files that are
      * marked as unreadable.
      *
      * <p>An invocation of this method of the form <tt>file.setReadable(arg)</tt>
--- a/jdk/src/java.base/share/classes/java/io/FileOutputStream.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/io/FileOutputStream.java	Wed Jul 05 20:06:12 2017 +0200
@@ -26,6 +26,8 @@
 package java.io;
 
 import java.nio.channels.FileChannel;
+import sun.misc.SharedSecrets;
+import sun.misc.JavaIOFileDescriptorAccess;
 import sun.nio.ch.FileChannelImpl;
 
 
@@ -53,16 +55,17 @@
 class FileOutputStream extends OutputStream
 {
     /**
+     * Access to FileDescriptor internals.
+     */
+    private static final JavaIOFileDescriptorAccess fdAccess =
+        SharedSecrets.getJavaIOFileDescriptorAccess();
+
+    /**
      * The system dependent file descriptor.
      */
     private final FileDescriptor fd;
 
     /**
-     * True if the file is opened for append.
-     */
-    private final boolean append;
-
-    /**
      * The associated channel, initialized lazily.
      */
     private FileChannel channel;
@@ -207,7 +210,6 @@
         }
         this.fd = new FileDescriptor();
         fd.attach(this);
-        this.append = append;
         this.path = name;
 
         open(name, append);
@@ -245,7 +247,6 @@
             security.checkWrite(fdObj);
         }
         this.fd = fdObj;
-        this.append = false;
         this.path = null;
 
         fd.attach(this);
@@ -287,7 +288,7 @@
      * @exception  IOException  if an I/O error occurs.
      */
     public void write(int b) throws IOException {
-        write(b, append);
+        write(b, fdAccess.getAppend(fd));
     }
 
     /**
@@ -310,7 +311,7 @@
      * @exception  IOException  if an I/O error occurs.
      */
     public void write(byte b[]) throws IOException {
-        writeBytes(b, 0, b.length, append);
+        writeBytes(b, 0, b.length, fdAccess.getAppend(fd));
     }
 
     /**
@@ -323,7 +324,7 @@
      * @exception  IOException  if an I/O error occurs.
      */
     public void write(byte b[], int off, int len) throws IOException {
-        writeBytes(b, off, len, append);
+        writeBytes(b, off, len, fdAccess.getAppend(fd));
     }
 
     /**
@@ -395,7 +396,7 @@
     public FileChannel getChannel() {
         synchronized (this) {
             if (channel == null) {
-                channel = FileChannelImpl.open(fd, path, false, true, append, this);
+                channel = FileChannelImpl.open(fd, path, false, true, this);
             }
             return channel;
         }
--- a/jdk/src/java.base/share/classes/java/lang/invoke/DelegatingMethodHandle.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/DelegatingMethodHandle.java	Wed Jul 05 20:06:12 2017 +0200
@@ -44,6 +44,10 @@
         super(type, chooseDelegatingForm(target));
     }
 
+    protected DelegatingMethodHandle(MethodType type, LambdaForm form) {
+        super(type, form);
+    }
+
     /** Define this to extract the delegated target which supplies the invocation behavior. */
     abstract protected MethodHandle getTarget();
 
@@ -88,14 +92,31 @@
         return makeReinvokerForm(target, MethodTypeForm.LF_DELEGATE, DelegatingMethodHandle.class, NF_getTarget);
     }
 
+    static LambdaForm makeReinvokerForm(MethodHandle target,
+                                        int whichCache,
+                                        Object constraint,
+                                        NamedFunction getTargetFn) {
+        String debugString;
+        switch(whichCache) {
+            case MethodTypeForm.LF_REBIND:            debugString = "BMH.reinvoke";      break;
+            case MethodTypeForm.LF_DELEGATE:          debugString = "MH.delegate";       break;
+            default:                                  debugString = "MH.reinvoke";       break;
+        }
+        // No pre-action needed.
+        return makeReinvokerForm(target, whichCache, constraint, debugString, true, getTargetFn, null);
+    }
     /** Create a LF which simply reinvokes a target of the given basic type. */
     static LambdaForm makeReinvokerForm(MethodHandle target,
                                         int whichCache,
                                         Object constraint,
-                                        NamedFunction getTargetFn) {
+                                        String debugString,
+                                        boolean forceInline,
+                                        NamedFunction getTargetFn,
+                                        NamedFunction preActionFn) {
         MethodType mtype = target.type().basicType();
         boolean customized = (whichCache < 0 ||
                 mtype.parameterSlotCount() > MethodType.MAX_MH_INVOKER_ARITY);
+        boolean hasPreAction = (preActionFn != null);
         LambdaForm form;
         if (!customized) {
             form = mtype.form().cachedLambdaForm(whichCache);
@@ -105,12 +126,16 @@
         final int ARG_BASE    = 1;
         final int ARG_LIMIT   = ARG_BASE + mtype.parameterCount();
         int nameCursor = ARG_LIMIT;
+        final int PRE_ACTION   = hasPreAction ? nameCursor++ : -1;
         final int NEXT_MH     = customized ? -1 : nameCursor++;
         final int REINVOKE    = nameCursor++;
         LambdaForm.Name[] names = LambdaForm.arguments(nameCursor - ARG_LIMIT, mtype.invokerType());
         assert(names.length == nameCursor);
         names[THIS_DMH] = names[THIS_DMH].withConstraint(constraint);
         Object[] targetArgs;
+        if (hasPreAction) {
+            names[PRE_ACTION] = new LambdaForm.Name(preActionFn, names[THIS_DMH]);
+        }
         if (customized) {
             targetArgs = Arrays.copyOfRange(names, ARG_BASE, ARG_LIMIT, Object[].class);
             names[REINVOKE] = new LambdaForm.Name(target, targetArgs);  // the invoker is the target itself
@@ -120,20 +145,14 @@
             targetArgs[0] = names[NEXT_MH];  // overwrite this MH with next MH
             names[REINVOKE] = new LambdaForm.Name(mtype, targetArgs);
         }
-        String debugString;
-        switch(whichCache) {
-            case MethodTypeForm.LF_REBIND:   debugString = "BMH.reinvoke"; break;
-            case MethodTypeForm.LF_DELEGATE: debugString = "MH.delegate";  break;
-            default:                         debugString = "MH.reinvoke";  break;
-        }
-        form = new LambdaForm(debugString, ARG_LIMIT, names);
+        form = new LambdaForm(debugString, ARG_LIMIT, names, forceInline);
         if (!customized) {
             form = mtype.form().setCachedLambdaForm(whichCache, form);
         }
         return form;
     }
 
-    private static final NamedFunction NF_getTarget;
+    static final NamedFunction NF_getTarget;
     static {
         try {
             NF_getTarget = new NamedFunction(DelegatingMethodHandle.class
--- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java	Wed Jul 05 20:06:12 2017 +0200
@@ -628,8 +628,13 @@
         // Mark this method as a compiled LambdaForm
         mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Compiled;", true);
 
-        // Force inlining of this invoker method.
-        mv.visitAnnotation("Ljava/lang/invoke/ForceInline;", true);
+        if (lambdaForm.forceInline) {
+            // Force inlining of this invoker method.
+            mv.visitAnnotation("Ljava/lang/invoke/ForceInline;", true);
+        } else {
+            mv.visitAnnotation("Ljava/lang/invoke/DontInline;", true);
+        }
+
 
         // iterate over the form's names, generating bytecode instructions for each
         // start iterating at the first name following the arguments
--- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaForm.java	Wed Jul 05 20:06:12 2017 +0200
@@ -119,6 +119,7 @@
 class LambdaForm {
     final int arity;
     final int result;
+    final boolean forceInline;
     @Stable final Name[] names;
     final String debugName;
     MemberName vmentry;   // low-level behavior, or null if not yet prepared
@@ -243,11 +244,16 @@
 
     LambdaForm(String debugName,
                int arity, Name[] names, int result) {
+        this(debugName, arity, names, result, true);
+    }
+    LambdaForm(String debugName,
+               int arity, Name[] names, int result, boolean forceInline) {
         assert(namesOK(arity, names));
         this.arity = arity;
         this.result = fixResult(result, names);
         this.names = names.clone();
         this.debugName = fixDebugName(debugName);
+        this.forceInline = forceInline;
         int maxOutArity = normalize();
         if (maxOutArity > MethodType.MAX_MH_INVOKER_ARITY) {
             // Cannot use LF interpreter on very high arity expressions.
@@ -255,17 +261,23 @@
             compileToBytecode();
         }
     }
-
     LambdaForm(String debugName,
                int arity, Name[] names) {
-        this(debugName,
-             arity, names, LAST_RESULT);
+        this(debugName, arity, names, LAST_RESULT, true);
     }
-
+    LambdaForm(String debugName,
+               int arity, Name[] names, boolean forceInline) {
+        this(debugName, arity, names, LAST_RESULT, forceInline);
+    }
     LambdaForm(String debugName,
                Name[] formals, Name[] temps, Name result) {
         this(debugName,
-             formals.length, buildNames(formals, temps, result), LAST_RESULT);
+             formals.length, buildNames(formals, temps, result), LAST_RESULT, true);
+    }
+    LambdaForm(String debugName,
+               Name[] formals, Name[] temps, Name result, boolean forceInline) {
+        this(debugName,
+             formals.length, buildNames(formals, temps, result), LAST_RESULT, forceInline);
     }
 
     private static Name[] buildNames(Name[] formals, Name[] temps, Name result) {
@@ -279,6 +291,10 @@
     }
 
     private LambdaForm(String sig) {
+        this(sig, true);
+    }
+
+    private LambdaForm(String sig, boolean forceInline) {
         // Make a blank lambda form, which returns a constant zero or null.
         // It is used as a template for managing the invocation of similar forms that are non-empty.
         // Called only from getPreparedForm.
@@ -287,6 +303,7 @@
         this.result = (signatureReturn(sig) == V_TYPE ? -1 : arity);
         this.names = buildEmptyNames(arity, sig);
         this.debugName = "LF.zero";
+        this.forceInline = forceInline;
         assert(nameRefsAreLegal());
         assert(isEmpty());
         assert(sig.equals(basicTypeSignature())) : sig + " != " + basicTypeSignature();
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandle.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1438,10 +1438,9 @@
     /*non-public*/
     void updateForm(LambdaForm newForm) {
         if (form == newForm)  return;
-        assert(this instanceof DirectMethodHandle && this.internalMemberName().isStatic());
-        // ISSUE: Should we have a memory fence here?
+        newForm.prepare();  // as in MethodHandle.<init>
         UNSAFE.putObject(this, FORM_OFFSET, newForm);
-        this.form.prepare();  // as in MethodHandle.<init>
+        UNSAFE.fullFence();
     }
 
     private static final long FORM_OFFSET;
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java	Wed Jul 05 20:06:12 2017 +0200
@@ -30,6 +30,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.function.Function;
 
 import sun.invoke.empty.Empty;
 import sun.invoke.util.ValueConversions;
@@ -713,10 +714,11 @@
         LambdaForm form = makeGuardWithTestForm(basicType);
         BoundMethodHandle.SpeciesData data = BoundMethodHandle.speciesData_LLL();
         BoundMethodHandle mh;
+
         try {
             mh = (BoundMethodHandle)
                     data.constructor().invokeBasic(type, form,
-                        (Object) test, (Object) target, (Object) fallback);
+                        (Object) test, (Object) profile(target), (Object) profile(fallback));
         } catch (Throwable ex) {
             throw uncaughtException(ex);
         }
@@ -724,6 +726,129 @@
         return mh;
     }
 
+
+    static
+    MethodHandle profile(MethodHandle target) {
+        if (DONT_INLINE_THRESHOLD >= 0) {
+            return makeBlockInlningWrapper(target);
+        } else {
+            return target;
+        }
+    }
+
+    /**
+     * Block inlining during JIT-compilation of a target method handle if it hasn't been invoked enough times.
+     * Corresponding LambdaForm has @DontInline when compiled into bytecode.
+     */
+    static
+    MethodHandle makeBlockInlningWrapper(MethodHandle target) {
+        LambdaForm lform = PRODUCE_BLOCK_INLINING_FORM.apply(target);
+        return new CountingWrapper(target, lform,
+                PRODUCE_BLOCK_INLINING_FORM, PRODUCE_REINVOKER_FORM,
+                                   DONT_INLINE_THRESHOLD);
+    }
+
+    /** Constructs reinvoker lambda form which block inlining during JIT-compilation for a particular method handle */
+    private static final Function<MethodHandle, LambdaForm> PRODUCE_BLOCK_INLINING_FORM = new Function<MethodHandle, LambdaForm>() {
+        @Override
+        public LambdaForm apply(MethodHandle target) {
+            return DelegatingMethodHandle.makeReinvokerForm(target,
+                               MethodTypeForm.LF_DELEGATE_BLOCK_INLINING, CountingWrapper.class, "reinvoker.dontInline", false,
+                               DelegatingMethodHandle.NF_getTarget, CountingWrapper.NF_maybeStopCounting);
+        }
+    };
+
+    /** Constructs simple reinvoker lambda form for a particular method handle */
+    private static final Function<MethodHandle, LambdaForm> PRODUCE_REINVOKER_FORM = new Function<MethodHandle, LambdaForm>() {
+        @Override
+        public LambdaForm apply(MethodHandle target) {
+            return DelegatingMethodHandle.makeReinvokerForm(target,
+                    MethodTypeForm.LF_DELEGATE, DelegatingMethodHandle.class, DelegatingMethodHandle.NF_getTarget);
+        }
+    };
+
+    /**
+     * Counting method handle. It has 2 states: counting and non-counting.
+     * It is in counting state for the first n invocations and then transitions to non-counting state.
+     * Behavior in counting and non-counting states is determined by lambda forms produced by
+     * countingFormProducer & nonCountingFormProducer respectively.
+     */
+    static class CountingWrapper extends DelegatingMethodHandle {
+        private final MethodHandle target;
+        private int count;
+        private Function<MethodHandle, LambdaForm> countingFormProducer;
+        private Function<MethodHandle, LambdaForm> nonCountingFormProducer;
+        private volatile boolean isCounting;
+
+        private CountingWrapper(MethodHandle target, LambdaForm lform,
+                                Function<MethodHandle, LambdaForm> countingFromProducer,
+                                Function<MethodHandle, LambdaForm> nonCountingFormProducer,
+                                int count) {
+            super(target.type(), lform);
+            this.target = target;
+            this.count = count;
+            this.countingFormProducer = countingFromProducer;
+            this.nonCountingFormProducer = nonCountingFormProducer;
+            this.isCounting = (count > 0);
+        }
+
+        @Hidden
+        @Override
+        protected MethodHandle getTarget() {
+            return target;
+        }
+
+        @Override
+        public MethodHandle asTypeUncached(MethodType newType) {
+            MethodHandle newTarget = target.asType(newType);
+            MethodHandle wrapper;
+            if (isCounting) {
+                LambdaForm lform;
+                lform = countingFormProducer.apply(target);
+                wrapper = new CountingWrapper(newTarget, lform, countingFormProducer, nonCountingFormProducer, DONT_INLINE_THRESHOLD);
+            } else {
+                wrapper = newTarget; // no need for a counting wrapper anymore
+            }
+            return (asTypeCache = wrapper);
+        }
+
+        boolean countDown() {
+            if (count <= 0) {
+                // Try to limit number of updates. MethodHandle.updateForm() doesn't guarantee LF update visibility.
+                if (isCounting) {
+                    isCounting = false;
+                    return true;
+                } else {
+                    return false;
+                }
+            } else {
+                --count;
+                return false;
+            }
+        }
+
+        @Hidden
+        static void maybeStopCounting(Object o1) {
+             CountingWrapper wrapper = (CountingWrapper) o1;
+             if (wrapper.countDown()) {
+                 // Reached invocation threshold. Replace counting behavior with a non-counting one.
+                 LambdaForm lform = wrapper.nonCountingFormProducer.apply(wrapper.target);
+                 lform.compileToBytecode(); // speed up warmup by avoiding LF interpretation again after transition
+                 wrapper.updateForm(lform);
+             }
+        }
+
+        static final NamedFunction NF_maybeStopCounting;
+        static {
+            Class<?> THIS_CLASS = CountingWrapper.class;
+            try {
+                NF_maybeStopCounting = new NamedFunction(THIS_CLASS.getDeclaredMethod("maybeStopCounting", Object.class));
+            } catch (ReflectiveOperationException ex) {
+                throw newInternalError(ex);
+            }
+        }
+    }
+
     static
     LambdaForm makeGuardWithTestForm(MethodType basicType) {
         LambdaForm lform = basicType.form().cachedLambdaForm(MethodTypeForm.LF_GWT);
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java	Wed Jul 05 20:06:12 2017 +0200
@@ -47,10 +47,11 @@
     static final boolean TRACE_METHOD_LINKAGE;
     static final boolean USE_LAMBDA_FORM_EDITOR;
     static final int COMPILE_THRESHOLD;
+    static final int DONT_INLINE_THRESHOLD;
     static final int PROFILE_LEVEL;
 
     static {
-        final Object[] values = { false, false, false, false, false, null, null };
+        final Object[] values = new Object[8];
         AccessController.doPrivileged(new PrivilegedAction<Void>() {
                 public Void run() {
                     values[0] = Boolean.getBoolean("java.lang.invoke.MethodHandle.DEBUG_NAMES");
@@ -59,7 +60,8 @@
                     values[3] = Boolean.getBoolean("java.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE");
                     values[4] = Boolean.getBoolean("java.lang.invoke.MethodHandle.USE_LF_EDITOR");
                     values[5] = Integer.getInteger("java.lang.invoke.MethodHandle.COMPILE_THRESHOLD", 30);
-                    values[6] = Integer.getInteger("java.lang.invoke.MethodHandle.PROFILE_LEVEL", 0);
+                    values[6] = Integer.getInteger("java.lang.invoke.MethodHandle.DONT_INLINE_THRESHOLD", 30);
+                    values[7] = Integer.getInteger("java.lang.invoke.MethodHandle.PROFILE_LEVEL", 0);
                     return null;
                 }
             });
@@ -69,7 +71,8 @@
         TRACE_METHOD_LINKAGE      = (Boolean) values[3];
         USE_LAMBDA_FORM_EDITOR    = (Boolean) values[4];
         COMPILE_THRESHOLD         = (Integer) values[5];
-        PROFILE_LEVEL             = (Integer) values[6];
+        DONT_INLINE_THRESHOLD     = (Integer) values[6];
+        PROFILE_LEVEL             = (Integer) values[7];
     }
 
     /** Tell if any of the debugging switches are turned on.
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodTypeForm.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodTypeForm.java	Wed Jul 05 20:06:12 2017 +0200
@@ -63,24 +63,25 @@
     final @Stable LambdaForm[] lambdaForms;
     // Indexes into lambdaForms:
     static final int
-            LF_INVVIRTUAL     =  0,  // DMH invokeVirtual
-            LF_INVSTATIC      =  1,
-            LF_INVSPECIAL     =  2,
-            LF_NEWINVSPECIAL  =  3,
-            LF_INVINTERFACE   =  4,
-            LF_INVSTATIC_INIT =  5,  // DMH invokeStatic with <clinit> barrier
-            LF_INTERPRET      =  6,  // LF interpreter
-            LF_REBIND         =  7,  // BoundMethodHandle
-            LF_DELEGATE       =  8,  // DelegatingMethodHandle
-            LF_EX_LINKER      =  9,  // invokeExact_MT (for invokehandle)
-            LF_EX_INVOKER     = 10,  // MHs.invokeExact
-            LF_GEN_LINKER     = 11,  // generic invoke_MT (for invokehandle)
-            LF_GEN_INVOKER    = 12,  // generic MHs.invoke
-            LF_CS_LINKER      = 13,  // linkToCallSite_CS
-            LF_MH_LINKER      = 14,  // linkToCallSite_MH
-            LF_GWC            = 15,  // guardWithCatch (catchException)
-            LF_GWT            = 16,  // guardWithTest
-            LF_LIMIT          = 17;
+            LF_INVVIRTUAL              =  0,  // DMH invokeVirtual
+            LF_INVSTATIC               =  1,
+            LF_INVSPECIAL              =  2,
+            LF_NEWINVSPECIAL           =  3,
+            LF_INVINTERFACE            =  4,
+            LF_INVSTATIC_INIT          =  5,  // DMH invokeStatic with <clinit> barrier
+            LF_INTERPRET               =  6,  // LF interpreter
+            LF_REBIND                  =  7,  // BoundMethodHandle
+            LF_DELEGATE                =  8,  // DelegatingMethodHandle
+            LF_DELEGATE_BLOCK_INLINING =  9,  // Counting DelegatingMethodHandle w/ @DontInline
+            LF_EX_LINKER               = 10,  // invokeExact_MT (for invokehandle)
+            LF_EX_INVOKER              = 11,  // MHs.invokeExact
+            LF_GEN_LINKER              = 12,  // generic invoke_MT (for invokehandle)
+            LF_GEN_INVOKER             = 13,  // generic MHs.invoke
+            LF_CS_LINKER               = 14,  // linkToCallSite_CS
+            LF_MH_LINKER               = 15,  // linkToCallSite_MH
+            LF_GWC                     = 16,  // guardWithCatch (catchException)
+            LF_GWT                     = 17,  // guardWithTest
+            LF_LIMIT                   = 18;
 
     /** Return the type corresponding uniquely (1-1) to this MT-form.
      *  It might have any primitive returns or arguments, but will have no references except Object.
--- a/jdk/src/java.base/share/classes/java/nio/Buffer.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/Buffer.java	Wed Jul 05 20:06:12 2017 +0200
@@ -239,7 +239,7 @@
      * @throws  IllegalArgumentException
      *          If the preconditions on <tt>newPosition</tt> do not hold
      */
-    public final Buffer position(int newPosition) {
+    public Buffer position(int newPosition) {
         if ((newPosition > limit) || (newPosition < 0))
             throw new IllegalArgumentException();
         position = newPosition;
@@ -270,7 +270,7 @@
      * @throws  IllegalArgumentException
      *          If the preconditions on <tt>newLimit</tt> do not hold
      */
-    public final Buffer limit(int newLimit) {
+    public Buffer limit(int newLimit) {
         if ((newLimit > capacity) || (newLimit < 0))
             throw new IllegalArgumentException();
         limit = newLimit;
@@ -284,7 +284,7 @@
      *
      * @return  This buffer
      */
-    public final Buffer mark() {
+    public Buffer mark() {
         mark = position;
         return this;
     }
@@ -300,7 +300,7 @@
      * @throws  InvalidMarkException
      *          If the mark has not been set
      */
-    public final Buffer reset() {
+    public Buffer reset() {
         int m = mark;
         if (m < 0)
             throw new InvalidMarkException();
@@ -325,7 +325,7 @@
      *
      * @return  This buffer
      */
-    public final Buffer clear() {
+    public Buffer clear() {
         position = 0;
         limit = capacity;
         mark = -1;
@@ -353,7 +353,7 @@
      *
      * @return  This buffer
      */
-    public final Buffer flip() {
+    public Buffer flip() {
         limit = position;
         position = 0;
         mark = -1;
@@ -375,7 +375,7 @@
      *
      * @return  This buffer
      */
-    public final Buffer rewind() {
+    public Buffer rewind() {
         position = 0;
         mark = -1;
         return this;
--- a/jdk/src/java.base/share/classes/java/nio/MappedByteBuffer.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/MappedByteBuffer.java	Wed Jul 05 20:06:12 2017 +0200
@@ -208,4 +208,76 @@
     private native boolean isLoaded0(long address, long length, int pageCount);
     private native void load0(long address, long length);
     private native void force0(FileDescriptor fd, long address, long length);
+
+    // -- Covariant return type overrides
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public final MappedByteBuffer position(int newPosition) {
+        super.position(newPosition);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public final MappedByteBuffer limit(int newLimit) {
+        super.limit(newLimit);
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public final MappedByteBuffer mark() {
+        super.mark();
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public final MappedByteBuffer reset() {
+        super.reset();
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public final MappedByteBuffer clear() {
+        super.clear();
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public final MappedByteBuffer flip() {
+        super.flip();
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public final MappedByteBuffer rewind() {
+        super.rewind();
+        return this;
+    }
 }
--- a/jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/X-Buffer.java.template	Wed Jul 05 20:06:12 2017 +0200
@@ -1025,6 +1025,106 @@
         return offset;
     }
 
+    // -- Covariant return type overrides
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public
+#if[!byte]
+    final
+#end[!byte]
+    $Type$Buffer position(int newPosition) {
+        super.position(newPosition);
+        return this;
+    }
+    
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public
+#if[!byte]
+    final
+#end[!byte]
+    $Type$Buffer limit(int newLimit) {
+        super.limit(newLimit);
+        return this;
+    }
+    
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public 
+#if[!byte]
+    final
+#end[!byte]
+    $Type$Buffer mark() {
+        super.mark();
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public 
+#if[!byte]
+    final
+#end[!byte]
+    $Type$Buffer reset() {
+        super.reset();
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public 
+#if[!byte]
+    final
+#end[!byte]
+    $Type$Buffer clear() {
+        super.clear();
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public 
+#if[!byte]
+    final
+#end[!byte]
+    $Type$Buffer flip() {
+        super.flip();
+        return this;
+    }
+
+    /**
+     * {@inheritDoc}
+     * @since 1.9
+     */
+    @Override
+    public 
+#if[!byte]
+    final
+#end[!byte]
+    $Type$Buffer rewind() {
+        super.rewind();
+        return this;
+    }
+
     /**
      * Compacts this buffer&nbsp;&nbsp;<i>(optional operation)</i>.
      *
--- a/jdk/src/java.base/share/classes/java/nio/file/FileStore.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/file/FileStore.java	Wed Jul 05 20:06:12 2017 +0200
@@ -208,7 +208,7 @@
      * @param   attribute
      *          the attribute to read
 
-     * @return  the attribute value; {@code null} may be a valid for some
+     * @return  the attribute value; {@code null} may be valid for some
      *          attributes
      *
      * @throws  UnsupportedOperationException
--- a/jdk/src/java.base/share/classes/java/nio/file/attribute/package-info.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/nio/file/attribute/package-info.java	Wed Jul 05 20:06:12 2017 +0200
@@ -51,7 +51,7 @@
  * <p> An attribute view provides a read-only or updatable view of the non-opaque
  * values, or <em>metadata</em>, associated with objects in a file system.
  * The {@link java.nio.file.attribute.FileAttributeView} interface is
- * extended by several other interfaces that views to specific sets of file
+ * extended by several other interfaces that provide views to specific sets of file
  * attributes. {@code FileAttributeViews} are selected by invoking the {@link
  * java.nio.file.Files#getFileAttributeView} method with a
  * <em>type-token</em> to identify the required view. Views can also be identified
--- a/jdk/src/java.base/share/classes/java/time/chrono/HijrahChronology.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/time/chrono/HijrahChronology.java	Wed Jul 05 20:06:12 2017 +0200
@@ -61,13 +61,14 @@
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FilePermission;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
 import java.security.AccessController;
-import java.security.PrivilegedActionException;
+import java.security.PrivilegedAction;
 import java.time.Clock;
 import java.time.DateTimeException;
 import java.time.Instant;
@@ -145,29 +146,8 @@
  * property resource that defines the {@code ID}, the {@code calendar type},
  * the start of the calendar, the alignment with the
  * ISO calendar, and the length of each month for a range of years.
- * The variants are identified in the {@code calendars.properties} file.
- * The new properties are prefixed with {@code "calendars.hijrah."}:
- * <table cellpadding="2" border="0" summary="Configuration of Hijrah Calendar Variants">
- * <thead>
- * <tr class="tableSubHeadingColor">
- * <th class="colFirst" align="left">Property Name</th>
- * <th class="colFirst" align="left">Property value</th>
- * <th class="colLast" align="left">Description </th>
- * </tr>
- * </thead>
- * <tbody>
- * <tr class="altColor">
- * <td>calendars.hijrah.{ID}</td>
- * <td>The property resource defining the {@code {ID}} variant</td>
- * <td>The property resource is located with the {@code calendars.properties} file</td>
- * </tr>
- * <tr class="rowColor">
- * <td>calendars.hijrah.{ID}.type</td>
- * <td>The calendar type</td>
- * <td>LDML defines the calendar type names</td>
- * </tr>
- * </tbody>
- * </table>
+ * The variants are loaded by HijrahChronology as a resource from
+ * hijrah-config-&lt;calendar type&gt;.properties.
  * <p>
  * The Hijrah property resource is a set of properties that describe the calendar.
  * The syntax is defined by {@code java.util.Properties#load(Reader)}.
@@ -279,91 +259,41 @@
      * Computed by {@link #createEpochMonths}.
      */
     private transient int maxYearLength;
-    /**
-     * A reference to the properties stored in
-     * ${java.home}/lib/calendars.properties
-     */
-    private final transient static Properties calendarProperties;
 
     /**
-     * Prefix of property names for Hijrah calendar variants.
+     * Prefix of resource names for Hijrah calendar variants.
      */
-    private static final String PROP_PREFIX = "calendar.hijrah.";
-    /**
-     * Suffix of property names containing the calendar type of a variant.
-     */
-    private static final String PROP_TYPE_SUFFIX = ".type";
+    private static final String RESOURCE_PREFIX = "hijrah-config-";
 
     /**
-     * Static initialization of the predefined calendars found in the
-     * lib/calendars.properties file.
+     * Suffix of resource names for Hijrah calendar variants.
+     */
+    private static final String RESOURCE_SUFFIX = ".properties";
+
+    /**
+     * Static initialization of the built-in calendars.
+     * The data is not loaded until it is used.
      */
     static {
-        try {
-            calendarProperties = sun.util.calendar.BaseCalendar.getCalendarProperties();
-        } catch (IOException ioe) {
-            throw new InternalError("Can't initialize lib/calendars.properties", ioe);
-        }
-
-        try {
-            INSTANCE = new HijrahChronology("Hijrah-umalqura");
-            // Register it by its aliases
-            AbstractChronology.registerChrono(INSTANCE, "Hijrah");
-            AbstractChronology.registerChrono(INSTANCE, "islamic");
-        } catch (DateTimeException ex) {
-            // Absence of Hijrah calendar is fatal to initializing this class.
-            PlatformLogger logger = PlatformLogger.getLogger("java.time.chrono");
-            logger.severe("Unable to initialize Hijrah calendar: Hijrah-umalqura", ex);
-            throw new RuntimeException("Unable to initialize Hijrah-umalqura calendar", ex.getCause());
-        }
-        registerVariants();
+        INSTANCE = new HijrahChronology("Hijrah-umalqura", "islamic-umalqura");
+        // Register it by its aliases
+        AbstractChronology.registerChrono(INSTANCE, "Hijrah");
+        AbstractChronology.registerChrono(INSTANCE, "islamic");
     }
 
     /**
-     * For each Hijrah variant listed, create the HijrahChronology and register it.
-     * Exceptions during initialization are logged but otherwise ignored.
+     * Create a HijrahChronology for the named variant and type.
+     *
+     * @param id the id of the calendar
+     * @param calType the typeId of the calendar
+     * @throws IllegalArgumentException if the id or typeId is empty
      */
-    private static void registerVariants() {
-        for (String name : calendarProperties.stringPropertyNames()) {
-            if (name.startsWith(PROP_PREFIX)) {
-                String id = name.substring(PROP_PREFIX.length());
-                if (id.indexOf('.') >= 0) {
-                    continue;   // no name or not a simple name of a calendar
-                }
-                if (id.equals(INSTANCE.getId())) {
-                    continue;           // do not duplicate the default
-                }
-                try {
-                    // Create and register the variant
-                    HijrahChronology chrono = new HijrahChronology(id);
-                    AbstractChronology.registerChrono(chrono);
-                } catch (DateTimeException ex) {
-                    // Log error and continue
-                    PlatformLogger logger = PlatformLogger.getLogger("java.time.chrono");
-                    logger.severe("Unable to initialize Hijrah calendar: " + id, ex);
-                }
-            }
-        }
-    }
-
-    /**
-     * Create a HijrahChronology for the named variant.
-     * The resource and calendar type are retrieved from properties
-     * in the {@code calendars.properties}.
-     * The property names are {@code "calendar.hijrah." + id}
-     * and  {@code "calendar.hijrah." + id + ".type"}
-     * @param id the id of the calendar
-     * @throws DateTimeException if the calendar type is missing from the properties file.
-     * @throws IllegalArgumentException if the id is empty
-     */
-    private HijrahChronology(String id) throws DateTimeException {
+    private HijrahChronology(String id, String calType) {
         if (id.isEmpty()) {
             throw new IllegalArgumentException("calendar id is empty");
         }
-        String propName = PROP_PREFIX + id + PROP_TYPE_SUFFIX;
-        String calType = calendarProperties.getProperty(propName);
-        if (calType == null || calType.isEmpty()) {
-            throw new DateTimeException("calendarType is missing or empty for: " + propName);
+        if (calType.isEmpty()) {
+            throw new IllegalArgumentException("calendar typeId is empty");
         }
         this.typeId = id;
         this.calendarType = calType;
@@ -866,30 +796,26 @@
     /**
      * Return the configuration properties from the resource.
      * <p>
-     * The default location of the variant configuration resource is:
+     * The location of the variant configuration resource is:
      * <pre>
-     *   "$java.home/lib/" + resource-name
+     *   "/java/time/chrono/hijrah-config-" + calendarType + ".properties"
      * </pre>
      *
-     * @param resource the name of the calendar property resource
+     * @param calendarType the calendarType of the calendar variant
      * @return a Properties containing the properties read from the resource.
      * @throws Exception if access to the property resource fails
      */
-    private static Properties readConfigProperties(final String resource) throws Exception {
-        try {
-            return AccessController
-                    .doPrivileged((java.security.PrivilegedExceptionAction<Properties>)
-                        () -> {
-                        String libDir = System.getProperty("java.home") + File.separator + "lib";
-                        File file = new File(libDir, resource);
-                        Properties props = new Properties();
-                        try (InputStream is = new FileInputStream(file)) {
-                            props.load(is);
-                        }
-                        return props;
-                    });
-        } catch (PrivilegedActionException pax) {
-            throw pax.getException();
+    private Properties readConfigProperties(final String calendarType) throws Exception {
+        String resourceName = RESOURCE_PREFIX + calendarType + RESOURCE_SUFFIX;
+        PrivilegedAction<InputStream> getResourceAction =  () -> HijrahChronology.class.getResourceAsStream(resourceName);
+        FilePermission perm = new FilePermission("<<ALL FILES>>", "read");
+        try (InputStream is = AccessController.doPrivileged(getResourceAction, null, perm)) {
+            if (is == null) {
+                throw new RuntimeException("Hijrah calendar resource not found: /java/time/chrono/" + resourceName);
+            }
+            Properties props = new Properties();
+            props.load(is);
+            return props;
         }
     }
 
@@ -906,9 +832,7 @@
      */
     private void loadCalendarData() {
         try {
-            String resourceName = calendarProperties.getProperty(PROP_PREFIX + typeId);
-            Objects.requireNonNull(resourceName, "Resource missing for calendar: " + PROP_PREFIX + typeId);
-            Properties props = readConfigProperties(resourceName);
+            Properties props = readConfigProperties(calendarType);
 
             Map<Integer, int[]> years = new HashMap<>();
             int minYear = Integer.MAX_VALUE;
@@ -937,7 +861,7 @@
                     default:
                         try {
                             // Everything else is either a year or invalid
-                            int year = Integer.valueOf(key);
+                            int year = Integer.parseInt(key);
                             int[] months = parseMonths((String) entry.getValue());
                             years.put(year, months);
                             maxYear = Math.max(maxYear, year);
@@ -1045,7 +969,7 @@
         }
         for (int i = 0; i < 12; i++) {
             try {
-                months[i] = Integer.valueOf(numbers[i]);
+                months[i] = Integer.parseInt(numbers[i]);
             } catch (NumberFormatException nfe) {
                 throw new IllegalArgumentException("bad key: " + numbers[i]);
             }
@@ -1067,9 +991,9 @@
                 throw new IllegalArgumentException("date must be yyyy-MM-dd");
             }
             int[] ymd = new int[3];
-            ymd[0] = Integer.valueOf(string.substring(0, 4));
-            ymd[1] = Integer.valueOf(string.substring(5, 7));
-            ymd[2] = Integer.valueOf(string.substring(8, 10));
+            ymd[0] = Integer.parseInt(string, 0, 4, 10);
+            ymd[1] = Integer.parseInt(string, 5, 7, 10);
+            ymd[2] = Integer.parseInt(string, 8, 10, 10);
             return ymd;
         } catch (NumberFormatException ex) {
             throw new IllegalArgumentException("date must be yyyy-MM-dd", ex);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/java/time/chrono/hijrah-config-islamic-umalqura.properties	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,369 @@
+# Copyright (c) 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
+# 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 properties file defines a Hijrah calendar variant.
+#
+# Fields:
+#
+#       <version> ::= 'version' '=' <version string>
+#            <id> ::= 'id' '=' <id string>
+#          <type> ::= 'type' '=' <type string>
+#     <iso-start> ::= 'iso-start' '=' <start date in the ISO calendar>
+#          <year> ::= <yyyy> '=' <nn nn nn nn nn nn nn nn nn nn nn nn>
+#
+# version ... (Required)
+#
+# id ... (Required)
+#    Identifies the Java Chronology
+#
+# type ... (Required)
+#    Identifies the type of calendar in the standard calendar ID scheme
+# iso-start ... (Required)
+#    Specifies the corresponding ISO date to the first Hijrah day
+#    in the defined range of dates
+#
+# year ... (Required)
+#    Number of days for each month of a Hijrah year
+#    * Each line defines a year. The years must be in chronological
+#      order and no gap is allowed.
+#    * Each line is in the form indicated above. <yyyy> is a Hijrah year and
+#      nn is the number of days for a month listed in the order of the months.
+#    * Each year must have 12 months.
+#    * Each month should be 29 or 30 days long.
+#    * There must be one or more space characters between the months.
+#
+
+# Version of this definition
+version=1.8.0_1
+
+# Java chronology ID
+id=Hijrah-umalqura
+
+# Standard calendar type specification
+type=islamic-umalqura
+
+# defines the corresponding ISO date to the earliest Hijrah date
+iso-start=1882-11-12
+
+#     1  2  3  4  5  6  7  8  9 10 11 12
+1300=30 29 30 29 30 29 30 29 30 29 30 29
+1301=30 30 29 30 29 30 29 30 29 30 29 29
+1302=30 30 30 29 30 30 29 29 30 29 29 30
+1303=29 30 30 29 30 30 29 30 29 30 29 29
+1304=29 30 30 29 30 30 30 29 30 29 30 29
+1305=29 29 30 30 29 30 30 29 30 30 29 29
+1306=30 29 30 29 30 29 30 29 30 30 29 30
+1307=29 30 29 30 29 30 29 30 29 30 29 30
+1308=29 30 30 29 30 29 30 29 30 29 29 30
+1309=29 30 30 30 30 29 29 30 29 29 30 29
+1310=30 29 30 30 30 29 30 29 30 29 29 30
+1311=29 30 29 30 30 30 29 30 29 30 29 29
+1312=30 29 30 29 30 30 29 30 30 29 30 29
+1313=29 30 29 30 29 30 29 30 30 30 29 29
+1314=30 30 29 30 29 29 30 29 30 30 29 30
+1315=29 30 30 29 30 29 29 30 29 30 29 30
+1316=29 30 30 30 29 30 29 29 30 29 30 29
+1317=30 29 30 30 29 30 29 30 29 30 29 29
+1318=30 29 30 30 29 30 30 29 30 29 30 29
+1319=29 30 29 30 30 29 30 29 30 30 29 30
+1320=29 30 29 29 30 29 30 29 30 30 30 29
+1321=30 29 30 29 29 30 29 29 30 30 30 30
+1322=29 30 29 30 29 29 29 30 29 30 30 30
+1323=29 30 30 29 30 29 29 29 30 29 30 30
+1324=29 30 30 29 30 29 30 29 29 30 29 30
+1325=30 29 30 29 30 30 29 30 29 30 29 30
+1326=29 29 30 29 30 30 29 30 29 30 30 29
+1327=30 29 29 30 29 30 29 30 30 29 30 30
+1328=29 30 29 29 30 29 29 30 30 30 29 30
+1329=30 29 30 29 29 30 29 29 30 30 29 30
+1330=30 30 29 30 29 29 30 29 29 30 30 29
+1331=30 30 29 30 30 29 29 30 29 30 29 30
+1332=29 30 29 30 30 29 30 29 30 30 29 29
+1333=30 29 29 30 30 29 30 30 29 30 30 29
+1334=29 29 30 29 30 29 30 30 30 29 30 29
+1335=30 29 30 29 29 30 29 30 30 29 30 30
+1336=29 30 29 30 29 29 30 29 30 29 30 30
+1337=30 29 30 29 30 29 29 30 29 30 29 30
+1338=29 30 30 29 30 30 29 29 30 29 30 29
+1339=30 29 30 29 30 30 30 29 30 29 29 30
+1340=29 29 30 29 30 30 30 30 29 30 29 29
+1341=30 29 29 30 29 30 30 30 29 30 30 29
+1342=29 29 30 29 30 29 30 30 29 30 30 29
+1343=30 29 29 30 29 30 29 30 29 30 30 29
+1344=30 29 30 29 30 30 29 29 30 29 30 29
+1345=30 29 30 30 30 29 30 29 29 30 29 29
+1346=30 29 30 30 30 30 29 30 29 29 30 29
+1347=29 30 29 30 30 30 29 30 30 29 29 30
+1348=29 29 30 29 30 30 29 30 30 30 29 29
+1349=30 29 29 30 29 30 30 29 30 30 29 30
+1350=29 30 29 30 29 30 29 29 30 30 29 30
+1351=30 29 30 29 30 29 30 29 29 30 29 30
+1352=30 29 30 30 29 30 29 30 29 29 30 29
+1353=30 29 30 30 30 29 30 29 29 30 29 30
+1354=29 30 29 30 30 29 30 30 29 30 29 29
+1355=30 29 29 30 30 29 30 30 29 30 30 29
+1356=29 30 29 30 29 30 29 30 29 30 30 30
+1357=29 29 30 29 30 29 29 30 29 30 30 30
+1358=29 30 29 30 29 30 29 29 30 29 30 30
+1359=29 30 30 29 30 29 30 29 29 29 30 30
+1360=29 30 30 30 29 30 29 30 29 29 30 29
+1361=30 29 30 30 29 30 30 29 29 30 29 30
+1362=29 30 29 30 29 30 30 29 30 29 30 29
+1363=30 29 30 29 30 29 30 29 30 29 30 30
+1364=29 30 29 30 29 29 30 29 30 29 30 30
+1365=30 30 29 29 30 29 29 30 29 30 29 30
+1366=30 30 29 30 29 30 29 29 30 29 30 29
+1367=30 30 29 30 30 29 30 29 29 30 29 30
+1368=29 30 29 30 30 30 29 29 30 29 30 29
+1369=30 29 30 29 30 30 29 30 29 30 30 29
+1370=30 29 29 30 29 30 29 30 29 30 30 30
+1371=29 30 29 29 30 29 30 29 30 29 30 30
+1372=30 29 29 30 29 30 29 29 30 29 30 30
+1373=30 29 30 29 30 29 30 29 29 30 29 30
+1374=30 29 30 30 29 30 29 30 29 29 30 29
+1375=30 29 30 30 29 30 30 29 30 29 30 29
+1376=29 30 29 30 29 30 30 30 29 30 29 30
+1377=29 29 30 29 29 30 30 30 29 30 30 29
+1378=30 29 29 29 30 29 30 30 29 30 30 30
+1379=29 30 29 29 29 30 29 30 30 29 30 30
+1380=29 30 29 30 29 30 29 30 29 30 29 30
+1381=29 30 29 30 30 29 30 29 30 29 29 30
+1382=29 30 29 30 30 29 30 30 29 30 29 29
+1383=30 29 29 30 30 30 29 30 30 29 30 29
+1384=29 30 29 29 30 30 29 30 30 30 29 30
+1385=29 29 30 29 29 30 30 29 30 30 30 29
+1386=30 29 29 30 29 29 30 30 29 30 30 29
+1387=30 29 30 29 30 29 30 29 30 29 30 29
+1388=30 30 29 30 29 30 29 30 29 30 29 29
+1389=30 30 29 30 30 29 30 30 29 29 30 29
+1390=29 30 29 30 30 30 29 30 29 30 29 30
+1391=29 29 30 29 30 30 29 30 30 29 30 29
+1392=30 29 29 30 29 30 29 30 30 29 30 30
+1393=29 30 29 29 30 29 30 29 30 29 30 30
+1394=30 29 30 29 29 30 29 30 29 30 29 30
+1395=30 29 30 30 29 30 29 29 30 29 29 30
+1396=30 29 30 30 29 30 30 29 29 30 29 29
+1397=30 29 30 30 29 30 30 30 29 29 29 30
+1398=29 30 29 30 30 29 30 30 29 30 29 29
+1399=30 29 30 29 30 29 30 30 29 30 29 30
+1400=30 29 30 29 29 30 29 30 29 30 29 30
+1401=30 30 29 30 29 29 30 29 29 30 29 30
+1402=30 30 30 29 30 29 29 30 29 29 30 29
+1403=30 30 30 29 30 30 29 29 30 29 29 30
+1404=29 30 30 29 30 30 29 30 29 30 29 29
+1405=30 29 30 29 30 30 30 29 30 29 29 30
+1406=30 29 29 30 29 30 30 29 30 29 30 30
+1407=29 30 29 29 30 29 30 29 30 29 30 30
+1408=30 29 30 29 30 29 29 30 29 29 30 30
+1409=30 30 29 30 29 30 29 29 30 29 29 30
+1410=30 30 29 30 30 29 30 29 29 30 29 29
+1411=30 30 29 30 30 29 30 30 29 29 30 29
+1412=30 29 30 29 30 29 30 30 30 29 29 30
+1413=29 30 29 29 30 29 30 30 30 29 30 29
+1414=30 29 30 29 29 30 29 30 30 29 30 30
+1415=29 30 29 30 29 29 30 29 30 29 30 30
+1416=30 29 30 29 30 29 29 30 29 30 29 30
+1417=30 29 30 30 29 29 30 29 30 29 30 29
+1418=30 29 30 30 29 30 29 30 29 30 29 30
+1419=29 30 29 30 29 30 29 30 30 30 29 29
+1420=29 30 29 29 30 29 30 30 30 30 29 30
+1421=29 29 30 29 29 29 30 30 30 30 29 30
+1422=30 29 29 30 29 29 29 30 30 30 29 30
+1423=30 29 30 29 30 29 29 30 29 30 29 30
+1424=30 29 30 30 29 30 29 29 30 29 30 29
+1425=30 29 30 30 29 30 29 30 30 29 30 29
+1426=29 30 29 30 29 30 30 29 30 30 29 30
+1427=29 29 30 29 30 29 30 30 29 30 30 29
+1428=30 29 29 30 29 29 30 30 30 29 30 30
+1429=29 30 29 29 30 29 29 30 30 29 30 30
+1430=29 30 30 29 29 30 29 30 29 30 29 30
+1431=29 30 30 29 30 29 30 29 30 29 29 30
+1432=29 30 30 30 29 30 29 30 29 30 29 29
+1433=30 29 30 30 29 30 30 29 30 29 30 29
+1434=29 30 29 30 29 30 30 29 30 30 29 29
+1435=30 29 30 29 30 29 30 29 30 30 29 30
+1436=29 30 29 30 29 30 29 30 29 30 29 30
+1437=30 29 30 30 29 29 30 29 30 29 29 30
+1438=30 29 30 30 30 29 29 30 29 29 30 29
+1439=30 29 30 30 30 29 30 29 30 29 29 30
+1440=29 30 29 30 30 30 29 30 29 30 29 29
+1441=30 29 30 29 30 30 29 30 30 29 30 29
+1442=29 30 29 30 29 30 29 30 30 29 30 29
+1443=30 29 30 29 30 29 30 29 30 29 30 30
+1444=29 30 29 30 30 29 29 30 29 30 29 30
+1445=29 30 30 30 29 30 29 29 30 29 29 30
+1446=29 30 30 30 29 30 30 29 29 30 29 29
+1447=30 29 30 30 30 29 30 29 30 29 30 29
+1448=29 30 29 30 30 29 30 30 29 30 29 30
+1449=29 29 30 29 30 29 30 30 29 30 30 29
+1450=30 29 30 29 29 30 29 30 29 30 30 29
+1451=30 30 30 29 29 30 29 29 30 30 29 30
+1452=30 29 30 30 29 29 30 29 29 30 29 30
+1453=30 29 30 30 29 30 29 30 29 29 30 29
+1454=30 29 30 30 29 30 30 29 30 29 30 29
+1455=29 30 29 30 30 29 30 29 30 30 29 30
+1456=29 29 30 29 30 29 30 29 30 30 30 29
+1457=30 29 29 30 29 29 30 29 30 30 30 30
+1458=29 30 29 29 30 29 29 30 29 30 30 30
+1459=29 30 30 29 29 30 29 29 30 29 30 30
+1460=29 30 30 29 30 29 30 29 29 30 29 30
+1461=29 30 30 29 30 29 30 29 30 30 29 29
+1462=30 29 30 29 30 30 29 30 29 30 30 29
+1463=29 30 29 30 29 30 29 30 30 30 29 30
+1464=29 30 29 29 30 29 29 30 30 30 29 30
+1465=30 29 30 29 29 30 29 29 30 30 29 30
+1466=30 30 29 30 29 29 29 30 29 30 30 29
+1467=30 30 29 30 30 29 29 30 29 30 29 30
+1468=29 30 29 30 30 29 30 29 30 29 30 29
+1469=29 30 29 30 30 29 30 30 29 30 29 30
+1470=29 29 30 29 30 30 29 30 30 29 30 29
+1471=30 29 29 30 29 30 29 30 30 29 30 30
+1472=29 30 29 29 30 29 30 29 30 30 29 30
+1473=29 30 29 30 30 29 29 30 29 30 29 30
+1474=29 30 30 29 30 30 29 29 30 29 30 29
+1475=29 30 30 29 30 30 30 29 29 30 29 29
+1476=30 29 30 29 30 30 30 29 30 29 30 29
+1477=29 30 29 29 30 30 30 30 29 30 29 30
+1478=29 29 30 29 30 29 30 30 29 30 30 29
+1479=30 29 29 30 29 30 29 30 29 30 30 29
+1480=30 29 30 29 30 29 30 29 30 29 30 29
+1481=30 29 30 30 29 30 29 30 29 30 29 29
+1482=30 29 30 30 30 30 29 30 29 29 30 29
+1483=29 30 29 30 30 30 29 30 30 29 29 30
+1484=29 29 30 29 30 30 30 29 30 29 30 29
+1485=30 29 29 30 29 30 30 29 30 30 29 30
+1486=29 30 29 29 30 29 30 29 30 30 29 30
+1487=30 29 30 29 30 29 29 30 29 30 29 30
+1488=30 29 30 30 29 30 29 29 30 29 30 29
+1489=30 29 30 30 30 29 30 29 29 30 29 30
+1490=29 30 29 30 30 29 30 30 29 29 30 29
+1491=30 29 29 30 30 29 30 30 29 30 29 30
+1492=29 30 29 29 30 30 29 30 29 30 30 29
+1493=30 29 30 29 30 29 29 30 29 30 30 30
+1494=29 30 29 30 29 30 29 29 29 30 30 30
+1495=29 30 30 29 30 29 29 30 29 29 30 30
+1496=29 30 30 30 29 30 29 29 30 29 29 30
+1497=30 29 30 30 29 30 29 30 29 30 29 30
+1498=29 30 29 30 29 30 30 29 30 29 30 29
+1499=30 29 30 29 29 30 30 29 30 29 30 30
+1500=29 30 29 30 29 29 30 29 30 29 30 30
+1501=30 29 30 29 30 29 29 29 30 29 30 30
+1502=30 30 29 30 29 30 29 29 29 30 30 29
+1503=30 30 29 30 30 29 30 29 29 29 30 30
+1504=29 30 29 30 30 30 29 29 30 29 30 29
+1505=30 29 30 29 30 30 29 30 29 30 30 29
+1506=29 30 29 29 30 30 29 30 30 29 30 30
+1507=29 29 30 29 29 30 30 29 30 29 30 30
+1508=30 29 29 30 29 30 29 29 30 29 30 30
+1509=30 29 30 29 30 29 30 29 29 30 29 30
+1510=30 29 30 30 29 30 29 30 29 29 30 29
+1511=30 29 30 30 29 30 30 29 30 29 29 30
+1512=29 30 29 30 29 30 30 30 29 30 29 30
+1513=29 29 29 30 29 30 30 30 29 30 30 29
+1514=30 29 29 29 30 29 30 30 29 30 30 30
+1515=29 29 30 29 29 30 29 30 30 29 30 30
+1516=29 30 29 30 29 29 30 29 30 29 30 30
+1517=29 30 29 30 29 30 30 29 29 30 29 30
+1518=29 30 29 30 30 29 30 30 29 30 29 29
+1519=30 29 29 30 30 30 29 30 30 29 30 29
+1520=29 30 29 29 30 30 30 29 30 30 29 30
+1521=29 29 29 30 29 30 30 29 30 30 29 30
+1522=30 29 29 29 30 29 30 30 29 30 30 29
+1523=30 29 30 29 30 29 30 29 29 30 30 29
+1524=30 30 29 30 29 30 29 30 29 29 30 29
+1525=30 30 29 30 30 29 30 29 30 29 29 30
+1526=29 30 29 30 30 30 29 30 29 30 29 29
+1527=30 29 30 29 30 30 29 30 30 29 30 29
+1528=30 29 29 30 29 30 29 30 30 29 30 30
+1529=29 30 29 29 30 29 30 29 30 29 30 30
+1530=29 30 30 29 29 30 29 30 29 29 30 30
+1531=29 30 30 30 29 29 30 29 30 29 29 30
+1532=29 30 30 30 29 30 30 29 29 29 30 29
+1533=30 29 30 30 30 29 30 29 30 29 29 30
+1534=29 30 29 30 30 29 30 30 29 29 30 29
+1535=30 29 30 29 30 29 30 30 29 30 29 30
+1536=29 30 29 30 29 30 29 30 29 30 29 30
+1537=30 29 30 30 29 29 30 29 29 30 29 30
+1538=30 30 29 30 30 29 29 30 29 29 30 29
+1539=30 30 30 29 30 30 29 29 30 29 29 30
+1540=29 30 30 29 30 30 29 30 29 29 30 29
+1541=30 29 30 29 30 30 30 29 30 29 29 30
+1542=29 30 29 30 29 30 30 29 30 29 30 30
+1543=29 30 29 29 30 29 30 29 30 29 30 30
+1544=30 29 30 29 29 30 29 30 29 30 29 30
+1545=30 30 29 30 29 29 30 29 30 29 29 30
+1546=30 30 29 30 29 30 29 30 29 30 29 29
+1547=30 30 29 30 30 29 30 29 30 29 30 29
+1548=30 29 29 30 30 29 30 30 29 30 29 30
+1549=29 30 29 29 30 29 30 30 30 29 30 29
+1550=30 29 30 29 29 29 30 30 30 29 30 30
+1551=29 30 29 29 30 29 29 30 30 29 30 30
+1552=30 29 30 29 29 30 29 29 30 30 29 30
+1553=30 29 30 29 30 29 30 29 30 29 30 29
+1554=30 29 30 29 30 30 29 30 29 30 29 30
+1555=29 29 30 29 30 30 29 30 30 29 30 29
+1556=30 29 29 30 29 30 29 30 30 30 29 30
+1557=29 30 29 29 29 30 29 30 30 30 30 29
+1558=30 29 30 29 29 29 30 29 30 30 30 29
+1559=30 30 29 29 30 29 29 30 30 29 30 29
+1560=30 30 29 30 29 30 29 30 29 30 29 30
+1561=29 30 30 29 30 29 30 30 29 29 30 29
+1562=29 30 30 29 30 29 30 30 30 29 29 30
+1563=29 30 29 29 30 29 30 30 30 29 30 29
+1564=30 29 30 29 29 30 29 30 30 30 29 30
+1565=29 30 29 30 29 29 30 29 30 30 29 30
+1566=30 29 30 29 30 29 29 30 29 30 29 30
+1567=30 29 30 30 29 30 29 30 29 29 30 29
+1568=30 29 30 30 30 29 30 29 30 29 29 29
+1569=30 29 30 30 30 29 30 30 29 30 29 29
+1570=29 30 29 30 30 29 30 30 30 29 29 30
+1571=29 29 30 29 30 30 29 30 30 29 30 29
+1572=30 29 29 30 29 30 29 30 30 29 30 29
+1573=30 29 30 30 29 30 29 29 30 29 30 29
+1574=30 30 29 30 30 29 30 29 29 30 29 29
+1575=30 30 30 29 30 30 29 30 29 29 29 30
+1576=29 30 30 29 30 30 30 29 30 29 29 29
+1577=30 29 30 30 29 30 30 29 30 29 30 29
+1578=29 30 29 30 29 30 30 29 30 30 29 30
+1579=29 30 29 30 29 29 30 30 29 30 29 30
+1580=29 30 30 29 30 29 29 30 29 30 29 30
+1581=30 30 29 30 29 30 29 29 30 29 30 29
+1582=30 30 29 30 30 29 30 29 30 29 29 29
+1583=30 30 29 30 30 30 29 30 29 30 29 29
+1584=29 30 30 29 30 30 29 30 30 29 30 29
+1585=29 30 29 30 29 30 29 30 30 29 30 30
+1586=29 29 30 29 30 29 29 30 30 30 29 30
+1587=29 30 30 29 29 29 30 29 30 29 30 30
+1588=30 29 30 30 29 29 29 30 29 30 29 30
+1589=30 29 30 30 29 30 29 29 30 29 30 29
+1590=30 29 30 30 30 29 29 30 29 30 29 30
+1591=29 30 29 30 30 29 30 29 30 29 30 29
+1592=30 29 30 29 30 29 30 29 30 30 30 29
+1593=30 29 29 30 29 29 30 29 30 30 30 29
+1594=30 30 29 29 30 29 29 29 30 30 30 30
+1595=29 30 29 30 29 29 30 29 29 30 30 30
+1596=29 30 30 29 30 29 29 30 29 30 29 30
+1597=29 30 30 29 30 29 30 29 30 29 30 29
+1598=30 29 30 29 30 30 29 30 29 30 30 29
+1599=29 30 29 30 29 30 29 30 30 30 29 30
+1600=29 29 30 29 30 29 29 30 30 30 29 30
--- a/jdk/src/java.base/share/classes/java/util/Collection.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/Collection.java	Wed Jul 05 20:06:12 2017 +0200
@@ -518,7 +518,7 @@
      * <p>The default implementation should be overridden by subclasses that
      * can return a more efficient spliterator.  In order to
      * preserve expected laziness behavior for the {@link #stream()} and
-     * {@link #parallelStream()}} methods, spliterators should either have the
+     * {@link #parallelStream()} methods, spliterators should either have the
      * characteristic of {@code IMMUTABLE} or {@code CONCURRENT}, or be
      * <em><a href="Spliterator.html#binding">late-binding</a></em>.
      * If none of these is practical, the overriding class should describe the
--- a/jdk/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java	Wed Jul 05 20:06:12 2017 +0200
@@ -97,8 +97,7 @@
      *
      * This implementation uses
      * sun.util.calendar.LocalGregorianCalendar to perform most of the
-     * calendar calculations. LocalGregorianCalendar is configurable
-     * and reads <JRE_HOME>/lib/calendars.properties at the start-up.
+     * calendar calculations.
      */
 
     /**
--- a/jdk/src/java.base/share/classes/sun/misc/JavaIOFileDescriptorAccess.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/misc/JavaIOFileDescriptorAccess.java	Wed Jul 05 20:06:12 2017 +0200
@@ -33,6 +33,8 @@
 public interface JavaIOFileDescriptorAccess {
     public void set(FileDescriptor obj, int fd);
     public int get(FileDescriptor fd);
+    public void setAppend(FileDescriptor obj, boolean append);
+    public boolean getAppend(FileDescriptor obj);
 
     // Only valid on Windows
     public void setHandle(FileDescriptor obj, long handle);
--- a/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java	Wed Jul 05 20:06:12 2017 +0200
@@ -44,6 +44,8 @@
 import java.util.List;
 
 import sun.misc.Cleaner;
+import sun.misc.JavaIOFileDescriptorAccess;
+import sun.misc.SharedSecrets;
 import sun.security.action.GetPropertyAction;
 
 public class FileChannelImpl
@@ -52,6 +54,10 @@
     // Memory allocation size for mapping buffers
     private static final long allocationGranularity;
 
+    // Access to FileDispatcher internals
+    private static final JavaIOFileDescriptorAccess fdAccess =
+        SharedSecrets.getJavaIOFileDescriptorAccess();
+
     // Used to make native read and write calls
     private final FileDispatcher nd;
 
@@ -61,7 +67,6 @@
     // File access mode (immutable)
     private final boolean writable;
     private final boolean readable;
-    private final boolean append;
 
     // Required to prevent finalization of creating stream (immutable)
     private final Object parent;
@@ -77,31 +82,23 @@
     private final Object positionLock = new Object();
 
     private FileChannelImpl(FileDescriptor fd, String path, boolean readable,
-                            boolean writable, boolean append, Object parent)
+                            boolean writable, Object parent)
     {
         this.fd = fd;
         this.readable = readable;
         this.writable = writable;
-        this.append = append;
         this.parent = parent;
         this.path = path;
-        this.nd = new FileDispatcherImpl(append);
+        this.nd = new FileDispatcherImpl();
     }
 
-    // Used by FileInputStream.getChannel() and RandomAccessFile.getChannel()
+    // Used by FileInputStream.getChannel(), FileOutputStream.getChannel
+    // and RandomAccessFile.getChannel()
     public static FileChannel open(FileDescriptor fd, String path,
                                    boolean readable, boolean writable,
                                    Object parent)
     {
-        return new FileChannelImpl(fd, path, readable, writable, false, parent);
-    }
-
-    // Used by FileOutputStream.getChannel
-    public static FileChannel open(FileDescriptor fd, String path,
-                                   boolean readable, boolean writable,
-                                   boolean append, Object parent)
-    {
-        return new FileChannelImpl(fd, path, readable, writable, append, parent);
+        return new FileChannelImpl(fd, path, readable, writable, parent);
     }
 
     private void ensureOpen() throws IOException {
@@ -109,7 +106,6 @@
             throw new ClosedChannelException();
     }
 
-
     // -- Standard channel operations --
 
     protected void implCloseChannel() throws IOException {
@@ -258,6 +254,7 @@
                 ti = threads.add();
                 if (!isOpen())
                     return 0;
+                boolean append = fdAccess.getAppend(fd);
                 do {
                     // in append-mode then position is advanced to end before writing
                     p = (append) ? nd.size(fd) : position0(fd, -1);
@@ -284,7 +281,7 @@
                 if (!isOpen())
                     return null;
                 do {
-                    p  = position0(fd, newPosition);
+                    p = position0(fd, newPosition);
                 } while ((p == IOStatus.INTERRUPTED) && isOpen());
                 return this;
             } finally {
--- a/jdk/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/ServerSocketChannelImpl.java	Wed Jul 05 20:06:12 2017 +0200
@@ -247,7 +247,7 @@
                     return null;
                 thread = NativeThread.current();
                 for (;;) {
-                    n = accept0(this.fd, newfd, isaa);
+                    n = accept(this.fd, newfd, isaa);
                     if ((n == IOStatus.INTERRUPTED) && isOpen())
                         continue;
                     break;
@@ -410,6 +410,18 @@
         return sb.toString();
     }
 
+    /**
+     * Accept a connection on a socket.
+     *
+     * @implNote Wrap native call to allow instrumentation.
+     */
+    private int accept(FileDescriptor ssfd, FileDescriptor newfd,
+                       InetSocketAddress[] isaa)
+        throws IOException
+    {
+        return accept0(ssfd, newfd, isaa);
+    }
+
     // -- Native methods --
 
     // Accepts a new connection, setting the given file descriptor to refer to
--- a/jdk/src/java.base/share/classes/sun/security/ssl/CipherBox.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/CipherBox.java	Wed Jul 05 20:06:12 2017 +0200
@@ -560,7 +560,7 @@
                         + newLen);
 
                     hd.encodeBuffer(
-                        (ByteBuffer)bb.duplicate().position(pos), System.out);
+                        bb.duplicate().position(pos), System.out);
                 } catch (IOException e) { }
             }
 
@@ -790,7 +790,7 @@
 
         // The padding data should be filled with the padding length value.
         int[] results = checkPadding(
-                (ByteBuffer)bb.duplicate().position(offset + newLen),
+                bb.duplicate().position(offset + newLen),
                 (byte)(padLen & 0xFF));
         if (protocolVersion.v >= ProtocolVersion.TLS10.v) {
             if (results[0] != 0) {          // padding data has invalid bytes
--- a/jdk/src/java.base/share/classes/sun/security/ssl/EngineInputRecord.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/EngineInputRecord.java	Wed Jul 05 20:06:12 2017 +0200
@@ -349,8 +349,7 @@
         /*
          * Copy data out of buffer, it's ready to go.
          */
-        ByteBuffer netBB = (ByteBuffer)
-            (ByteBuffer.allocate(len).put(buf, 0, len).flip());
+        ByteBuffer netBB = ByteBuffer.allocate(len).put(buf, 0, len).flip();
         engine.writer.putOutboundDataSync(netBB);
     }
 
--- a/jdk/src/java.base/share/classes/sun/security/ssl/EngineOutputRecord.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/EngineOutputRecord.java	Wed Jul 05 20:06:12 2017 +0200
@@ -113,9 +113,7 @@
         /*
          * Copy data out of buffer, it's ready to go.
          */
-        ByteBuffer netBB = (ByteBuffer)
-            ByteBuffer.allocate(len).put(buf, off, len).flip();
-
+        ByteBuffer netBB = ByteBuffer.allocate(len).put(buf, off, len).flip();
         writer.putOutboundData(netBB);
     }
 
--- a/jdk/src/java.base/share/classes/sun/util/calendar/CalendarSystem.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarSystem.java	Wed Jul 05 20:06:12 2017 +0200
@@ -177,44 +177,6 @@
         return (cs == null) ? cal : cs;
     }
 
-    /**
-     * Returns a {@link Properties} loaded from lib/calendars.properties.
-     *
-     * @return a {@link Properties} loaded from lib/calendars.properties
-     * @throws IOException if an error occurred when reading from the input stream
-     * @throws IllegalArgumentException if the input stream contains any malformed
-     *                                  Unicode escape sequences
-     */
-    public static Properties getCalendarProperties() throws IOException {
-        Properties calendarProps = null;
-        try {
-            String homeDir = AccessController.doPrivileged(
-                new sun.security.action.GetPropertyAction("java.home"));
-            final String fname = homeDir + File.separator + "lib" + File.separator
-                                 + "calendars.properties";
-            calendarProps = AccessController.doPrivileged(new PrivilegedExceptionAction<Properties>() {
-                @Override
-                public Properties run() throws IOException {
-                    Properties props = new Properties();
-                    try (FileInputStream fis = new FileInputStream(fname)) {
-                        props.load(fis);
-                    }
-                    return props;
-                }
-            });
-        } catch (PrivilegedActionException e) {
-            Throwable cause = e.getCause();
-            if (cause instanceof IOException) {
-                throw (IOException) cause;
-            } else if (cause instanceof IllegalArgumentException) {
-                throw (IllegalArgumentException) cause;
-            }
-            // Should not happen
-            throw new InternalError(cause);
-        }
-        return calendarProps;
-    }
-
     //////////////////////////////// Calendar API //////////////////////////////////
 
     /**
--- a/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNames.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNames.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/java.base/share/conf/calendars.properties	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-# Copyright (c) 2005, 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.  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.
-#
-
-#
-# Hijrah calendars
-#
-calendar.hijrah.Hijrah-umalqura: hijrah-config-umalqura.properties
-calendar.hijrah.Hijrah-umalqura.type: islamic-umalqura
--- a/jdk/src/java.base/share/conf/hijrah-config-umalqura.properties	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,369 +0,0 @@
-# Copyright (c) 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
-# 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 properties file defines a Hijrah calendar variant.
-#
-# Fields:
-#
-#       <version> ::= 'version' '=' <version string>
-#            <id> ::= 'id' '=' <id string>
-#          <type> ::= 'type' '=' <type string>
-#     <iso-start> ::= 'iso-start' '=' <start date in the ISO calendar>
-#          <year> ::= <yyyy> '=' <nn nn nn nn nn nn nn nn nn nn nn nn>
-#
-# version ... (Required)
-#
-# id ... (Required)
-#    Identifies the Java Chronology
-#
-# type ... (Required)
-#    Identifies the type of calendar in the standard calendar ID scheme
-# iso-start ... (Required)
-#    Specifies the corresponding ISO date to the first Hijrah day
-#    in the defined range of dates
-#
-# year ... (Required)
-#    Number of days for each month of a Hijrah year
-#    * Each line defines a year. The years must be in chronological
-#      order and no gap is allowed.
-#    * Each line is in the form indicated above. <yyyy> is a Hijrah year and
-#      nn is the number of days for a month listed in the order of the months.
-#    * Each year must have 12 months.
-#    * Each month should be 29 or 30 days long.
-#    * There must be one or more space characters between the months.
-#
-
-# Version of this definition
-version=1.8.0_1
-
-# Java chronology ID
-id=Hijrah-umalqura
-
-# Standard calendar type specification
-type=islamic-umalqura
-
-# defines the corresponding ISO date to the earliest Hijrah date
-iso-start=1882-11-12
-
-#     1  2  3  4  5  6  7  8  9 10 11 12
-1300=30 29 30 29 30 29 30 29 30 29 30 29
-1301=30 30 29 30 29 30 29 30 29 30 29 29
-1302=30 30 30 29 30 30 29 29 30 29 29 30
-1303=29 30 30 29 30 30 29 30 29 30 29 29
-1304=29 30 30 29 30 30 30 29 30 29 30 29
-1305=29 29 30 30 29 30 30 29 30 30 29 29
-1306=30 29 30 29 30 29 30 29 30 30 29 30
-1307=29 30 29 30 29 30 29 30 29 30 29 30
-1308=29 30 30 29 30 29 30 29 30 29 29 30
-1309=29 30 30 30 30 29 29 30 29 29 30 29
-1310=30 29 30 30 30 29 30 29 30 29 29 30
-1311=29 30 29 30 30 30 29 30 29 30 29 29
-1312=30 29 30 29 30 30 29 30 30 29 30 29
-1313=29 30 29 30 29 30 29 30 30 30 29 29
-1314=30 30 29 30 29 29 30 29 30 30 29 30
-1315=29 30 30 29 30 29 29 30 29 30 29 30
-1316=29 30 30 30 29 30 29 29 30 29 30 29
-1317=30 29 30 30 29 30 29 30 29 30 29 29
-1318=30 29 30 30 29 30 30 29 30 29 30 29
-1319=29 30 29 30 30 29 30 29 30 30 29 30
-1320=29 30 29 29 30 29 30 29 30 30 30 29
-1321=30 29 30 29 29 30 29 29 30 30 30 30
-1322=29 30 29 30 29 29 29 30 29 30 30 30
-1323=29 30 30 29 30 29 29 29 30 29 30 30
-1324=29 30 30 29 30 29 30 29 29 30 29 30
-1325=30 29 30 29 30 30 29 30 29 30 29 30
-1326=29 29 30 29 30 30 29 30 29 30 30 29
-1327=30 29 29 30 29 30 29 30 30 29 30 30
-1328=29 30 29 29 30 29 29 30 30 30 29 30
-1329=30 29 30 29 29 30 29 29 30 30 29 30
-1330=30 30 29 30 29 29 30 29 29 30 30 29
-1331=30 30 29 30 30 29 29 30 29 30 29 30
-1332=29 30 29 30 30 29 30 29 30 30 29 29
-1333=30 29 29 30 30 29 30 30 29 30 30 29
-1334=29 29 30 29 30 29 30 30 30 29 30 29
-1335=30 29 30 29 29 30 29 30 30 29 30 30
-1336=29 30 29 30 29 29 30 29 30 29 30 30
-1337=30 29 30 29 30 29 29 30 29 30 29 30
-1338=29 30 30 29 30 30 29 29 30 29 30 29
-1339=30 29 30 29 30 30 30 29 30 29 29 30
-1340=29 29 30 29 30 30 30 30 29 30 29 29
-1341=30 29 29 30 29 30 30 30 29 30 30 29
-1342=29 29 30 29 30 29 30 30 29 30 30 29
-1343=30 29 29 30 29 30 29 30 29 30 30 29
-1344=30 29 30 29 30 30 29 29 30 29 30 29
-1345=30 29 30 30 30 29 30 29 29 30 29 29
-1346=30 29 30 30 30 30 29 30 29 29 30 29
-1347=29 30 29 30 30 30 29 30 30 29 29 30
-1348=29 29 30 29 30 30 29 30 30 30 29 29
-1349=30 29 29 30 29 30 30 29 30 30 29 30
-1350=29 30 29 30 29 30 29 29 30 30 29 30
-1351=30 29 30 29 30 29 30 29 29 30 29 30
-1352=30 29 30 30 29 30 29 30 29 29 30 29
-1353=30 29 30 30 30 29 30 29 29 30 29 30
-1354=29 30 29 30 30 29 30 30 29 30 29 29
-1355=30 29 29 30 30 29 30 30 29 30 30 29
-1356=29 30 29 30 29 30 29 30 29 30 30 30
-1357=29 29 30 29 30 29 29 30 29 30 30 30
-1358=29 30 29 30 29 30 29 29 30 29 30 30
-1359=29 30 30 29 30 29 30 29 29 29 30 30
-1360=29 30 30 30 29 30 29 30 29 29 30 29
-1361=30 29 30 30 29 30 30 29 29 30 29 30
-1362=29 30 29 30 29 30 30 29 30 29 30 29
-1363=30 29 30 29 30 29 30 29 30 29 30 30
-1364=29 30 29 30 29 29 30 29 30 29 30 30
-1365=30 30 29 29 30 29 29 30 29 30 29 30
-1366=30 30 29 30 29 30 29 29 30 29 30 29
-1367=30 30 29 30 30 29 30 29 29 30 29 30
-1368=29 30 29 30 30 30 29 29 30 29 30 29
-1369=30 29 30 29 30 30 29 30 29 30 30 29
-1370=30 29 29 30 29 30 29 30 29 30 30 30
-1371=29 30 29 29 30 29 30 29 30 29 30 30
-1372=30 29 29 30 29 30 29 29 30 29 30 30
-1373=30 29 30 29 30 29 30 29 29 30 29 30
-1374=30 29 30 30 29 30 29 30 29 29 30 29
-1375=30 29 30 30 29 30 30 29 30 29 30 29
-1376=29 30 29 30 29 30 30 30 29 30 29 30
-1377=29 29 30 29 29 30 30 30 29 30 30 29
-1378=30 29 29 29 30 29 30 30 29 30 30 30
-1379=29 30 29 29 29 30 29 30 30 29 30 30
-1380=29 30 29 30 29 30 29 30 29 30 29 30
-1381=29 30 29 30 30 29 30 29 30 29 29 30
-1382=29 30 29 30 30 29 30 30 29 30 29 29
-1383=30 29 29 30 30 30 29 30 30 29 30 29
-1384=29 30 29 29 30 30 29 30 30 30 29 30
-1385=29 29 30 29 29 30 30 29 30 30 30 29
-1386=30 29 29 30 29 29 30 30 29 30 30 29
-1387=30 29 30 29 30 29 30 29 30 29 30 29
-1388=30 30 29 30 29 30 29 30 29 30 29 29
-1389=30 30 29 30 30 29 30 30 29 29 30 29
-1390=29 30 29 30 30 30 29 30 29 30 29 30
-1391=29 29 30 29 30 30 29 30 30 29 30 29
-1392=30 29 29 30 29 30 29 30 30 29 30 30
-1393=29 30 29 29 30 29 30 29 30 29 30 30
-1394=30 29 30 29 29 30 29 30 29 30 29 30
-1395=30 29 30 30 29 30 29 29 30 29 29 30
-1396=30 29 30 30 29 30 30 29 29 30 29 29
-1397=30 29 30 30 29 30 30 30 29 29 29 30
-1398=29 30 29 30 30 29 30 30 29 30 29 29
-1399=30 29 30 29 30 29 30 30 29 30 29 30
-1400=30 29 30 29 29 30 29 30 29 30 29 30
-1401=30 30 29 30 29 29 30 29 29 30 29 30
-1402=30 30 30 29 30 29 29 30 29 29 30 29
-1403=30 30 30 29 30 30 29 29 30 29 29 30
-1404=29 30 30 29 30 30 29 30 29 30 29 29
-1405=30 29 30 29 30 30 30 29 30 29 29 30
-1406=30 29 29 30 29 30 30 29 30 29 30 30
-1407=29 30 29 29 30 29 30 29 30 29 30 30
-1408=30 29 30 29 30 29 29 30 29 29 30 30
-1409=30 30 29 30 29 30 29 29 30 29 29 30
-1410=30 30 29 30 30 29 30 29 29 30 29 29
-1411=30 30 29 30 30 29 30 30 29 29 30 29
-1412=30 29 30 29 30 29 30 30 30 29 29 30
-1413=29 30 29 29 30 29 30 30 30 29 30 29
-1414=30 29 30 29 29 30 29 30 30 29 30 30
-1415=29 30 29 30 29 29 30 29 30 29 30 30
-1416=30 29 30 29 30 29 29 30 29 30 29 30
-1417=30 29 30 30 29 29 30 29 30 29 30 29
-1418=30 29 30 30 29 30 29 30 29 30 29 30
-1419=29 30 29 30 29 30 29 30 30 30 29 29
-1420=29 30 29 29 30 29 30 30 30 30 29 30
-1421=29 29 30 29 29 29 30 30 30 30 29 30
-1422=30 29 29 30 29 29 29 30 30 30 29 30
-1423=30 29 30 29 30 29 29 30 29 30 29 30
-1424=30 29 30 30 29 30 29 29 30 29 30 29
-1425=30 29 30 30 29 30 29 30 30 29 30 29
-1426=29 30 29 30 29 30 30 29 30 30 29 30
-1427=29 29 30 29 30 29 30 30 29 30 30 29
-1428=30 29 29 30 29 29 30 30 30 29 30 30
-1429=29 30 29 29 30 29 29 30 30 29 30 30
-1430=29 30 30 29 29 30 29 30 29 30 29 30
-1431=29 30 30 29 30 29 30 29 30 29 29 30
-1432=29 30 30 30 29 30 29 30 29 30 29 29
-1433=30 29 30 30 29 30 30 29 30 29 30 29
-1434=29 30 29 30 29 30 30 29 30 30 29 29
-1435=30 29 30 29 30 29 30 29 30 30 29 30
-1436=29 30 29 30 29 30 29 30 29 30 29 30
-1437=30 29 30 30 29 29 30 29 30 29 29 30
-1438=30 29 30 30 30 29 29 30 29 29 30 29
-1439=30 29 30 30 30 29 30 29 30 29 29 30
-1440=29 30 29 30 30 30 29 30 29 30 29 29
-1441=30 29 30 29 30 30 29 30 30 29 30 29
-1442=29 30 29 30 29 30 29 30 30 29 30 29
-1443=30 29 30 29 30 29 30 29 30 29 30 30
-1444=29 30 29 30 30 29 29 30 29 30 29 30
-1445=29 30 30 30 29 30 29 29 30 29 29 30
-1446=29 30 30 30 29 30 30 29 29 30 29 29
-1447=30 29 30 30 30 29 30 29 30 29 30 29
-1448=29 30 29 30 30 29 30 30 29 30 29 30
-1449=29 29 30 29 30 29 30 30 29 30 30 29
-1450=30 29 30 29 29 30 29 30 29 30 30 29
-1451=30 30 30 29 29 30 29 29 30 30 29 30
-1452=30 29 30 30 29 29 30 29 29 30 29 30
-1453=30 29 30 30 29 30 29 30 29 29 30 29
-1454=30 29 30 30 29 30 30 29 30 29 30 29
-1455=29 30 29 30 30 29 30 29 30 30 29 30
-1456=29 29 30 29 30 29 30 29 30 30 30 29
-1457=30 29 29 30 29 29 30 29 30 30 30 30
-1458=29 30 29 29 30 29 29 30 29 30 30 30
-1459=29 30 30 29 29 30 29 29 30 29 30 30
-1460=29 30 30 29 30 29 30 29 29 30 29 30
-1461=29 30 30 29 30 29 30 29 30 30 29 29
-1462=30 29 30 29 30 30 29 30 29 30 30 29
-1463=29 30 29 30 29 30 29 30 30 30 29 30
-1464=29 30 29 29 30 29 29 30 30 30 29 30
-1465=30 29 30 29 29 30 29 29 30 30 29 30
-1466=30 30 29 30 29 29 29 30 29 30 30 29
-1467=30 30 29 30 30 29 29 30 29 30 29 30
-1468=29 30 29 30 30 29 30 29 30 29 30 29
-1469=29 30 29 30 30 29 30 30 29 30 29 30
-1470=29 29 30 29 30 30 29 30 30 29 30 29
-1471=30 29 29 30 29 30 29 30 30 29 30 30
-1472=29 30 29 29 30 29 30 29 30 30 29 30
-1473=29 30 29 30 30 29 29 30 29 30 29 30
-1474=29 30 30 29 30 30 29 29 30 29 30 29
-1475=29 30 30 29 30 30 30 29 29 30 29 29
-1476=30 29 30 29 30 30 30 29 30 29 30 29
-1477=29 30 29 29 30 30 30 30 29 30 29 30
-1478=29 29 30 29 30 29 30 30 29 30 30 29
-1479=30 29 29 30 29 30 29 30 29 30 30 29
-1480=30 29 30 29 30 29 30 29 30 29 30 29
-1481=30 29 30 30 29 30 29 30 29 30 29 29
-1482=30 29 30 30 30 30 29 30 29 29 30 29
-1483=29 30 29 30 30 30 29 30 30 29 29 30
-1484=29 29 30 29 30 30 30 29 30 29 30 29
-1485=30 29 29 30 29 30 30 29 30 30 29 30
-1486=29 30 29 29 30 29 30 29 30 30 29 30
-1487=30 29 30 29 30 29 29 30 29 30 29 30
-1488=30 29 30 30 29 30 29 29 30 29 30 29
-1489=30 29 30 30 30 29 30 29 29 30 29 30
-1490=29 30 29 30 30 29 30 30 29 29 30 29
-1491=30 29 29 30 30 29 30 30 29 30 29 30
-1492=29 30 29 29 30 30 29 30 29 30 30 29
-1493=30 29 30 29 30 29 29 30 29 30 30 30
-1494=29 30 29 30 29 30 29 29 29 30 30 30
-1495=29 30 30 29 30 29 29 30 29 29 30 30
-1496=29 30 30 30 29 30 29 29 30 29 29 30
-1497=30 29 30 30 29 30 29 30 29 30 29 30
-1498=29 30 29 30 29 30 30 29 30 29 30 29
-1499=30 29 30 29 29 30 30 29 30 29 30 30
-1500=29 30 29 30 29 29 30 29 30 29 30 30
-1501=30 29 30 29 30 29 29 29 30 29 30 30
-1502=30 30 29 30 29 30 29 29 29 30 30 29
-1503=30 30 29 30 30 29 30 29 29 29 30 30
-1504=29 30 29 30 30 30 29 29 30 29 30 29
-1505=30 29 30 29 30 30 29 30 29 30 30 29
-1506=29 30 29 29 30 30 29 30 30 29 30 30
-1507=29 29 30 29 29 30 30 29 30 29 30 30
-1508=30 29 29 30 29 30 29 29 30 29 30 30
-1509=30 29 30 29 30 29 30 29 29 30 29 30
-1510=30 29 30 30 29 30 29 30 29 29 30 29
-1511=30 29 30 30 29 30 30 29 30 29 29 30
-1512=29 30 29 30 29 30 30 30 29 30 29 30
-1513=29 29 29 30 29 30 30 30 29 30 30 29
-1514=30 29 29 29 30 29 30 30 29 30 30 30
-1515=29 29 30 29 29 30 29 30 30 29 30 30
-1516=29 30 29 30 29 29 30 29 30 29 30 30
-1517=29 30 29 30 29 30 30 29 29 30 29 30
-1518=29 30 29 30 30 29 30 30 29 30 29 29
-1519=30 29 29 30 30 30 29 30 30 29 30 29
-1520=29 30 29 29 30 30 30 29 30 30 29 30
-1521=29 29 29 30 29 30 30 29 30 30 29 30
-1522=30 29 29 29 30 29 30 30 29 30 30 29
-1523=30 29 30 29 30 29 30 29 29 30 30 29
-1524=30 30 29 30 29 30 29 30 29 29 30 29
-1525=30 30 29 30 30 29 30 29 30 29 29 30
-1526=29 30 29 30 30 30 29 30 29 30 29 29
-1527=30 29 30 29 30 30 29 30 30 29 30 29
-1528=30 29 29 30 29 30 29 30 30 29 30 30
-1529=29 30 29 29 30 29 30 29 30 29 30 30
-1530=29 30 30 29 29 30 29 30 29 29 30 30
-1531=29 30 30 30 29 29 30 29 30 29 29 30
-1532=29 30 30 30 29 30 30 29 29 29 30 29
-1533=30 29 30 30 30 29 30 29 30 29 29 30
-1534=29 30 29 30 30 29 30 30 29 29 30 29
-1535=30 29 30 29 30 29 30 30 29 30 29 30
-1536=29 30 29 30 29 30 29 30 29 30 29 30
-1537=30 29 30 30 29 29 30 29 29 30 29 30
-1538=30 30 29 30 30 29 29 30 29 29 30 29
-1539=30 30 30 29 30 30 29 29 30 29 29 30
-1540=29 30 30 29 30 30 29 30 29 29 30 29
-1541=30 29 30 29 30 30 30 29 30 29 29 30
-1542=29 30 29 30 29 30 30 29 30 29 30 30
-1543=29 30 29 29 30 29 30 29 30 29 30 30
-1544=30 29 30 29 29 30 29 30 29 30 29 30
-1545=30 30 29 30 29 29 30 29 30 29 29 30
-1546=30 30 29 30 29 30 29 30 29 30 29 29
-1547=30 30 29 30 30 29 30 29 30 29 30 29
-1548=30 29 29 30 30 29 30 30 29 30 29 30
-1549=29 30 29 29 30 29 30 30 30 29 30 29
-1550=30 29 30 29 29 29 30 30 30 29 30 30
-1551=29 30 29 29 30 29 29 30 30 29 30 30
-1552=30 29 30 29 29 30 29 29 30 30 29 30
-1553=30 29 30 29 30 29 30 29 30 29 30 29
-1554=30 29 30 29 30 30 29 30 29 30 29 30
-1555=29 29 30 29 30 30 29 30 30 29 30 29
-1556=30 29 29 30 29 30 29 30 30 30 29 30
-1557=29 30 29 29 29 30 29 30 30 30 30 29
-1558=30 29 30 29 29 29 30 29 30 30 30 29
-1559=30 30 29 29 30 29 29 30 30 29 30 29
-1560=30 30 29 30 29 30 29 30 29 30 29 30
-1561=29 30 30 29 30 29 30 30 29 29 30 29
-1562=29 30 30 29 30 29 30 30 30 29 29 30
-1563=29 30 29 29 30 29 30 30 30 29 30 29
-1564=30 29 30 29 29 30 29 30 30 30 29 30
-1565=29 30 29 30 29 29 30 29 30 30 29 30
-1566=30 29 30 29 30 29 29 30 29 30 29 30
-1567=30 29 30 30 29 30 29 30 29 29 30 29
-1568=30 29 30 30 30 29 30 29 30 29 29 29
-1569=30 29 30 30 30 29 30 30 29 30 29 29
-1570=29 30 29 30 30 29 30 30 30 29 29 30
-1571=29 29 30 29 30 30 29 30 30 29 30 29
-1572=30 29 29 30 29 30 29 30 30 29 30 29
-1573=30 29 30 30 29 30 29 29 30 29 30 29
-1574=30 30 29 30 30 29 30 29 29 30 29 29
-1575=30 30 30 29 30 30 29 30 29 29 29 30
-1576=29 30 30 29 30 30 30 29 30 29 29 29
-1577=30 29 30 30 29 30 30 29 30 29 30 29
-1578=29 30 29 30 29 30 30 29 30 30 29 30
-1579=29 30 29 30 29 29 30 30 29 30 29 30
-1580=29 30 30 29 30 29 29 30 29 30 29 30
-1581=30 30 29 30 29 30 29 29 30 29 30 29
-1582=30 30 29 30 30 29 30 29 30 29 29 29
-1583=30 30 29 30 30 30 29 30 29 30 29 29
-1584=29 30 30 29 30 30 29 30 30 29 30 29
-1585=29 30 29 30 29 30 29 30 30 29 30 30
-1586=29 29 30 29 30 29 29 30 30 30 29 30
-1587=29 30 30 29 29 29 30 29 30 29 30 30
-1588=30 29 30 30 29 29 29 30 29 30 29 30
-1589=30 29 30 30 29 30 29 29 30 29 30 29
-1590=30 29 30 30 30 29 29 30 29 30 29 30
-1591=29 30 29 30 30 29 30 29 30 29 30 29
-1592=30 29 30 29 30 29 30 29 30 30 30 29
-1593=30 29 29 30 29 29 30 29 30 30 30 29
-1594=30 30 29 29 30 29 29 29 30 30 30 30
-1595=29 30 29 30 29 29 30 29 29 30 30 30
-1596=29 30 30 29 30 29 29 30 29 30 29 30
-1597=29 30 30 29 30 29 30 29 30 29 30 29
-1598=30 29 30 29 30 30 29 30 29 30 30 29
-1599=29 30 29 30 29 30 29 30 30 30 29 30
-1600=29 29 30 29 30 29 29 30 30 30 29 30
--- a/jdk/src/java.base/share/native/libjava/io_util.h	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/share/native/libjava/io_util.h	Wed Jul 05 20:06:12 2017 +0200
@@ -28,6 +28,7 @@
 
 extern jfieldID IO_fd_fdID;
 extern jfieldID IO_handle_fdID;
+extern jfieldID IO_append_fdID;
 
 #ifdef _ALLBSD_SOURCE
 #include <fcntl.h>
--- a/jdk/src/java.base/unix/classes/java/io/FileDescriptor.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/unix/classes/java/io/FileDescriptor.java	Wed Jul 05 20:06:12 2017 +0200
@@ -52,15 +52,21 @@
     private boolean closed;
 
     /**
+     * true, if file is opened for appending.
+     */
+    private boolean append;
+
+    /**
      * Constructs an (invalid) FileDescriptor
      * object.
      */
-    public /**/ FileDescriptor() {
+    public FileDescriptor() {
         fd = -1;
     }
 
-    private /* */ FileDescriptor(int fd) {
+    private FileDescriptor(int fd) {
         this.fd = fd;
+        this.append = getAppend(fd);
     }
 
     /**
@@ -149,6 +155,14 @@
                     return obj.fd;
                 }
 
+                public void setAppend(FileDescriptor obj, boolean append) {
+                    obj.append = append;
+                }
+
+                public boolean getAppend(FileDescriptor obj) {
+                    return obj.append;
+                }
+
                 public void setHandle(FileDescriptor obj, long handle) {
                     throw new UnsupportedOperationException();
                 }
@@ -160,6 +174,11 @@
         );
     }
 
+    /**
+     * Returns true, if the file was opened for appending.
+     */
+    private static native boolean getAppend(int fd);
+
     /*
      * Package private methods to track referents.
      * If multiple streams point to the same FileDescriptor, we cycle
--- a/jdk/src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java	Wed Jul 05 20:06:12 2017 +0200
@@ -35,10 +35,6 @@
         init();
     }
 
-    FileDispatcherImpl(boolean append) {
-        /* append is ignored */
-    }
-
     FileDispatcherImpl() {
     }
 
--- a/jdk/src/java.base/unix/classes/sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java	Wed Jul 05 20:06:12 2017 +0200
@@ -141,7 +141,7 @@
         Throwable exc = null;
         try {
             begin();
-            int n = accept0(this.fd, newfd, isaa);
+            int n = accept(this.fd, newfd, isaa);
 
             // spurious wakeup, is this possible?
             if (n == IOStatus.UNAVAILABLE) {
@@ -277,7 +277,7 @@
         try {
             begin();
 
-            int n = accept0(this.fd, newfd, isaa);
+            int n = accept(this.fd, newfd, isaa);
             if (n == IOStatus.UNAVAILABLE) {
 
                 // need calling context when there is security manager as
@@ -332,6 +332,18 @@
         }
     }
 
+    /**
+     * Accept a connection on a socket.
+     *
+     * @implNote Wrap native call to allow instrumentation.
+     */
+    private int accept(FileDescriptor ssfd, FileDescriptor newfd,
+                       InetSocketAddress[] isaa)
+        throws IOException
+    {
+        return accept0(ssfd, newfd, isaa);
+    }
+
     // -- Native methods --
 
     private static native void initIDs();
--- a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java	Wed Jul 05 20:06:12 2017 +0200
@@ -134,7 +134,7 @@
             throw new IllegalArgumentException("APPEND + TRUNCATE_EXISTING not allowed");
 
         FileDescriptor fdObj = open(dfd, path, pathForPermissionCheck, flags, mode);
-        return FileChannelImpl.open(fdObj, path.toString(), flags.read, flags.write, flags.append, null);
+        return FileChannelImpl.open(fdObj, path.toString(), flags.read, flags.write, null);
     }
 
     /**
@@ -288,6 +288,7 @@
         // create java.io.FileDescriptor
         FileDescriptor fdObj = new FileDescriptor();
         fdAccess.set(fdObj, fd);
+        fdAccess.setAppend(fdObj, flags.append);
         return fdObj;
     }
 }
--- a/jdk/src/java.base/unix/native/libjava/FileDescriptor_md.c	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/unix/native/libjava/FileDescriptor_md.c	Wed Jul 05 20:06:12 2017 +0200
@@ -23,6 +23,9 @@
  * questions.
  */
 
+#include <unistd.h>
+#include <fcntl.h>
+
 #include "jvm.h"
 #include "io_util_md.h"
 
@@ -35,6 +38,9 @@
 /* field id for jint 'fd' in java.io.FileDescriptor */
 jfieldID IO_fd_fdID;
 
+/* field id for jboolean 'append' in java.io.FileDescriptor */
+jfieldID IO_append_fdID;
+
 /**************************************************************
  * static methods to store field ID's in initializers
  */
@@ -42,6 +48,7 @@
 JNIEXPORT void JNICALL
 Java_java_io_FileDescriptor_initIDs(JNIEnv *env, jclass fdClass) {
     IO_fd_fdID = (*env)->GetFieldID(env, fdClass, "fd", "I");
+    IO_append_fdID = (*env)->GetFieldID(env, fdClass, "append", "Z");
 }
 
 /**************************************************************
@@ -55,3 +62,9 @@
         JNU_ThrowByName(env, "java/io/SyncFailedException", "sync failed");
     }
 }
+
+JNIEXPORT jboolean JNICALL
+Java_java_io_FileDescriptor_getAppend(JNIEnv *env, jclass fdClass, jint fd) {
+    int flags = fcntl(fd, F_GETFL);
+    return ((flags & O_APPEND) == 0) ? JNI_FALSE : JNI_TRUE;
+}
--- a/jdk/src/java.base/unix/native/libjava/io_util_md.c	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/unix/native/libjava/io_util_md.c	Wed Jul 05 20:06:12 2017 +0200
@@ -107,7 +107,15 @@
 #endif
         fd = handleOpen(ps, flags, 0666);
         if (fd != -1) {
+            jobject fdobj;
+            jboolean append;
             SET_FD(this, fd, fid);
+
+            fdobj = (*env)->GetObjectField(env, this, fid);
+            if (fdobj != NULL) {
+                append = (flags & O_APPEND) == 0 ? JNI_FALSE : JNI_TRUE;
+                (*env)->SetBooleanField(env, fdobj, IO_append_fdID, append);
+            }
         } else {
             throwFileNotFoundException(env, path);
         }
--- a/jdk/src/java.base/windows/classes/java/io/FileDescriptor.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/windows/classes/java/io/FileDescriptor.java	Wed Jul 05 20:06:12 2017 +0200
@@ -51,6 +51,11 @@
     private boolean closed;
 
     /**
+     * true, if file is opened for appending.
+     */
+    private boolean append;
+
+    /**
      * Constructs an (invalid) FileDescriptor
      * object.
      */
@@ -75,6 +80,14 @@
                     return obj.fd;
                 }
 
+                public void setAppend(FileDescriptor obj, boolean append) {
+                    obj.append = append;
+                }
+
+                public boolean getAppend(FileDescriptor obj) {
+                    return obj.append;
+                }
+
                 public void setHandle(FileDescriptor obj, long handle) {
                     obj.handle = handle;
                 }
--- a/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java	Wed Jul 05 20:06:12 2017 +0200
@@ -31,22 +31,14 @@
 
 class FileDispatcherImpl extends FileDispatcher
 {
+    private static final JavaIOFileDescriptorAccess fdAccess =
+        SharedSecrets.getJavaIOFileDescriptorAccess();
+
     static {
         IOUtil.load();
     }
 
-    /**
-     * Indicates if the dispatcher should first advance the file position
-     * to the end of file when writing.
-     */
-    private final boolean append;
-
-    FileDispatcherImpl(boolean append) {
-        this.append = append;
-    }
-
     FileDispatcherImpl() {
-        this(false);
     }
 
     @Override
@@ -71,7 +63,7 @@
     }
 
     int write(FileDescriptor fd, long address, int len) throws IOException {
-        return write0(fd, address, len, append);
+        return write0(fd, address, len, fdAccess.getAppend(fd));
     }
 
     int pwrite(FileDescriptor fd, long address, int len, long position)
@@ -81,7 +73,7 @@
     }
 
     long writev(FileDescriptor fd, long address, int len) throws IOException {
-        return writev0(fd, address, len, append);
+        return writev0(fd, address, len, fdAccess.getAppend(fd));
     }
 
     int force(FileDescriptor fd, boolean metaData) throws IOException {
@@ -112,8 +104,6 @@
 
     FileDescriptor duplicateForMapping(FileDescriptor fd) throws IOException {
         // on Windows we need to keep a handle to the file
-        JavaIOFileDescriptorAccess fdAccess =
-            SharedSecrets.getJavaIOFileDescriptorAccess();
         FileDescriptor result = new FileDescriptor();
         long handle = duplicateHandle(fdAccess.getHandle(fd));
         fdAccess.setHandle(result, handle);
--- a/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsChannelFactory.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/windows/classes/sun/nio/fs/WindowsChannelFactory.java	Wed Jul 05 20:06:12 2017 +0200
@@ -160,7 +160,7 @@
             throw new IllegalArgumentException("APPEND + TRUNCATE_EXISTING not allowed");
 
         FileDescriptor fdObj = open(pathForWindows, pathToCheck, flags, pSecurityDescriptor);
-        return FileChannelImpl.open(fdObj, pathForWindows, flags.read, flags.write, flags.append, null);
+        return FileChannelImpl.open(fdObj, pathForWindows, flags.read, flags.write, null);
     }
 
     /**
@@ -339,6 +339,7 @@
         // create FileDescriptor and return
         FileDescriptor fdObj = new FileDescriptor();
         fdAccess.setHandle(fdObj, handle);
+        fdAccess.setAppend(fdObj, flags.append);
         return fdObj;
     }
 }
--- a/jdk/src/java.base/windows/native/libjava/FileDescriptor_md.c	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/windows/native/libjava/FileDescriptor_md.c	Wed Jul 05 20:06:12 2017 +0200
@@ -42,6 +42,9 @@
 /* field id for jlong 'handle' in java.io.FileDescriptor */
 jfieldID IO_handle_fdID;
 
+/* field id for jboolean 'append' in java.io.FileDescriptor */
+jfieldID IO_append_fdID;
+
 /**************************************************************
  * static methods to store field IDs in initializers
  */
@@ -50,6 +53,7 @@
 Java_java_io_FileDescriptor_initIDs(JNIEnv *env, jclass fdClass) {
     CHECK_NULL(IO_fd_fdID = (*env)->GetFieldID(env, fdClass, "fd", "I"));
     CHECK_NULL(IO_handle_fdID = (*env)->GetFieldID(env, fdClass, "handle", "J"));
+    CHECK_NULL(IO_append_fdID = (*env)->GetFieldID(env, fdClass, "append", "Z"));
 }
 
 JNIEXPORT jlong JNICALL
--- a/jdk/src/java.base/windows/native/libjava/io_util_md.c	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.base/windows/native/libjava/io_util_md.c	Wed Jul 05 20:06:12 2017 +0200
@@ -275,7 +275,15 @@
 {
     FD h = winFileHandleOpen(env, path, flags);
     if (h >= 0) {
+        jobject fdobj;
+        jboolean append;
         SET_FD(this, h, fid);
+
+        fdobj = (*env)->GetObjectField(env, this, fid);
+        if (fdobj != NULL) {
+            append = (flags & O_APPEND) == 0 ? JNI_FALSE : JNI_TRUE;
+            (*env)->SetBooleanField(env, fdobj, IO_append_fdID, append);
+        }
     }
 }
 
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaIcon.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaIcon.java	Wed Jul 05 20:06:12 2017 +0200
@@ -62,7 +62,7 @@
         if (w <= 0 || h <= 0) return null;
 
         // This could be any kind of icon, so we need to make a buffer for it, draw it and then pass the new image off to appkit.
-        final BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
+        final BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
         final Graphics g = image.getGraphics();
         i.paintIcon(null, g, 0, 0);
         g.dispose();
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaImageFactory.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaImageFactory.java	Wed Jul 05 20:06:12 2017 +0200
@@ -129,7 +129,7 @@
                 };
 
         final BufferedImage image = new BufferedImage(scaledAlertIconSize,
-                scaledAlertIconSize, BufferedImage.TYPE_INT_ARGB);
+                scaledAlertIconSize, BufferedImage.TYPE_INT_ARGB_PRE);
         final Graphics g = image.getGraphics();
         g.drawImage(background, 0, 0,
                 scaledAlertIconSize, scaledAlertIconSize, null);
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaNativeResources.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaNativeResources.java	Wed Jul 05 20:06:12 2017 +0200
@@ -67,11 +67,12 @@
     }
 
     static BufferedImage getRadioButtonSizerImage() {
-        final BufferedImage img = new BufferedImage(20, 20, BufferedImage.TYPE_INT_ARGB);
+        final BufferedImage img = new BufferedImage(20, 20, BufferedImage.TYPE_INT_ARGB_PRE);
 
         Graphics g = img.getGraphics();
         g.setColor(Color.pink);
         g.fillRect(0, 0, 20, 20);
+        g.dispose();
 
         return img;
     }
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Wed Jul 05 20:06:12 2017 +0200
@@ -676,6 +676,13 @@
     @Override  // PlatformWindow
     public void toFront() {
         final long nsWindowPtr = getNSWindowPtr();
+        LWCToolkit lwcToolkit = (LWCToolkit) Toolkit.getDefaultToolkit();
+        Window w = DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
+        if( w != null
+                && ((LWWindowPeer)w.getPeer()).getPeerType() == LWWindowPeer.PeerType.EMBEDDED_FRAME
+                && !lwcToolkit.isApplicationActive()) {
+            lwcToolkit.activateApplicationIgnoringOtherApps();
+        }
         updateFocusabilityForAutoRequestFocus(false);
         nativePushNSWindowToFront(nsWindowPtr);
         updateFocusabilityForAutoRequestFocus(true);
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java	Wed Jul 05 20:06:12 2017 +0200
@@ -811,6 +811,11 @@
      */
     public static native boolean isEmbedded();
 
+    /*
+     * Activates application ignoring other apps.
+     */
+    public native void activateApplicationIgnoringOtherApps();
+
     /************************
      * Native methods section
      ************************/
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m	Wed Jul 05 20:06:12 2017 +0200
@@ -606,6 +606,23 @@
     return active;
 }
 
+/*
+ * Class:     sun_lwawt_macosx_LWCToolkit
+ * Method:    activateApplicationIgnoringOtherApps
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_activateApplicationIgnoringOtherApps
+(JNIEnv *env, jclass clazz)
+{
+    JNF_COCOA_ENTER(env);
+    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
+        if(![NSApp isActive]){
+            [NSApp activateIgnoringOtherApps:YES];
+        }
+    }];
+    JNF_COCOA_EXIT(env);
+}
+
 
 /*
  * Class:     sun_awt_SunToolkit
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/META-INF/services/javax.print.PrintServiceLookup	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,2 @@
+# Provider for Java Print Service
+sun.print.PrintServiceLookupProvider
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/share/classes/META-INF/services/javax.print.StreamPrintServiceFactory	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,2 @@
+# Provider for Java 2D Stream print services.
+sun.print.PSStreamPrinterFactory
--- a/jdk/src/java.desktop/share/classes/java/awt/Container.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/java/awt/Container.java	Wed Jul 05 20:06:12 2017 +0200
@@ -3696,7 +3696,7 @@
     private void writeObject(ObjectOutputStream s) throws IOException {
         ObjectOutputStream.PutField f = s.putFields();
         f.put("ncomponents", component.size());
-        f.put("component", getComponentsSync());
+        f.put("component", component.toArray(EMPTY_ARRAY));
         f.put("layoutMgr", layoutMgr);
         f.put("dispatcher", dispatcher);
         f.put("maxSize", maxSize);
--- a/jdk/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java	Wed Jul 05 20:06:12 2017 +0200
@@ -48,6 +48,7 @@
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.FilePermission;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInputStream;
@@ -1857,7 +1858,13 @@
      * returns null.
      */
     private static InputStream getStandardProfileInputStream(String fileName) {
-        return PCMM.class.getResourceAsStream("profiles/" + fileName);
+        return AccessController.doPrivileged(
+            new PrivilegedAction<InputStream>() {
+                public InputStream run () {
+                    return
+                        PCMM.class.getResourceAsStream("profiles/" + fileName);
+                }
+            }, null, new FilePermission("<<ALL FILES>>", "read"));
     }
 
     /**
--- a/jdk/src/java.desktop/share/classes/javax/swing/BorderFactory.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/BorderFactory.java	Wed Jul 05 20:06:12 2017 +0200
@@ -35,7 +35,7 @@
  * possible, this factory will hand out references to shared
  * <code>Border</code> instances.
  * For further information and examples see
- * <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/border.htmll">How
+ * <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/border.html">How
  to Use Borders</a>,
  * a section in <em>The Java Tutorial</em>.
  *
--- a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java	Wed Jul 05 20:06:12 2017 +0200
@@ -126,7 +126,7 @@
  *     that includes double buffering and support for borders.
  *     For more information see <a
  * href="http://www.oracle.com/technetwork/java/painting-140037.html#swing">Painting</a> and
- * <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/border.htmll">How
+ * <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/border.html">How
  *     to Use Borders</a>,
  *     both of which are sections in <em>The Java Tutorial</em>.
  * </ul>
--- a/jdk/src/java.desktop/share/classes/javax/swing/JInternalFrame.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JInternalFrame.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1141,14 +1141,15 @@
     /**
      * Sets an image to be displayed in the titlebar of this internal frame (usually
      * in the top-left corner).
+     * Some look and feels might not support displaying an icon in the titlebar.
+     *
      * This image is not the <code>desktopIcon</code> object, which
      * is the image displayed in the <code>JDesktop</code> when
      * this internal frame is iconified.
      *
      * Passing <code>null</code> to this function is valid,
-     * but the look and feel
-     * can choose the
-     * appropriate behavior for that situation, such as displaying no icon
+     * but the look and feel can choose the appropriate behavior
+     * for that situation, such as displaying no icon
      * or a default icon for the look and feel.
      *
      * @param icon the <code>Icon</code> to display in the title bar
--- a/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JLayer.java	Wed Jul 05 20:06:12 2017 +0200
@@ -325,24 +325,38 @@
     }
 
     /**
-     * A non-{@code null} border, or non-zero insets, isn't supported, to prevent the geometry
-     * of this component from becoming complex enough to inhibit
-     * subclassing of {@code LayerUI} class.  To create a {@code JLayer} with a border,
-     * add it to a {@code JPanel} that has a border.
-     * <p>Note:  If {@code border} is non-{@code null}, this
-     * method will throw an exception as borders are not supported on
-     * a {@code JLayer}.
+     * Delegates its functionality to the {@code getView().setBorder(Border)} method,
+     * if the view component is an instance of {@code javax.swing.JComponent},
+     * otherwise this method is a no-op.
      *
-     * @param border the {@code Border} to set
-     * @exception IllegalArgumentException this method is not supported
+     * @param border the border to be rendered for the {@code view} component
+     * @see #getView()
+     * @see javax.swing.JComponent#setBorder(Border)
      */
     public void setBorder(Border border) {
-        if (border != null) {
-            throw new IllegalArgumentException("JLayer.setBorder() not supported");
+        if (view instanceof JComponent) {
+            ((JComponent)view).setBorder(border);
         }
     }
 
     /**
+     * Delegates its functionality to the {@code getView().getBorder()} method,
+     * if the view component is an instance of {@code javax.swing.JComponent},
+     * otherwise returns {@code null}.
+     *
+     * @return the border object for the {@code view} component
+     * @see #getView()
+     * @see #setBorder
+     * @see javax.swing.JComponent#getBorder()
+     */
+    public Border getBorder() {
+        if (view instanceof JComponent) {
+            return ((JComponent) view).getBorder();
+        }
+        return null;
+    }
+
+    /**
      * This method is not supported by {@code JLayer}
      * and always throws {@code UnsupportedOperationException}
      *
--- a/jdk/src/java.desktop/share/classes/javax/swing/border/Border.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/border/Border.java	Wed Jul 05 20:06:12 2017 +0200
@@ -33,7 +33,7 @@
  * Interface describing an object capable of rendering a border
  * around the edges of a swing component.
  * For examples of using borders see
- * <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/border.htmll">How to Use Borders</a>,
+ * <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/border.html">How to Use Borders</a>,
  * a section in <em>The Java Tutorial.</em>
  * <p>
  * In the Swing component set, borders supercede Insets as the
--- a/jdk/src/java.desktop/share/classes/javax/swing/border/package.html	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/border/package.html	Wed Jul 05 20:06:12 2017 +0200
@@ -40,10 +40,10 @@
 Most of the Swing API is <em>not</em> thread safe.
 For details, see
 <a
-href="http://java.sun.com/docs/books/tutorial/uiswing/overview/threads.html"
-target="_top">Threads and Swing</a>,
+href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html"
+target="_top">Concurrency in Swing</a>,
 a section in
-<em><a href="http://java.sun.com/docs/books/tutorial/"
+<em><a href="http://docs.oracle.com/javase/tutorial/"
 target="_top">The Java Tutorial</a></em>.
 
 
@@ -51,7 +51,7 @@
 
 For overviews, tutorials, examples, guides, and tool documentation, please see:
 <ul>
-  <li><a href="http://java.sun.com/docs/books/tutorial/uiswing/misc/border.html"
+  <li><a href="http://docs.oracle.com/javase/tutorial/uiswing/components/border.html"
       target="_top">How to Use Borders</a>,
       a section in <em>The Java Tutorial</em>
 </ul>
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicRadioButtonUI.java	Wed Jul 05 20:06:12 2017 +0200
@@ -33,7 +33,8 @@
 import javax.swing.text.View;
 import sun.swing.SwingUtilities2;
 import sun.awt.AppContext;
-
+import java.util.Enumeration;
+import java.util.HashSet;
 
 /**
  * RadioButtonUI implementation for BasicRadioButtonUI
@@ -53,6 +54,8 @@
 
     private final static String propertyPrefix = "RadioButton" + ".";
 
+    private KeyListener keyListener = null;
+
     // ********************************
     //        Create PLAF
     // ********************************
@@ -74,6 +77,7 @@
         return radioButtonUI;
     }
 
+    @Override
     protected String getPropertyPrefix() {
         return propertyPrefix;
     }
@@ -81,7 +85,8 @@
     // ********************************
     //        Install PLAF
     // ********************************
-    protected void installDefaults(AbstractButton b){
+    @Override
+    protected void installDefaults(AbstractButton b) {
         super.installDefaults(b);
         if(!defaults_initialized) {
             icon = UIManager.getIcon(getPropertyPrefix() + "icon");
@@ -92,7 +97,8 @@
     // ********************************
     //        Uninstall PLAF
     // ********************************
-    protected void uninstallDefaults(AbstractButton b){
+    @Override
+    protected void uninstallDefaults(AbstractButton b) {
         super.uninstallDefaults(b);
         defaults_initialized = false;
     }
@@ -106,6 +112,65 @@
         return icon;
     }
 
+    // ********************************
+    //        Install Listeners
+    // ********************************
+    @Override
+    protected void installListeners(AbstractButton button) {
+        super.installListeners(button);
+
+        // Only for JRadioButton
+        if (!(button instanceof JRadioButton))
+            return;
+
+        keyListener = createKeyListener();
+        button.addKeyListener(keyListener);
+
+        // Need to get traversal key event
+        button.setFocusTraversalKeysEnabled(false);
+
+        // Map actions to the arrow keys
+        button.getActionMap().put("Previous", new SelectPreviousBtn());
+        button.getActionMap().put("Next", new SelectNextBtn());
+
+        button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
+            put(KeyStroke.getKeyStroke("UP"), "Previous");
+        button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
+            put(KeyStroke.getKeyStroke("DOWN"), "Next");
+        button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
+            put(KeyStroke.getKeyStroke("LEFT"), "Previous");
+        button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).
+            put(KeyStroke.getKeyStroke("RIGHT"), "Next");
+    }
+
+    // ********************************
+    //        UnInstall Listeners
+    // ********************************
+    @Override
+    protected void uninstallListeners(AbstractButton button) {
+        super.uninstallListeners(button);
+
+        // Only for JRadioButton
+        if (!(button instanceof JRadioButton))
+            return;
+
+        // Unmap actions from the arrow keys
+        button.getActionMap().remove("Previous");
+        button.getActionMap().remove("Next");
+        button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
+                    .remove(KeyStroke.getKeyStroke("UP"));
+        button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
+                    .remove(KeyStroke.getKeyStroke("DOWN"));
+        button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
+                    .remove(KeyStroke.getKeyStroke("LEFT"));
+        button.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
+                    .remove(KeyStroke.getKeyStroke("RIGHT"));
+
+        if (keyListener != null) {
+            button.removeKeyListener(keyListener);
+            keyListener = null;
+        }
+    }
 
     /* These Dimensions/Rectangles are allocated once for all
      * RadioButtonUI.paint() calls.  Re-using rectangles
@@ -121,6 +186,7 @@
     /**
      * paint the radio button
      */
+    @Override
     public synchronized void paint(Graphics g, JComponent c) {
         AbstractButton b = (AbstractButton) c;
         ButtonModel model = b.getModel();
@@ -217,7 +283,7 @@
      * @param textRect bounds
      * @param size the size of radio button
      */
-    protected void paintFocus(Graphics g, Rectangle textRect, Dimension size){
+    protected void paintFocus(Graphics g, Rectangle textRect, Dimension size) {
     }
 
 
@@ -235,6 +301,7 @@
     /**
      * The preferred size of the radio button
      */
+    @Override
     public Dimension getPreferredSize(JComponent c) {
         if(c.getComponentCount() > 0) {
             return null;
@@ -280,4 +347,262 @@
         height += prefInsets.top + prefInsets.bottom;
         return new Dimension(width, height);
     }
+
+    /////////////////////////// Private functions ////////////////////////
+    /**
+     * Creates the key listener to handle tab navigation in JRadioButton Group.
+     */
+    private KeyListener createKeyListener() {
+         if (keyListener == null) {
+            keyListener = new KeyHandler();
+        }
+        return keyListener;
+    }
+
+
+    private boolean isValidRadioButtonObj(Object obj) {
+        return ((obj instanceof JRadioButton) &&
+                    ((JRadioButton) obj).isVisible() &&
+                    ((JRadioButton) obj).isEnabled());
+    }
+
+    /**
+     * Select radio button based on "Previous" or "Next" operation
+     *
+     * @param event, the event object.
+     * @param next, indicate if it's next one
+     */
+    private void selectRadioButton(ActionEvent event, boolean next) {
+        // Get the source of the event.
+        Object eventSrc = event.getSource();
+
+        // Check whether the source is JRadioButton, it so, whether it is visible
+        if (!isValidRadioButtonObj(eventSrc))
+            return;
+
+        ButtonGroupInfo btnGroupInfo = new ButtonGroupInfo((JRadioButton)eventSrc);
+        btnGroupInfo.selectNewButton(next);
+    }
+
+    /////////////////////////// Inner Classes ////////////////////////
+    @SuppressWarnings("serial")
+    private class SelectPreviousBtn extends AbstractAction {
+        public SelectPreviousBtn() {
+            super("Previous");
+        }
+
+        public void actionPerformed(ActionEvent e) {
+           BasicRadioButtonUI.this.selectRadioButton(e, false);
+        }
+    }
+
+    @SuppressWarnings("serial")
+    private class SelectNextBtn extends AbstractAction{
+        public SelectNextBtn() {
+            super("Next");
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            BasicRadioButtonUI.this.selectRadioButton(e, true);
+        }
+    }
+
+    /**
+     * ButtonGroupInfo, used to get related info in button group
+     * for given radio button
+     */
+    private class ButtonGroupInfo {
+
+        JRadioButton activeBtn = null;
+
+        JRadioButton firstBtn = null;
+        JRadioButton lastBtn = null;
+
+        JRadioButton previousBtn = null;
+        JRadioButton nextBtn = null;
+
+        HashSet<JRadioButton> btnsInGroup = null;
+
+        boolean srcFound = false;
+        public ButtonGroupInfo(JRadioButton btn) {
+            activeBtn = btn;
+            btnsInGroup = new HashSet<JRadioButton>();
+        }
+
+        // Check if given object is in the button group
+        boolean containsInGroup(Object obj){
+           return btnsInGroup.contains(obj);
+        }
+
+        // Check if the next object to gain focus belongs
+        // to the button group or not
+        Component getFocusTransferBaseComponent(boolean next){
+            Component focusBaseComp = activeBtn;
+            Window container = SwingUtilities.getWindowAncestor(activeBtn);
+            if (container != null) {
+                FocusTraversalPolicy policy = container.getFocusTraversalPolicy();
+                Component comp = next ? policy.getComponentAfter(container, activeBtn)
+                                      : policy.getComponentBefore(container, activeBtn);
+
+                // If next component in the button group, use last/first button as base focus
+                // otherwise, use the activeBtn as the base focus
+                if (containsInGroup(comp)) {
+                    focusBaseComp = next ? lastBtn : firstBtn;
+                }
+            }
+
+            return focusBaseComp;
+        }
+
+        boolean getButtonGroupInfo() {
+            if (activeBtn == null)
+                return false;
+
+            btnsInGroup.clear();
+
+            // Get the button model from the source.
+            ButtonModel model = activeBtn.getModel();
+            if (!(model instanceof DefaultButtonModel))
+                return false;
+
+            // If the button model is DefaultButtonModel, and use it, otherwise return.
+            DefaultButtonModel bm = (DefaultButtonModel) model;
+
+            // get the ButtonGroup of the button from the button model
+            ButtonGroup group = bm.getGroup();
+            if (group == null)
+                return false;
+
+            // Get all the buttons in the group
+            Enumeration<AbstractButton> e = group.getElements();
+            if (e == null)
+                return false;
+
+            while (e.hasMoreElements()) {
+                AbstractButton curElement = e.nextElement();
+                if (!isValidRadioButtonObj(curElement))
+                    continue;
+
+                btnsInGroup.add((JRadioButton) curElement);
+
+                // If firstBtn is not set yet, curElement is that first button
+                if (null == firstBtn)
+                    firstBtn = (JRadioButton) curElement;
+
+                if (activeBtn == curElement)
+                    srcFound = true;
+                else if (!srcFound) {
+                    // The source has not been yet found and the current element
+                    // is the last previousBtn
+                    previousBtn = (JRadioButton) curElement;
+                } else if (nextBtn == null) {
+                    // The source has been found and the current element
+                    // is the next valid button of the list
+                    nextBtn = (JRadioButton) curElement;
+                }
+
+                // Set new last "valid" JRadioButton of the list
+                lastBtn = (JRadioButton) curElement;
+            }
+
+            return true;
+        }
+
+        /**
+          * Find the new radio button that focus needs to be
+          * moved to in the group, select the button
+          *
+          * @param next, indicate if it's arrow up/left or down/right
+          */
+        void selectNewButton(boolean next) {
+            if (!getButtonGroupInfo())
+                return;
+
+            if (srcFound) {
+                JRadioButton newSelectedBtn = null;
+                if (next) {
+                    // Select Next button. Cycle to the first button if the source
+                    // button is the last of the group.
+                    newSelectedBtn = (null == nextBtn) ? firstBtn : nextBtn;
+                } else {
+                    // Select previous button. Cycle to the last button if the source
+                    // button is the first button of the group.
+                    newSelectedBtn = (null == previousBtn) ? lastBtn : previousBtn;
+                }
+                if (newSelectedBtn != null &&
+                    (newSelectedBtn != activeBtn)) {
+                    newSelectedBtn.requestFocusInWindow();
+                    newSelectedBtn.setSelected(true);
+                }
+            }
+        }
+
+        /**
+          * Find the button group the passed in JRadioButton belongs to, and
+          * move focus to next component of the last button in the group
+          * or previous component of first button
+          *
+          * @param next, indicate if jump to next component or previous
+          */
+        void jumpToNextComponent(boolean next) {
+            if (!getButtonGroupInfo()){
+                // In case the button does not belong to any group, it needs
+                // to be treated as a component
+                if (activeBtn != null){
+                    lastBtn = activeBtn;
+                    firstBtn = activeBtn;
+                }
+                else
+                    return;
+            }
+
+            // Update the component we will use as base to transfer
+            // focus from
+            JComponent compTransferFocusFrom = activeBtn;
+
+            // If next component in the parent window is not in
+            // the button group, current active button will be
+            // base, otherwise, the base will be first or last
+            // button in the button group
+            Component focusBase = getFocusTransferBaseComponent(next);
+            if (focusBase != null){
+                if (next) {
+                    KeyboardFocusManager.
+                        getCurrentKeyboardFocusManager().focusNextComponent(focusBase);
+                } else {
+                    KeyboardFocusManager.
+                        getCurrentKeyboardFocusManager().focusPreviousComponent(focusBase);
+                }
+            }
+        }
+    }
+
+    /**
+     * Radiobutton KeyListener
+     */
+    private class KeyHandler implements KeyListener {
+
+        // This listener checks if the key event is a KeyEvent.VK_TAB
+        // or shift + KeyEvent.VK_TAB event on a radio button, consume the event
+        // if so and move the focus to next/previous component
+        public void keyPressed(KeyEvent e) {
+            if (e.getKeyCode() == KeyEvent.VK_TAB) {
+                 // Get the source of the event.
+                Object eventSrc = e.getSource();
+
+                // Check whether the source is a visible and enabled JRadioButton
+                if (isValidRadioButtonObj(eventSrc)) {
+                    e.consume();
+                    ButtonGroupInfo btnGroupInfo = new ButtonGroupInfo((JRadioButton)eventSrc);
+                    btnGroupInfo.jumpToNextComponent(!e.isShiftDown());
+                }
+            }
+        }
+
+        public void keyReleased(KeyEvent e) {
+        }
+
+        public void keyTyped(KeyEvent e) {
+        }
+    }
 }
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java	Wed Jul 05 20:06:12 2017 +0200
@@ -3249,6 +3249,7 @@
                 }
             }
             tabScroller.tabPanel.setPreferredSize(new Dimension(totalWidth, totalHeight));
+            tabScroller.tabPanel.invalidate();
         }
     }
 
@@ -3622,6 +3623,7 @@
             setFocusIndex(tabPane.getSelectedIndex(), false);
 
             if (scrollableTabLayoutEnabled()) {
+                ensureCurrentLayout();
                 int index = tabPane.getSelectedIndex();
                 if (index < rects.length && index != -1) {
                     tabScroller.tabPanel.scrollRectToVisible(
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLDocument.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLDocument.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1400,8 +1400,13 @@
             Element parent = elem.getParentElement();
 
             if (parent != null) {
+                // If we are going to insert the string into the body
+                // section, it is necessary to set the corrsponding flag.
+                if (HTML.Tag.BODY.name.equals(parent.getName())) {
+                    insertInBody = true;
+                }
                 int offset = elem.getEndOffset();
-                if (offset > getLength()) {
+                if (offset > (getLength() + 1)) {
                     offset--;
                 }
                 else if (elem.isLeaf() && getText(offset - 1, 1).
@@ -1409,6 +1414,10 @@
                     offset--;
                 }
                 insertHTML(parent, offset, htmlText, false);
+                // Cleanup the flag, if any.
+                if (insertInBody) {
+                    insertInBody = false;
+                }
             }
         }
     }
@@ -1847,6 +1856,11 @@
     private static char[] NEWLINE;
 
     /**
+     * Indicates that direct insertion to body section takes place.
+     */
+    private boolean insertInBody = false;
+
+    /**
      * I18N property key.
      *
      * @see AbstractDocument#I18NProperty
@@ -2610,7 +2624,9 @@
                     // Assume content should be added.
                     foundInsertTag(false);
                     foundInsertTag = true;
-                    inParagraph = impliedP = true;
+                    // If content is added directly to the body, it should
+                    // be wrapped by p-implied.
+                    inParagraph = impliedP = !insertInBody;
                 }
                 if (data.length >= 1) {
                     addContent(data, 0, data.length);
--- a/jdk/src/java.desktop/share/classes/sun/java2d/opengl/OGLBlitLoops.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/opengl/OGLBlitLoops.java	Wed Jul 05 20:06:12 2017 +0200
@@ -47,7 +47,7 @@
 import static sun.java2d.pipe.BufferedOpCodes.*;
 import java.lang.annotation.Native;
 
-class OGLBlitLoops {
+final class OGLBlitLoops {
 
     static void register() {
         Blit blitIntArgbPreToSurface =
@@ -56,7 +56,9 @@
         Blit blitIntArgbPreToTexture =
             new OGLSwToTextureBlit(SurfaceType.IntArgbPre,
                                    OGLSurfaceData.PF_INT_ARGB_PRE);
-
+        TransformBlit transformBlitIntArgbPreToSurface =
+            new OGLSwToSurfaceTransform(SurfaceType.IntArgbPre,
+                                        OGLSurfaceData.PF_INT_ARGB_PRE);
         GraphicsPrimitive[] primitives = {
             // surface->surface ops
             new OGLSurfaceToSurfaceBlit(),
@@ -100,7 +102,7 @@
                                CompositeType.AnyAlpha,
                                blitIntArgbPreToSurface),
 
-            new OGLAnyCompositeBlit(OGLSurfaceData.OpenGLSurface),
+            new OGLAnyCompositeBlit(),
 
             new OGLSwToSurfaceScale(SurfaceType.IntRgb,
                                     OGLSurfaceData.PF_INT_RGB),
@@ -145,8 +147,9 @@
                                         OGLSurfaceData.PF_BYTE_GRAY),
             new OGLSwToSurfaceTransform(SurfaceType.UshortGray,
                                         OGLSurfaceData.PF_USHORT_GRAY),
-            new OGLSwToSurfaceTransform(SurfaceType.IntArgbPre,
-                                        OGLSurfaceData.PF_INT_ARGB_PRE),
+            transformBlitIntArgbPreToSurface,
+
+            new OGLGeneralTransformedBlit(transformBlitIntArgbPreToSurface),
 
             // texture->surface ops
             new OGLTextureToSurfaceBlit(),
@@ -178,9 +181,6 @@
             new OGLGeneralBlit(OGLSurfaceData.OpenGLTexture,
                                CompositeType.SrcNoEa,
                                blitIntArgbPreToTexture),
-
-            new OGLAnyCompositeBlit(OGLSurfaceData.OpenGLTexture),
-
         };
         GraphicsPrimitiveMgr.register(primitives);
     }
@@ -781,11 +781,11 @@
  * This general Blit implementation converts any source surface to an
  * intermediate IntArgbPre surface, and then uses the more specific
  * IntArgbPre->OpenGLSurface/Texture loop to get the intermediate
- * (premultiplied) surface down to OpenGL.
+ * (premultiplied) surface down to OpenGL using simple blit.
  */
 class OGLGeneralBlit extends Blit {
 
-    private Blit performop;
+    private final Blit performop;
     private WeakReference<SurfaceData> srcTmp;
 
     OGLGeneralBlit(SurfaceType dstType,
@@ -826,12 +826,56 @@
     }
 }
 
-class OGLAnyCompositeBlit extends Blit {
+/**
+ * This general TransformedBlit implementation converts any source surface to an
+ * intermediate IntArgbPre surface, and then uses the more specific
+ * IntArgbPre->OpenGLSurface/Texture loop to get the intermediate
+ * (premultiplied) surface down to OpenGL using simple transformBlit.
+ */
+final class OGLGeneralTransformedBlit extends TransformBlit {
+
+    private final TransformBlit performop;
+    private WeakReference<SurfaceData> srcTmp;
+
+    OGLGeneralTransformedBlit(final TransformBlit performop) {
+        super(SurfaceType.Any, CompositeType.AnyAlpha,
+              OGLSurfaceData.OpenGLSurface);
+        this.performop = performop;
+    }
+
+    @Override
+    public synchronized void Transform(SurfaceData src, SurfaceData dst,
+                                       Composite comp, Region clip,
+                                       AffineTransform at, int hint, int srcx,
+                                       int srcy, int dstx, int dsty, int width,
+                                       int height){
+        Blit convertsrc = Blit.getFromCache(src.getSurfaceType(),
+                                            CompositeType.SrcNoEa,
+                                            SurfaceType.IntArgbPre);
+        // use cached intermediate surface, if available
+        final SurfaceData cachedSrc = srcTmp != null ? srcTmp.get() : null;
+        // convert source to IntArgbPre
+        src = convertFrom(convertsrc, src, srcx, srcy, width, height, cachedSrc,
+                          BufferedImage.TYPE_INT_ARGB_PRE);
+
+        // transform IntArgbPre intermediate surface to OpenGL surface
+        performop.Transform(src, dst, comp, clip, at, hint, 0, 0, dstx, dsty,
+                            width, height);
+
+        if (src != cachedSrc) {
+            // cache the intermediate surface
+            srcTmp = new WeakReference<>(src);
+        }
+    }
+}
+
+final class OGLAnyCompositeBlit extends Blit {
     private WeakReference<SurfaceData> dstTmp;
 
-    public OGLAnyCompositeBlit(SurfaceType dstType) {
-        super(SurfaceType.Any, CompositeType.Any, dstType);
+    OGLAnyCompositeBlit() {
+        super(SurfaceType.Any, CompositeType.Any, OGLSurfaceData.OpenGLSurface);
     }
+
     public synchronized void Blit(SurfaceData src, SurfaceData dst,
                                   Composite comp, Region clip,
                                   int sx, int sy, int dx, int dy,
@@ -848,15 +892,15 @@
             cachedDst = dstTmp.get();
         }
 
-        // convert source to IntArgbPre
+        // convert destination to IntArgbPre
         SurfaceData dstBuffer = convertFrom(convertdst, dst, dx, dy, w, h,
                           cachedDst, BufferedImage.TYPE_INT_ARGB_PRE);
+        Region bufferClip =
+                clip == null ? null : clip.getTranslatedRegion(-dx, -dy);
 
         Blit performop = Blit.getFromCache(src.getSurfaceType(),
                 CompositeType.Any, dstBuffer.getSurfaceType());
-
-        performop.Blit(src, dstBuffer, comp, clip,
-                       sx, sy, 0, 0, w, h);
+        performop.Blit(src, dstBuffer, comp, bufferClip, sx, sy, 0, 0, w, h);
 
         if (dstBuffer != cachedDst) {
             // cache the intermediate surface
--- a/jdk/src/java.desktop/unix/classes/META-INF/services/javax.print.PrintServiceLookup	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Provider for Java Print Service
-sun.print.UnixPrintServiceLookup
--- a/jdk/src/java.desktop/unix/classes/META-INF/services/javax.print.StreamPrintServiceFactory	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Provider for Java 2D Stream print services.
-sun.print.PSStreamPrinterFactory
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java	Wed Jul 05 20:06:12 2017 +0200
@@ -595,8 +595,13 @@
         return isNetWMName("Mutter") || isNetWMName("GNOME Shell");
     }
 
+    static int awtWMNonReparenting = -1;
     static boolean isNonReparentingWM() {
-        return (XWM.getWMID() == XWM.COMPIZ_WM || XWM.getWMID() == XWM.LG3D_WM || XWM.getWMID() == XWM.CWM_WM);
+        if (awtWMNonReparenting == -1) {
+            awtWMNonReparenting = (XToolkit.getEnv("_JAVA_AWT_WM_NONREPARENTING") != null) ? 1 : 0;
+        }
+        return (awtWMNonReparenting == 1 || XWM.getWMID() == XWM.COMPIZ_WM
+                || XWM.getWMID() == XWM.LG3D_WM || XWM.getWMID() == XWM.CWM_WM);
     }
 
     /*
--- a/jdk/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/unix/classes/sun/print/CUPSPrinter.java	Wed Jul 05 20:06:12 2017 +0200
@@ -324,8 +324,8 @@
                          * reported, exec lpstat -d which has all the Apple
                          * special behaviour for this built in.
                          */
-                         if (UnixPrintServiceLookup.isMac()) {
-                             printerInfo[0] = UnixPrintServiceLookup.
+                         if (PrintServiceLookupProvider.isMac()) {
+                             printerInfo[0] = PrintServiceLookupProvider.
                                                    getDefaultPrinterNameSysV();
                              printerInfo[1] = null;
                              return printerInfo.clone();
--- a/jdk/src/java.desktop/unix/classes/sun/print/IPPPrintService.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/unix/classes/sun/print/IPPPrintService.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1047,7 +1047,7 @@
                setting like collation.  Therefore, we temporarily exclude
                Linux.
             */
-            if (!UnixPrintServiceLookup.isLinux()) {
+            if (!PrintServiceLookupProvider.isLinux()) {
                 catList.add(SheetCollate.class);
             }
         }
@@ -1641,7 +1641,7 @@
          * Mac is using printer-info IPP attribute for its human-readable printer
          * name and is also the identifier used in NSPrintInfo:setPrinter.
          */
-        if (UnixPrintServiceLookup.isMac()) {
+        if (PrintServiceLookupProvider.isMac()) {
             PrintServiceAttributeSet psaSet = this.getAttributes();
             if (psaSet != null) {
                 PrinterInfo pName = (PrinterInfo)psaSet.get(PrinterInfo.class);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,964 @@
+/*
+ * Copyright (c) 2000, 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.  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.print;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Vector;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import javax.print.DocFlavor;
+import javax.print.MultiDocPrintService;
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+import javax.print.attribute.Attribute;
+import javax.print.attribute.AttributeSet;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.HashPrintServiceAttributeSet;
+import javax.print.attribute.PrintRequestAttribute;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.print.attribute.PrintServiceAttribute;
+import javax.print.attribute.PrintServiceAttributeSet;
+import javax.print.attribute.standard.PrinterName;
+import javax.print.attribute.standard.PrinterURI;
+import java.io.File;
+import java.io.FileReader;
+import java.net.URL;
+import java.nio.file.Files;
+
+/*
+ * Remind: This class uses solaris commands. We also need a linux
+ * version
+ */
+public class PrintServiceLookupProvider extends PrintServiceLookup
+    implements BackgroundServiceLookup, Runnable {
+
+    /* Remind: the current implementation is static, as its assumed
+     * its preferable to minimize creation of PrintService instances.
+     * Later we should add logic to add/remove services on the fly which
+     * will take a hit of needing to regather the list of services.
+     */
+    private String defaultPrinter;
+    private PrintService defaultPrintService;
+    private PrintService[] printServices; /* includes the default printer */
+    private Vector<BackgroundLookupListener> lookupListeners = null;
+    private static String debugPrefix = "PrintServiceLookupProvider>> ";
+    private static boolean pollServices = true;
+    private static final int DEFAULT_MINREFRESH = 120;  // 2 minutes
+    private static int minRefreshTime = DEFAULT_MINREFRESH;
+
+
+    static String osname;
+
+    // List of commands used to deal with the printer queues on AIX
+    String[] lpNameComAix = {
+      "/usr/bin/lsallq",
+      "/usr/bin/lpstat -W -p|/usr/bin/expand|/usr/bin/cut -f1 -d' '",
+      "/usr/bin/lpstat -W -d|/usr/bin/expand|/usr/bin/cut -f1 -d' '",
+      "/usr/bin/lpstat -W -v"
+    };
+    private static final int aix_lsallq = 0;
+    private static final int aix_lpstat_p = 1;
+    private static final int aix_lpstat_d = 2;
+    private static final int aix_lpstat_v = 3;
+    private static int aix_defaultPrinterEnumeration = aix_lsallq;
+
+    static {
+        /* The system property "sun.java2d.print.polling"
+         * can be used to force the printing code to poll or not poll
+         * for PrintServices.
+         */
+        String pollStr = java.security.AccessController.doPrivileged(
+            new sun.security.action.GetPropertyAction("sun.java2d.print.polling"));
+
+        if (pollStr != null) {
+            if (pollStr.equalsIgnoreCase("true")) {
+                pollServices = true;
+            } else if (pollStr.equalsIgnoreCase("false")) {
+                pollServices = false;
+            }
+        }
+
+        /* The system property "sun.java2d.print.minRefreshTime"
+         * can be used to specify minimum refresh time (in seconds)
+         * for polling PrintServices.  The default is 120.
+         */
+        String refreshTimeStr = java.security.AccessController.doPrivileged(
+            new sun.security.action.GetPropertyAction(
+                "sun.java2d.print.minRefreshTime"));
+
+        if (refreshTimeStr != null) {
+            try {
+                minRefreshTime = (new Integer(refreshTimeStr)).intValue();
+            } catch (NumberFormatException e) {
+            }
+            if (minRefreshTime < DEFAULT_MINREFRESH) {
+                minRefreshTime = DEFAULT_MINREFRESH;
+            }
+        }
+
+        osname = java.security.AccessController.doPrivileged(
+            new sun.security.action.GetPropertyAction("os.name"));
+
+        /* The system property "sun.java2d.print.aix.lpstat"
+         * can be used to force the usage of 'lpstat -p' to enumerate all
+         * printer queues. By default we use 'lsallq', because 'lpstat -p' can
+         * take lots of time if thousands of printers are attached to a server.
+         */
+        if (isAIX()) {
+            String aixPrinterEnumerator = java.security.AccessController.doPrivileged(
+                new sun.security.action.GetPropertyAction("sun.java2d.print.aix.lpstat"));
+
+            if (aixPrinterEnumerator != null) {
+                if (aixPrinterEnumerator.equalsIgnoreCase("lpstat")) {
+                    aix_defaultPrinterEnumeration = aix_lpstat_p;
+                } else if (aixPrinterEnumerator.equalsIgnoreCase("lsallq")) {
+                    aix_defaultPrinterEnumeration = aix_lsallq;
+                }
+            }
+        }
+    }
+
+    static boolean isMac() {
+        return osname.startsWith("Mac");
+    }
+
+    static boolean isSysV() {
+        return osname.equals("SunOS");
+    }
+
+    static boolean isLinux() {
+        return (osname.equals("Linux"));
+    }
+
+    static boolean isBSD() {
+        return (osname.equals("Linux") ||
+                osname.contains("OS X"));
+    }
+
+    static boolean isAIX() {
+        return osname.equals("AIX");
+    }
+
+    static final int UNINITIALIZED = -1;
+    static final int BSD_LPD = 0;
+    static final int BSD_LPD_NG = 1;
+
+    static int cmdIndex = UNINITIALIZED;
+
+    String[] lpcFirstCom = {
+        "/usr/sbin/lpc status | grep : | sed -ne '1,1 s/://p'",
+        "/usr/sbin/lpc status | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
+    };
+
+    String[] lpcAllCom = {
+        "/usr/sbin/lpc status all | grep : | sed -e 's/://'",
+        "/usr/sbin/lpc status all | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}' | sort"
+    };
+
+    String[] lpcNameCom = {
+        "| grep : | sed -ne 's/://p'",
+        "| grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
+    };
+
+
+    static int getBSDCommandIndex() {
+        String command  = "/usr/sbin/lpc status all";
+        String[] names = execCmd(command);
+
+        if ((names == null) || (names.length == 0)) {
+            return BSD_LPD_NG;
+        }
+
+        for (int i=0; i<names.length; i++) {
+            if (names[i].indexOf('@') != -1) {
+                return BSD_LPD_NG;
+            }
+        }
+
+        return BSD_LPD;
+    }
+
+
+    public PrintServiceLookupProvider() {
+        // start the printer listener thread
+        if (pollServices) {
+            PrinterChangeListener thr = new PrinterChangeListener();
+            thr.setDaemon(true);
+            thr.start();
+            IPPPrintService.debug_println(debugPrefix+"polling turned on");
+        }
+    }
+
+    /* Want the PrintService which is default print service to have
+     * equality of reference with the equivalent in list of print services
+     * This isn't required by the API and there's a risk doing this will
+     * lead people to assume its guaranteed.
+     */
+    public synchronized PrintService[] getPrintServices() {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+            security.checkPrintJobAccess();
+        }
+
+        if (printServices == null || !pollServices) {
+            refreshServices();
+        }
+        if (printServices == null) {
+            return new PrintService[0];
+        } else {
+            return printServices.clone();
+        }
+    }
+
+    private int addPrintServiceToList(ArrayList<PrintService> printerList, PrintService ps) {
+        int index = printerList.indexOf(ps);
+        // Check if PrintService with same name is already in the list.
+        if (CUPSPrinter.isCupsRunning() && index != -1) {
+            // Bug in Linux: Duplicate entry of a remote printer
+            // and treats it as local printer but it is returning wrong
+            // information when queried using IPP. Workaround is to remove it.
+            // Even CUPS ignores these entries as shown in lpstat or using
+            // their web configuration.
+            PrinterURI uri = ps.getAttribute(PrinterURI.class);
+            if (uri.getURI().getHost().equals("localhost")) {
+                IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, ignoring the new local printer: "+ps);
+                return index;  // Do not add this.
+            }
+            PrintService oldPS = printerList.get(index);
+            uri = oldPS.getAttribute(PrinterURI.class);
+            if (uri.getURI().getHost().equals("localhost")) {
+                IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, removing existing local printer: "+oldPS);
+                printerList.remove(oldPS);
+            } else {
+                return index;
+            }
+        }
+        printerList.add(ps);
+        return (printerList.size() - 1);
+    }
+
+
+    // refreshes "printServices"
+    public synchronized void refreshServices() {
+        /* excludes the default printer */
+        String[] printers = null; // array of printer names
+        String[] printerURIs = null; //array of printer URIs
+
+        try {
+            getDefaultPrintService();
+        } catch (Throwable t) {
+            IPPPrintService.debug_println(debugPrefix+
+              "Exception getting default printer : " + t);
+        }
+        if (CUPSPrinter.isCupsRunning()) {
+            try {
+                printerURIs = CUPSPrinter.getAllPrinters();
+                IPPPrintService.debug_println("CUPS URIs = " + printerURIs);
+                if (printerURIs != null) {
+                    for (int p = 0; p < printerURIs.length; p++) {
+                       IPPPrintService.debug_println("URI="+printerURIs[p]);
+                    }
+                }
+            } catch (Throwable t) {
+            IPPPrintService.debug_println(debugPrefix+
+              "Exception getting all CUPS printers : " + t);
+            }
+            if ((printerURIs != null) && (printerURIs.length > 0)) {
+                printers = new String[printerURIs.length];
+                for (int i=0; i<printerURIs.length; i++) {
+                    int lastIndex = printerURIs[i].lastIndexOf("/");
+                    printers[i] = printerURIs[i].substring(lastIndex+1);
+                }
+            }
+        } else {
+            if (isMac() || isSysV()) {
+                printers = getAllPrinterNamesSysV();
+            } else if (isAIX()) {
+                printers = getAllPrinterNamesAIX();
+            } else { //BSD
+                printers = getAllPrinterNamesBSD();
+            }
+        }
+
+        if (printers == null) {
+            if (defaultPrintService != null) {
+                printServices = new PrintService[1];
+                printServices[0] = defaultPrintService;
+            } else {
+                printServices = null;
+            }
+            return;
+        }
+
+        ArrayList<PrintService> printerList = new ArrayList<>();
+        int defaultIndex = -1;
+        for (int p=0; p<printers.length; p++) {
+            if (printers[p] == null) {
+                continue;
+            }
+            if ((defaultPrintService != null)
+                && printers[p].equals(getPrinterDestName(defaultPrintService))) {
+                defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
+            } else {
+                if (printServices == null) {
+                    IPPPrintService.debug_println(debugPrefix+
+                                                  "total# of printers = "+printers.length);
+
+                    if (CUPSPrinter.isCupsRunning()) {
+                        try {
+                            addPrintServiceToList(printerList,
+                                                  new IPPPrintService(printers[p],
+                                                                   printerURIs[p],
+                                                                   true));
+                        } catch (Exception e) {
+                            IPPPrintService.debug_println(debugPrefix+
+                                                          " getAllPrinters Exception "+
+                                                          e);
+
+                        }
+                    } else {
+                        printerList.add(new UnixPrintService(printers[p]));
+                    }
+                } else {
+                    int j;
+                    for (j=0; j<printServices.length; j++) {
+                        if (printServices[j] != null) {
+                            if (printers[p].equals(getPrinterDestName(printServices[j]))) {
+                                printerList.add(printServices[j]);
+                                printServices[j] = null;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (j == printServices.length) {      // not found?
+                        if (CUPSPrinter.isCupsRunning()) {
+                            try {
+                                addPrintServiceToList(printerList,
+                                             new IPPPrintService(printers[p],
+                                                                 printerURIs[p],
+                                                                 true));
+                            } catch (Exception e) {
+                                IPPPrintService.debug_println(debugPrefix+
+                                                              " getAllPrinters Exception "+
+                                                              e);
+
+                            }
+                        } else {
+                            printerList.add(new UnixPrintService(printers[p]));
+                        }
+                    }
+                }
+            }
+        }
+
+        // Look for deleted services and invalidate these
+        if (printServices != null) {
+            for (int j=0; j < printServices.length; j++) {
+                if ((printServices[j] instanceof UnixPrintService) &&
+                    (!printServices[j].equals(defaultPrintService))) {
+                    ((UnixPrintService)printServices[j]).invalidateService();
+                }
+            }
+        }
+
+        //if defaultService is not found in printerList
+        if (defaultIndex == -1 && defaultPrintService != null) {
+            defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
+        }
+
+        printServices = printerList.toArray(new PrintService[] {});
+
+        // swap default with the first in the list
+        if (defaultIndex > 0) {
+            PrintService saveService = printServices[0];
+            printServices[0] = printServices[defaultIndex];
+            printServices[defaultIndex] = saveService;
+        }
+    }
+
+    private boolean matchesAttributes(PrintService service,
+                                      PrintServiceAttributeSet attributes) {
+
+        Attribute [] attrs =  attributes.toArray();
+        for (int i=0; i<attrs.length; i++) {
+            @SuppressWarnings("unchecked")
+            Attribute serviceAttr
+                = service.getAttribute((Class<PrintServiceAttribute>)attrs[i].getCategory());
+            if (serviceAttr == null || !serviceAttr.equals(attrs[i])) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+      /* This checks for validity of the printer name before passing as
+       * parameter to a shell command.
+       */
+      private boolean checkPrinterName(String s) {
+        char c;
+
+        for (int i=0; i < s.length(); i++) {
+          c = s.charAt(i);
+          if (Character.isLetterOrDigit(c) ||
+              c == '-' || c == '_' || c == '.' || c == '/') {
+            continue;
+          } else {
+            return false;
+          }
+        }
+        return true;
+      }
+
+    /*
+     * Gets the printer name compatible with the list of printers returned by
+     * the system when we query default or all the available printers.
+     */
+    private String getPrinterDestName(PrintService ps) {
+        if (isMac()) {
+            return ((IPPPrintService)ps).getDest();
+        }
+        return ps.getName();
+    }
+
+    /* On a network with many (hundreds) of network printers, it
+     * can save several seconds if you know all you want is a particular
+     * printer, to ask for that printer rather than retrieving all printers.
+     */
+    private PrintService getServiceByName(PrinterName nameAttr) {
+        String name = nameAttr.getValue();
+        if (name == null || name.equals("") || !checkPrinterName(name)) {
+            return null;
+        }
+        /* check if all printers are already available */
+        if (printServices != null) {
+            for (PrintService printService : printServices) {
+                PrinterName printerName = printService.getAttribute(PrinterName.class);
+                if (printerName.getValue().equals(name)) {
+                    return printService;
+                }
+            }
+        }
+        /* take CUPS into account first */
+        if (CUPSPrinter.isCupsRunning()) {
+            try {
+                return new IPPPrintService(name,
+                                           new URL("http://"+
+                                                   CUPSPrinter.getServer()+":"+
+                                                   CUPSPrinter.getPort()+"/"+
+                                                   name));
+            } catch (Exception e) {
+                IPPPrintService.debug_println(debugPrefix+
+                                              " getServiceByName Exception "+
+                                              e);
+            }
+        }
+        /* fallback if nothing not having a printer at this point */
+        PrintService printer = null;
+        if (isMac() || isSysV()) {
+            printer = getNamedPrinterNameSysV(name);
+        } else if (isAIX()) {
+            printer = getNamedPrinterNameAIX(name);
+        } else {
+            printer = getNamedPrinterNameBSD(name);
+        }
+        return printer;
+    }
+
+    private PrintService[]
+        getPrintServices(PrintServiceAttributeSet serviceSet) {
+
+        if (serviceSet == null || serviceSet.isEmpty()) {
+            return getPrintServices();
+        }
+
+        /* Typically expect that if a service attribute is specified that
+         * its a printer name and there ought to be only one match.
+         * Directly retrieve that service and confirm
+         * that it meets the other requirements.
+         * If printer name isn't mentioned then go a slow path checking
+         * all printers if they meet the reqiremements.
+         */
+        PrintService[] services;
+        PrinterName name = (PrinterName)serviceSet.get(PrinterName.class);
+        PrintService defService;
+        if (name != null && (defService = getDefaultPrintService()) != null) {
+            /* To avoid execing a unix command  see if the client is asking
+             * for the default printer by name, since we already have that
+             * initialised.
+             */
+
+            PrinterName defName = defService.getAttribute(PrinterName.class);
+
+            if (defName != null && name.equals(defName)) {
+                if (matchesAttributes(defService, serviceSet)) {
+                    services = new PrintService[1];
+                    services[0] = defService;
+                    return services;
+                } else {
+                    return new PrintService[0];
+                }
+            } else {
+                /* Its not the default service */
+                PrintService service = getServiceByName(name);
+                if (service != null &&
+                    matchesAttributes(service, serviceSet)) {
+                    services = new PrintService[1];
+                    services[0] = service;
+                    return services;
+                } else {
+                    return new PrintService[0];
+                }
+            }
+        } else {
+            /* specified service attributes don't include a name.*/
+            Vector<PrintService> matchedServices = new Vector<>();
+            services = getPrintServices();
+            for (int i = 0; i< services.length; i++) {
+                if (matchesAttributes(services[i], serviceSet)) {
+                    matchedServices.add(services[i]);
+                }
+            }
+            services = new PrintService[matchedServices.size()];
+            for (int i = 0; i< services.length; i++) {
+                services[i] = matchedServices.elementAt(i);
+            }
+            return services;
+        }
+    }
+
+    /*
+     * If service attributes are specified then there must be additional
+     * filtering.
+     */
+    public PrintService[] getPrintServices(DocFlavor flavor,
+                                           AttributeSet attributes) {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+          security.checkPrintJobAccess();
+        }
+        PrintRequestAttributeSet requestSet = null;
+        PrintServiceAttributeSet serviceSet = null;
+
+        if (attributes != null && !attributes.isEmpty()) {
+
+            requestSet = new HashPrintRequestAttributeSet();
+            serviceSet = new HashPrintServiceAttributeSet();
+
+            Attribute[] attrs = attributes.toArray();
+            for (int i=0; i<attrs.length; i++) {
+                if (attrs[i] instanceof PrintRequestAttribute) {
+                    requestSet.add(attrs[i]);
+                } else if (attrs[i] instanceof PrintServiceAttribute) {
+                    serviceSet.add(attrs[i]);
+                }
+            }
+        }
+
+        PrintService[] services = getPrintServices(serviceSet);
+        if (services.length == 0) {
+            return services;
+        }
+
+        if (CUPSPrinter.isCupsRunning()) {
+            ArrayList<PrintService> matchingServices = new ArrayList<>();
+            for (int i=0; i<services.length; i++) {
+                try {
+                    if (services[i].
+                        getUnsupportedAttributes(flavor, requestSet) == null) {
+                        matchingServices.add(services[i]);
+                    }
+                } catch (IllegalArgumentException e) {
+                }
+            }
+            services = new PrintService[matchingServices.size()];
+            return matchingServices.toArray(services);
+
+        } else {
+            // We only need to compare 1 PrintService because all
+            // UnixPrintServices are the same anyway.  We will not use
+            // default PrintService because it might be null.
+            PrintService service = services[0];
+            if ((flavor == null ||
+                 service.isDocFlavorSupported(flavor)) &&
+                 service.getUnsupportedAttributes(flavor, requestSet) == null)
+            {
+                return services;
+            } else {
+                return new PrintService[0];
+            }
+        }
+    }
+
+    /*
+     * return empty array as don't support multi docs
+     */
+    public MultiDocPrintService[]
+        getMultiDocPrintServices(DocFlavor[] flavors,
+                                 AttributeSet attributes) {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+          security.checkPrintJobAccess();
+        }
+        return new MultiDocPrintService[0];
+    }
+
+
+    public synchronized PrintService getDefaultPrintService() {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+          security.checkPrintJobAccess();
+        }
+
+        // clear defaultPrintService
+        defaultPrintService = null;
+        String psuri = null;
+
+        IPPPrintService.debug_println("isRunning ? "+
+                                      (CUPSPrinter.isCupsRunning()));
+        if (CUPSPrinter.isCupsRunning()) {
+            String[] printerInfo = CUPSPrinter.getDefaultPrinter();
+            if (printerInfo != null && printerInfo.length >= 2) {
+                defaultPrinter = printerInfo[0];
+                psuri = printerInfo[1];
+            }
+        } else {
+            if (isMac() || isSysV()) {
+                defaultPrinter = getDefaultPrinterNameSysV();
+            } else if (isAIX()) {
+                defaultPrinter = getDefaultPrinterNameAIX();
+            } else {
+                defaultPrinter = getDefaultPrinterNameBSD();
+            }
+        }
+        if (defaultPrinter == null) {
+            return null;
+        }
+        defaultPrintService = null;
+        if (printServices != null) {
+            for (int j=0; j<printServices.length; j++) {
+                if (defaultPrinter.equals(getPrinterDestName(printServices[j]))) {
+                    defaultPrintService = printServices[j];
+                    break;
+                }
+            }
+        }
+        if (defaultPrintService == null) {
+            if (CUPSPrinter.isCupsRunning()) {
+                try {
+                    PrintService defaultPS;
+                    if ((psuri != null) && !psuri.startsWith("file")) {
+                        defaultPS = new IPPPrintService(defaultPrinter,
+                                                        psuri, true);
+                    } else {
+                        defaultPS = new IPPPrintService(defaultPrinter,
+                                            new URL("http://"+
+                                                    CUPSPrinter.getServer()+":"+
+                                                    CUPSPrinter.getPort()+"/"+
+                                                    defaultPrinter));
+                    }
+                    defaultPrintService = defaultPS;
+                } catch (Exception e) {
+                }
+            } else {
+                defaultPrintService = new UnixPrintService(defaultPrinter);
+            }
+        }
+
+        return defaultPrintService;
+    }
+
+    public synchronized void
+        getServicesInbackground(BackgroundLookupListener listener) {
+        if (printServices != null) {
+            listener.notifyServices(printServices);
+        } else {
+            if (lookupListeners == null) {
+                lookupListeners = new Vector<>();
+                lookupListeners.add(listener);
+                Thread lookupThread = new Thread(this);
+                lookupThread.start();
+            } else {
+                lookupListeners.add(listener);
+            }
+        }
+    }
+
+    /* This method isn't used in most cases because we rely on code in
+     * javax.print.PrintServiceLookup. This is needed just for the cases
+     * where those interfaces are by-passed.
+     */
+    private PrintService[] copyOf(PrintService[] inArr) {
+        if (inArr == null || inArr.length == 0) {
+            return inArr;
+        } else {
+            PrintService []outArr = new PrintService[inArr.length];
+            System.arraycopy(inArr, 0, outArr, 0, inArr.length);
+            return outArr;
+        }
+    }
+
+    public void run() {
+        PrintService[] services = getPrintServices();
+        synchronized (this) {
+            BackgroundLookupListener listener;
+            for (int i=0; i<lookupListeners.size(); i++) {
+                listener = lookupListeners.elementAt(i);
+                listener.notifyServices(copyOf(services));
+            }
+            lookupListeners = null;
+        }
+    }
+
+    private String getDefaultPrinterNameBSD() {
+        if (cmdIndex == UNINITIALIZED) {
+            cmdIndex = getBSDCommandIndex();
+        }
+        String[] names = execCmd(lpcFirstCom[cmdIndex]);
+        if (names == null || names.length == 0) {
+            return null;
+        }
+
+        if ((cmdIndex==BSD_LPD_NG) &&
+            (names[0].startsWith("missingprinter"))) {
+            return null;
+        }
+        return names[0];
+    }
+
+    private PrintService getNamedPrinterNameBSD(String name) {
+      if (cmdIndex == UNINITIALIZED) {
+        cmdIndex = getBSDCommandIndex();
+      }
+      String command = "/usr/sbin/lpc status " + name + lpcNameCom[cmdIndex];
+      String[] result = execCmd(command);
+
+      if (result == null || !(result[0].equals(name))) {
+          return null;
+      }
+      return new UnixPrintService(name);
+    }
+
+    private String[] getAllPrinterNamesBSD() {
+        if (cmdIndex == UNINITIALIZED) {
+            cmdIndex = getBSDCommandIndex();
+        }
+        String[] names = execCmd(lpcAllCom[cmdIndex]);
+        if (names == null || names.length == 0) {
+          return null;
+        }
+        return names;
+    }
+
+    static String getDefaultPrinterNameSysV() {
+        String defaultPrinter = "lp";
+        String command = "/usr/bin/lpstat -d";
+
+        String [] names = execCmd(command);
+        if (names == null || names.length == 0) {
+            return defaultPrinter;
+        } else {
+            int index = names[0].indexOf(":");
+            if (index == -1  || (names[0].length() <= index+1)) {
+                return null;
+            } else {
+                String name = names[0].substring(index+1).trim();
+                if (name.length() == 0) {
+                    return null;
+                } else {
+                    return name;
+                }
+            }
+        }
+    }
+
+    private PrintService getNamedPrinterNameSysV(String name) {
+
+        String command = "/usr/bin/lpstat -v " + name;
+        String []result = execCmd(command);
+
+        if (result == null || result[0].indexOf("unknown printer") > 0) {
+            return null;
+        } else {
+            return new UnixPrintService(name);
+        }
+    }
+
+    private String[] getAllPrinterNamesSysV() {
+        String defaultPrinter = "lp";
+        String command = "/usr/bin/lpstat -v|/usr/bin/expand|/usr/bin/cut -f3 -d' ' |/usr/bin/cut -f1 -d':' | /usr/bin/sort";
+
+        String [] names = execCmd(command);
+        ArrayList<String> printerNames = new ArrayList<>();
+        for (int i=0; i < names.length; i++) {
+            if (!names[i].equals("_default") &&
+                !names[i].equals(defaultPrinter) &&
+                !names[i].equals("")) {
+                printerNames.add(names[i]);
+            }
+        }
+        return printerNames.toArray(new String[printerNames.size()]);
+    }
+
+    private String getDefaultPrinterNameAIX() {
+        String[] names = execCmd(lpNameComAix[aix_lpstat_d]);
+        // Remove headers and bogus entries added by remote printers.
+        names = UnixPrintService.filterPrinterNamesAIX(names);
+        if (names == null || names.length != 1) {
+            // No default printer found
+            return null;
+        } else {
+            return names[0];
+        }
+    }
+
+    private PrintService getNamedPrinterNameAIX(String name) {
+        // On AIX there should be no blank after '-v'.
+        String[] result = execCmd(lpNameComAix[aix_lpstat_v] + name);
+        // Remove headers and bogus entries added by remote printers.
+        result = UnixPrintService.filterPrinterNamesAIX(result);
+        if (result == null || result.length != 1) {
+            return null;
+        } else {
+            return new UnixPrintService(name);
+        }
+    }
+
+    private String[] getAllPrinterNamesAIX() {
+        // Determine all printers of the system.
+        String [] names = execCmd(lpNameComAix[aix_defaultPrinterEnumeration]);
+
+        // Remove headers and bogus entries added by remote printers.
+        names = UnixPrintService.filterPrinterNamesAIX(names);
+
+        ArrayList<String> printerNames = new ArrayList<String>();
+        for ( int i=0; i < names.length; i++) {
+            printerNames.add(names[i]);
+        }
+        return printerNames.toArray(new String[printerNames.size()]);
+    }
+
+    static String[] execCmd(final String command) {
+        ArrayList<String> results = null;
+        try {
+            final String[] cmd = new String[3];
+            if (isSysV() || isAIX()) {
+                cmd[0] = "/usr/bin/sh";
+                cmd[1] = "-c";
+                cmd[2] = "env LC_ALL=C " + command;
+            } else {
+                cmd[0] = "/bin/sh";
+                cmd[1] = "-c";
+                cmd[2] = "LC_ALL=C " + command;
+            }
+
+            results = AccessController.doPrivileged(
+                new PrivilegedExceptionAction<ArrayList<String>>() {
+                    public ArrayList<String> run() throws IOException {
+
+                        Process proc;
+                        BufferedReader bufferedReader = null;
+                        File f = Files.createTempFile("prn","xc").toFile();
+                        cmd[2] = cmd[2]+">"+f.getAbsolutePath();
+
+                        proc = Runtime.getRuntime().exec(cmd);
+                        try {
+                            boolean done = false; // in case of interrupt.
+                            while (!done) {
+                                try {
+                                    proc.waitFor();
+                                    done = true;
+                                } catch (InterruptedException e) {
+                                }
+                            }
+
+                            if (proc.exitValue() == 0) {
+                                FileReader reader = new FileReader(f);
+                                bufferedReader = new BufferedReader(reader);
+                                String line;
+                                ArrayList<String> results = new ArrayList<>();
+                                while ((line = bufferedReader.readLine())
+                                       != null) {
+                                    results.add(line);
+                                }
+                                return results;
+                            }
+                        } finally {
+                            f.delete();
+                            // promptly close all streams.
+                            if (bufferedReader != null) {
+                                bufferedReader.close();
+                            }
+                            proc.getInputStream().close();
+                            proc.getErrorStream().close();
+                            proc.getOutputStream().close();
+                        }
+                        return null;
+                    }
+                });
+        } catch (PrivilegedActionException e) {
+        }
+        if (results == null) {
+            return new String[0];
+        } else {
+            return results.toArray(new String[results.size()]);
+        }
+    }
+
+    private class PrinterChangeListener extends Thread {
+
+        public void run() {
+            int refreshSecs;
+            while (true) {
+                try {
+                    refreshServices();
+                } catch (Exception se) {
+                    IPPPrintService.debug_println(debugPrefix+"Exception in refresh thread.");
+                    break;
+                }
+
+                if ((printServices != null) &&
+                    (printServices.length > minRefreshTime)) {
+                    // compute new refresh time 1 printer = 1 sec
+                    refreshSecs = printServices.length;
+                } else {
+                    refreshSecs = minRefreshTime;
+                }
+                try {
+                    sleep(refreshSecs * 1000);
+                } catch (InterruptedException e) {
+                    break;
+                }
+            }
+        }
+    }
+}
--- a/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintJob.java	Wed Jul 05 20:06:12 2017 +0200
@@ -122,7 +122,7 @@
     UnixPrintJob(PrintService service) {
         this.service = service;
         mDestination = service.getName();
-        if (UnixPrintServiceLookup.isMac()) {
+        if (PrintServiceLookupProvider.isMac()) {
             mDestination = ((IPPPrintService)service).getDest();
         }
         mDestType = UnixPrintJob.DESTPRINTER;
@@ -880,7 +880,7 @@
             pFlags |= NOSHEET;
             ncomps+=1;
         }
-        if (UnixPrintServiceLookup.osname.equals("SunOS")) {
+        if (PrintServiceLookupProvider.osname.equals("SunOS")) {
             ncomps+=1; // lp uses 1 more arg than lpr (make a copy)
             execCmd = new String[ncomps];
             execCmd[n++] = "/usr/bin/lp";
--- a/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintService.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintService.java	Wed Jul 05 20:06:12 2017 +0200
@@ -220,7 +220,7 @@
 
     private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsSysV() {
         String command = "/usr/bin/lpstat -a " + printer;
-        String results[]= UnixPrintServiceLookup.execCmd(command);
+        String results[]= PrintServiceLookupProvider.execCmd(command);
 
         if (results != null && results.length > 0) {
             if (results[0].startsWith(printer + " accepting requests")) {
@@ -244,20 +244,20 @@
     }
 
     private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsBSD() {
-        if (UnixPrintServiceLookup.cmdIndex ==
-            UnixPrintServiceLookup.UNINITIALIZED) {
+        if (PrintServiceLookupProvider.cmdIndex ==
+            PrintServiceLookupProvider.UNINITIALIZED) {
 
-            UnixPrintServiceLookup.cmdIndex =
-                UnixPrintServiceLookup.getBSDCommandIndex();
+            PrintServiceLookupProvider.cmdIndex =
+                PrintServiceLookupProvider.getBSDCommandIndex();
         }
 
         String command = "/usr/sbin/lpc status " + printer
-            + lpcStatusCom[UnixPrintServiceLookup.cmdIndex];
-        String results[]= UnixPrintServiceLookup.execCmd(command);
+            + lpcStatusCom[PrintServiceLookupProvider.cmdIndex];
+        String results[]= PrintServiceLookupProvider.execCmd(command);
 
         if (results != null && results.length > 0) {
-            if (UnixPrintServiceLookup.cmdIndex ==
-                UnixPrintServiceLookup.BSD_LPD_NG) {
+            if (PrintServiceLookupProvider.cmdIndex ==
+                PrintServiceLookupProvider.BSD_LPD_NG) {
                 if (results[0].startsWith("enabled enabled")) {
                     return PrinterIsAcceptingJobs.ACCEPTING_JOBS ;
                 }
@@ -276,7 +276,7 @@
 
     // Filter the list of possible AIX Printers and remove header lines
     // and extra lines which have been added for remote printers.
-    // 'protected' because this method is also used from UnixPrintServiceLookup.
+    // 'protected' because this method is also used from PrintServiceLookupProvider.
     protected static String[] filterPrinterNamesAIX(String[] posPrinters) {
         ArrayList<String> printers = new ArrayList<>();
         String [] splitPart;
@@ -301,7 +301,7 @@
     private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsAIX() {
         // On AIX there should not be a blank after '-a'.
         String command = "/usr/bin/lpstat -a" + printer;
-        String results[]= UnixPrintServiceLookup.execCmd(command);
+        String results[]= PrintServiceLookupProvider.execCmd(command);
 
         // Remove headers and bogus entries added by remote printers.
         results = filterPrinterNamesAIX(results);
@@ -320,11 +320,11 @@
     }
 
     private PrinterIsAcceptingJobs getPrinterIsAcceptingJobs() {
-        if (UnixPrintServiceLookup.isSysV()) {
+        if (PrintServiceLookupProvider.isSysV()) {
             return getPrinterIsAcceptingJobsSysV();
-        } else if (UnixPrintServiceLookup.isBSD()) {
+        } else if (PrintServiceLookupProvider.isBSD()) {
             return getPrinterIsAcceptingJobsBSD();
-        } else if (UnixPrintServiceLookup.isAIX()) {
+        } else if (PrintServiceLookupProvider.isAIX()) {
             return getPrinterIsAcceptingJobsAIX();
         } else {
             return PrinterIsAcceptingJobs.ACCEPTING_JOBS;
@@ -351,29 +351,29 @@
 
     private QueuedJobCount getQueuedJobCountSysV() {
         String command = "/usr/bin/lpstat -R " + printer;
-        String results[]= UnixPrintServiceLookup.execCmd(command);
+        String results[]= PrintServiceLookupProvider.execCmd(command);
         int qlen = (results == null) ? 0 : results.length;
 
         return new QueuedJobCount(qlen);
     }
 
     private QueuedJobCount getQueuedJobCountBSD() {
-        if (UnixPrintServiceLookup.cmdIndex ==
-            UnixPrintServiceLookup.UNINITIALIZED) {
+        if (PrintServiceLookupProvider.cmdIndex ==
+            PrintServiceLookupProvider.UNINITIALIZED) {
 
-            UnixPrintServiceLookup.cmdIndex =
-                UnixPrintServiceLookup.getBSDCommandIndex();
+            PrintServiceLookupProvider.cmdIndex =
+                PrintServiceLookupProvider.getBSDCommandIndex();
         }
 
         int qlen = 0;
         String command = "/usr/sbin/lpc status " + printer
-            + lpcQueueCom[UnixPrintServiceLookup.cmdIndex];
-        String results[] = UnixPrintServiceLookup.execCmd(command);
+            + lpcQueueCom[PrintServiceLookupProvider.cmdIndex];
+        String results[] = PrintServiceLookupProvider.execCmd(command);
 
         if (results != null && results.length > 0) {
             String queued;
-            if (UnixPrintServiceLookup.cmdIndex ==
-                UnixPrintServiceLookup.BSD_LPD_NG) {
+            if (PrintServiceLookupProvider.cmdIndex ==
+                PrintServiceLookupProvider.BSD_LPD_NG) {
                 queued = results[0];
             } else {
                 queued = results[3].trim();
@@ -396,7 +396,7 @@
     private QueuedJobCount getQueuedJobCountAIX() {
         // On AIX there should not be a blank after '-a'.
         String command = "/usr/bin/lpstat -a" + printer;
-        String results[]=  UnixPrintServiceLookup.execCmd(command);
+        String results[]=  PrintServiceLookupProvider.execCmd(command);
 
         // Remove headers and bogus entries added by remote printers.
         results = filterPrinterNamesAIX(results);
@@ -413,11 +413,11 @@
     }
 
     private QueuedJobCount getQueuedJobCount() {
-        if (UnixPrintServiceLookup.isSysV()) {
+        if (PrintServiceLookupProvider.isSysV()) {
             return getQueuedJobCountSysV();
-        } else if (UnixPrintServiceLookup.isBSD()) {
+        } else if (PrintServiceLookupProvider.isBSD()) {
             return getQueuedJobCountBSD();
-        } else if (UnixPrintServiceLookup.isAIX()) {
+        } else if (PrintServiceLookupProvider.isAIX()) {
             return getQueuedJobCountAIX();
         } else {
             return new QueuedJobCount(0);
@@ -468,9 +468,9 @@
     }
 
     private PrintServiceAttributeSet getDynamicAttributes() {
-        if (UnixPrintServiceLookup.isSysV()) {
+        if (PrintServiceLookupProvider.isSysV()) {
             return getSysVServiceAttributes();
-        } else if (UnixPrintServiceLookup.isAIX()) {
+        } else if (PrintServiceLookupProvider.isAIX()) {
             return getAIXServiceAttributes();
         } else {
             return getBSDServiceAttributes();
--- a/jdk/src/java.desktop/unix/classes/sun/print/UnixPrintServiceLookup.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,964 +0,0 @@
-/*
- * Copyright (c) 2000, 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.  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.print;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Vector;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import javax.print.DocFlavor;
-import javax.print.MultiDocPrintService;
-import javax.print.PrintService;
-import javax.print.PrintServiceLookup;
-import javax.print.attribute.Attribute;
-import javax.print.attribute.AttributeSet;
-import javax.print.attribute.HashPrintRequestAttributeSet;
-import javax.print.attribute.HashPrintServiceAttributeSet;
-import javax.print.attribute.PrintRequestAttribute;
-import javax.print.attribute.PrintRequestAttributeSet;
-import javax.print.attribute.PrintServiceAttribute;
-import javax.print.attribute.PrintServiceAttributeSet;
-import javax.print.attribute.standard.PrinterName;
-import javax.print.attribute.standard.PrinterURI;
-import java.io.File;
-import java.io.FileReader;
-import java.net.URL;
-import java.nio.file.Files;
-
-/*
- * Remind: This class uses solaris commands. We also need a linux
- * version
- */
-public class UnixPrintServiceLookup extends PrintServiceLookup
-    implements BackgroundServiceLookup, Runnable {
-
-    /* Remind: the current implementation is static, as its assumed
-     * its preferable to minimize creation of PrintService instances.
-     * Later we should add logic to add/remove services on the fly which
-     * will take a hit of needing to regather the list of services.
-     */
-    private String defaultPrinter;
-    private PrintService defaultPrintService;
-    private PrintService[] printServices; /* includes the default printer */
-    private Vector<BackgroundLookupListener> lookupListeners = null;
-    private static String debugPrefix = "UnixPrintServiceLookup>> ";
-    private static boolean pollServices = true;
-    private static final int DEFAULT_MINREFRESH = 120;  // 2 minutes
-    private static int minRefreshTime = DEFAULT_MINREFRESH;
-
-
-    static String osname;
-
-    // List of commands used to deal with the printer queues on AIX
-    String[] lpNameComAix = {
-      "/usr/bin/lsallq",
-      "/usr/bin/lpstat -W -p|/usr/bin/expand|/usr/bin/cut -f1 -d' '",
-      "/usr/bin/lpstat -W -d|/usr/bin/expand|/usr/bin/cut -f1 -d' '",
-      "/usr/bin/lpstat -W -v"
-    };
-    private static final int aix_lsallq = 0;
-    private static final int aix_lpstat_p = 1;
-    private static final int aix_lpstat_d = 2;
-    private static final int aix_lpstat_v = 3;
-    private static int aix_defaultPrinterEnumeration = aix_lsallq;
-
-    static {
-        /* The system property "sun.java2d.print.polling"
-         * can be used to force the printing code to poll or not poll
-         * for PrintServices.
-         */
-        String pollStr = java.security.AccessController.doPrivileged(
-            new sun.security.action.GetPropertyAction("sun.java2d.print.polling"));
-
-        if (pollStr != null) {
-            if (pollStr.equalsIgnoreCase("true")) {
-                pollServices = true;
-            } else if (pollStr.equalsIgnoreCase("false")) {
-                pollServices = false;
-            }
-        }
-
-        /* The system property "sun.java2d.print.minRefreshTime"
-         * can be used to specify minimum refresh time (in seconds)
-         * for polling PrintServices.  The default is 120.
-         */
-        String refreshTimeStr = java.security.AccessController.doPrivileged(
-            new sun.security.action.GetPropertyAction(
-                "sun.java2d.print.minRefreshTime"));
-
-        if (refreshTimeStr != null) {
-            try {
-                minRefreshTime = (new Integer(refreshTimeStr)).intValue();
-            } catch (NumberFormatException e) {
-            }
-            if (minRefreshTime < DEFAULT_MINREFRESH) {
-                minRefreshTime = DEFAULT_MINREFRESH;
-            }
-        }
-
-        osname = java.security.AccessController.doPrivileged(
-            new sun.security.action.GetPropertyAction("os.name"));
-
-        /* The system property "sun.java2d.print.aix.lpstat"
-         * can be used to force the usage of 'lpstat -p' to enumerate all
-         * printer queues. By default we use 'lsallq', because 'lpstat -p' can
-         * take lots of time if thousands of printers are attached to a server.
-         */
-        if (isAIX()) {
-            String aixPrinterEnumerator = java.security.AccessController.doPrivileged(
-                new sun.security.action.GetPropertyAction("sun.java2d.print.aix.lpstat"));
-
-            if (aixPrinterEnumerator != null) {
-                if (aixPrinterEnumerator.equalsIgnoreCase("lpstat")) {
-                    aix_defaultPrinterEnumeration = aix_lpstat_p;
-                } else if (aixPrinterEnumerator.equalsIgnoreCase("lsallq")) {
-                    aix_defaultPrinterEnumeration = aix_lsallq;
-                }
-            }
-        }
-    }
-
-    static boolean isMac() {
-        return osname.startsWith("Mac");
-    }
-
-    static boolean isSysV() {
-        return osname.equals("SunOS");
-    }
-
-    static boolean isLinux() {
-        return (osname.equals("Linux"));
-    }
-
-    static boolean isBSD() {
-        return (osname.equals("Linux") ||
-                osname.contains("OS X"));
-    }
-
-    static boolean isAIX() {
-        return osname.equals("AIX");
-    }
-
-    static final int UNINITIALIZED = -1;
-    static final int BSD_LPD = 0;
-    static final int BSD_LPD_NG = 1;
-
-    static int cmdIndex = UNINITIALIZED;
-
-    String[] lpcFirstCom = {
-        "/usr/sbin/lpc status | grep : | sed -ne '1,1 s/://p'",
-        "/usr/sbin/lpc status | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
-    };
-
-    String[] lpcAllCom = {
-        "/usr/sbin/lpc status all | grep : | sed -e 's/://'",
-        "/usr/sbin/lpc status all | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}' | sort"
-    };
-
-    String[] lpcNameCom = {
-        "| grep : | sed -ne 's/://p'",
-        "| grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}'"
-    };
-
-
-    static int getBSDCommandIndex() {
-        String command  = "/usr/sbin/lpc status all";
-        String[] names = execCmd(command);
-
-        if ((names == null) || (names.length == 0)) {
-            return BSD_LPD_NG;
-        }
-
-        for (int i=0; i<names.length; i++) {
-            if (names[i].indexOf('@') != -1) {
-                return BSD_LPD_NG;
-            }
-        }
-
-        return BSD_LPD;
-    }
-
-
-    public UnixPrintServiceLookup() {
-        // start the printer listener thread
-        if (pollServices) {
-            PrinterChangeListener thr = new PrinterChangeListener();
-            thr.setDaemon(true);
-            thr.start();
-            IPPPrintService.debug_println(debugPrefix+"polling turned on");
-        }
-    }
-
-    /* Want the PrintService which is default print service to have
-     * equality of reference with the equivalent in list of print services
-     * This isn't required by the API and there's a risk doing this will
-     * lead people to assume its guaranteed.
-     */
-    public synchronized PrintService[] getPrintServices() {
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-            security.checkPrintJobAccess();
-        }
-
-        if (printServices == null || !pollServices) {
-            refreshServices();
-        }
-        if (printServices == null) {
-            return new PrintService[0];
-        } else {
-            return printServices.clone();
-        }
-    }
-
-    private int addPrintServiceToList(ArrayList<PrintService> printerList, PrintService ps) {
-        int index = printerList.indexOf(ps);
-        // Check if PrintService with same name is already in the list.
-        if (CUPSPrinter.isCupsRunning() && index != -1) {
-            // Bug in Linux: Duplicate entry of a remote printer
-            // and treats it as local printer but it is returning wrong
-            // information when queried using IPP. Workaround is to remove it.
-            // Even CUPS ignores these entries as shown in lpstat or using
-            // their web configuration.
-            PrinterURI uri = ps.getAttribute(PrinterURI.class);
-            if (uri.getURI().getHost().equals("localhost")) {
-                IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, ignoring the new local printer: "+ps);
-                return index;  // Do not add this.
-            }
-            PrintService oldPS = printerList.get(index);
-            uri = oldPS.getAttribute(PrinterURI.class);
-            if (uri.getURI().getHost().equals("localhost")) {
-                IPPPrintService.debug_println(debugPrefix+"duplicate PrintService, removing existing local printer: "+oldPS);
-                printerList.remove(oldPS);
-            } else {
-                return index;
-            }
-        }
-        printerList.add(ps);
-        return (printerList.size() - 1);
-    }
-
-
-    // refreshes "printServices"
-    public synchronized void refreshServices() {
-        /* excludes the default printer */
-        String[] printers = null; // array of printer names
-        String[] printerURIs = null; //array of printer URIs
-
-        try {
-            getDefaultPrintService();
-        } catch (Throwable t) {
-            IPPPrintService.debug_println(debugPrefix+
-              "Exception getting default printer : " + t);
-        }
-        if (CUPSPrinter.isCupsRunning()) {
-            try {
-                printerURIs = CUPSPrinter.getAllPrinters();
-                IPPPrintService.debug_println("CUPS URIs = " + printerURIs);
-                if (printerURIs != null) {
-                    for (int p = 0; p < printerURIs.length; p++) {
-                       IPPPrintService.debug_println("URI="+printerURIs[p]);
-                    }
-                }
-            } catch (Throwable t) {
-            IPPPrintService.debug_println(debugPrefix+
-              "Exception getting all CUPS printers : " + t);
-            }
-            if ((printerURIs != null) && (printerURIs.length > 0)) {
-                printers = new String[printerURIs.length];
-                for (int i=0; i<printerURIs.length; i++) {
-                    int lastIndex = printerURIs[i].lastIndexOf("/");
-                    printers[i] = printerURIs[i].substring(lastIndex+1);
-                }
-            }
-        } else {
-            if (isMac() || isSysV()) {
-                printers = getAllPrinterNamesSysV();
-            } else if (isAIX()) {
-                printers = getAllPrinterNamesAIX();
-            } else { //BSD
-                printers = getAllPrinterNamesBSD();
-            }
-        }
-
-        if (printers == null) {
-            if (defaultPrintService != null) {
-                printServices = new PrintService[1];
-                printServices[0] = defaultPrintService;
-            } else {
-                printServices = null;
-            }
-            return;
-        }
-
-        ArrayList<PrintService> printerList = new ArrayList<>();
-        int defaultIndex = -1;
-        for (int p=0; p<printers.length; p++) {
-            if (printers[p] == null) {
-                continue;
-            }
-            if ((defaultPrintService != null)
-                && printers[p].equals(getPrinterDestName(defaultPrintService))) {
-                defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
-            } else {
-                if (printServices == null) {
-                    IPPPrintService.debug_println(debugPrefix+
-                                                  "total# of printers = "+printers.length);
-
-                    if (CUPSPrinter.isCupsRunning()) {
-                        try {
-                            addPrintServiceToList(printerList,
-                                                  new IPPPrintService(printers[p],
-                                                                   printerURIs[p],
-                                                                   true));
-                        } catch (Exception e) {
-                            IPPPrintService.debug_println(debugPrefix+
-                                                          " getAllPrinters Exception "+
-                                                          e);
-
-                        }
-                    } else {
-                        printerList.add(new UnixPrintService(printers[p]));
-                    }
-                } else {
-                    int j;
-                    for (j=0; j<printServices.length; j++) {
-                        if (printServices[j] != null) {
-                            if (printers[p].equals(getPrinterDestName(printServices[j]))) {
-                                printerList.add(printServices[j]);
-                                printServices[j] = null;
-                                break;
-                            }
-                        }
-                    }
-
-                    if (j == printServices.length) {      // not found?
-                        if (CUPSPrinter.isCupsRunning()) {
-                            try {
-                                addPrintServiceToList(printerList,
-                                             new IPPPrintService(printers[p],
-                                                                 printerURIs[p],
-                                                                 true));
-                            } catch (Exception e) {
-                                IPPPrintService.debug_println(debugPrefix+
-                                                              " getAllPrinters Exception "+
-                                                              e);
-
-                            }
-                        } else {
-                            printerList.add(new UnixPrintService(printers[p]));
-                        }
-                    }
-                }
-            }
-        }
-
-        // Look for deleted services and invalidate these
-        if (printServices != null) {
-            for (int j=0; j < printServices.length; j++) {
-                if ((printServices[j] instanceof UnixPrintService) &&
-                    (!printServices[j].equals(defaultPrintService))) {
-                    ((UnixPrintService)printServices[j]).invalidateService();
-                }
-            }
-        }
-
-        //if defaultService is not found in printerList
-        if (defaultIndex == -1 && defaultPrintService != null) {
-            defaultIndex = addPrintServiceToList(printerList, defaultPrintService);
-        }
-
-        printServices = printerList.toArray(new PrintService[] {});
-
-        // swap default with the first in the list
-        if (defaultIndex > 0) {
-            PrintService saveService = printServices[0];
-            printServices[0] = printServices[defaultIndex];
-            printServices[defaultIndex] = saveService;
-        }
-    }
-
-    private boolean matchesAttributes(PrintService service,
-                                      PrintServiceAttributeSet attributes) {
-
-        Attribute [] attrs =  attributes.toArray();
-        for (int i=0; i<attrs.length; i++) {
-            @SuppressWarnings("unchecked")
-            Attribute serviceAttr
-                = service.getAttribute((Class<PrintServiceAttribute>)attrs[i].getCategory());
-            if (serviceAttr == null || !serviceAttr.equals(attrs[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-      /* This checks for validity of the printer name before passing as
-       * parameter to a shell command.
-       */
-      private boolean checkPrinterName(String s) {
-        char c;
-
-        for (int i=0; i < s.length(); i++) {
-          c = s.charAt(i);
-          if (Character.isLetterOrDigit(c) ||
-              c == '-' || c == '_' || c == '.' || c == '/') {
-            continue;
-          } else {
-            return false;
-          }
-        }
-        return true;
-      }
-
-    /*
-     * Gets the printer name compatible with the list of printers returned by
-     * the system when we query default or all the available printers.
-     */
-    private String getPrinterDestName(PrintService ps) {
-        if (isMac()) {
-            return ((IPPPrintService)ps).getDest();
-        }
-        return ps.getName();
-    }
-
-    /* On a network with many (hundreds) of network printers, it
-     * can save several seconds if you know all you want is a particular
-     * printer, to ask for that printer rather than retrieving all printers.
-     */
-    private PrintService getServiceByName(PrinterName nameAttr) {
-        String name = nameAttr.getValue();
-        if (name == null || name.equals("") || !checkPrinterName(name)) {
-            return null;
-        }
-        /* check if all printers are already available */
-        if (printServices != null) {
-            for (PrintService printService : printServices) {
-                PrinterName printerName = printService.getAttribute(PrinterName.class);
-                if (printerName.getValue().equals(name)) {
-                    return printService;
-                }
-            }
-        }
-        /* take CUPS into account first */
-        if (CUPSPrinter.isCupsRunning()) {
-            try {
-                return new IPPPrintService(name,
-                                           new URL("http://"+
-                                                   CUPSPrinter.getServer()+":"+
-                                                   CUPSPrinter.getPort()+"/"+
-                                                   name));
-            } catch (Exception e) {
-                IPPPrintService.debug_println(debugPrefix+
-                                              " getServiceByName Exception "+
-                                              e);
-            }
-        }
-        /* fallback if nothing not having a printer at this point */
-        PrintService printer = null;
-        if (isMac() || isSysV()) {
-            printer = getNamedPrinterNameSysV(name);
-        } else if (isAIX()) {
-            printer = getNamedPrinterNameAIX(name);
-        } else {
-            printer = getNamedPrinterNameBSD(name);
-        }
-        return printer;
-    }
-
-    private PrintService[]
-        getPrintServices(PrintServiceAttributeSet serviceSet) {
-
-        if (serviceSet == null || serviceSet.isEmpty()) {
-            return getPrintServices();
-        }
-
-        /* Typically expect that if a service attribute is specified that
-         * its a printer name and there ought to be only one match.
-         * Directly retrieve that service and confirm
-         * that it meets the other requirements.
-         * If printer name isn't mentioned then go a slow path checking
-         * all printers if they meet the reqiremements.
-         */
-        PrintService[] services;
-        PrinterName name = (PrinterName)serviceSet.get(PrinterName.class);
-        PrintService defService;
-        if (name != null && (defService = getDefaultPrintService()) != null) {
-            /* To avoid execing a unix command  see if the client is asking
-             * for the default printer by name, since we already have that
-             * initialised.
-             */
-
-            PrinterName defName = defService.getAttribute(PrinterName.class);
-
-            if (defName != null && name.equals(defName)) {
-                if (matchesAttributes(defService, serviceSet)) {
-                    services = new PrintService[1];
-                    services[0] = defService;
-                    return services;
-                } else {
-                    return new PrintService[0];
-                }
-            } else {
-                /* Its not the default service */
-                PrintService service = getServiceByName(name);
-                if (service != null &&
-                    matchesAttributes(service, serviceSet)) {
-                    services = new PrintService[1];
-                    services[0] = service;
-                    return services;
-                } else {
-                    return new PrintService[0];
-                }
-            }
-        } else {
-            /* specified service attributes don't include a name.*/
-            Vector<PrintService> matchedServices = new Vector<>();
-            services = getPrintServices();
-            for (int i = 0; i< services.length; i++) {
-                if (matchesAttributes(services[i], serviceSet)) {
-                    matchedServices.add(services[i]);
-                }
-            }
-            services = new PrintService[matchedServices.size()];
-            for (int i = 0; i< services.length; i++) {
-                services[i] = matchedServices.elementAt(i);
-            }
-            return services;
-        }
-    }
-
-    /*
-     * If service attributes are specified then there must be additional
-     * filtering.
-     */
-    public PrintService[] getPrintServices(DocFlavor flavor,
-                                           AttributeSet attributes) {
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-          security.checkPrintJobAccess();
-        }
-        PrintRequestAttributeSet requestSet = null;
-        PrintServiceAttributeSet serviceSet = null;
-
-        if (attributes != null && !attributes.isEmpty()) {
-
-            requestSet = new HashPrintRequestAttributeSet();
-            serviceSet = new HashPrintServiceAttributeSet();
-
-            Attribute[] attrs = attributes.toArray();
-            for (int i=0; i<attrs.length; i++) {
-                if (attrs[i] instanceof PrintRequestAttribute) {
-                    requestSet.add(attrs[i]);
-                } else if (attrs[i] instanceof PrintServiceAttribute) {
-                    serviceSet.add(attrs[i]);
-                }
-            }
-        }
-
-        PrintService[] services = getPrintServices(serviceSet);
-        if (services.length == 0) {
-            return services;
-        }
-
-        if (CUPSPrinter.isCupsRunning()) {
-            ArrayList<PrintService> matchingServices = new ArrayList<>();
-            for (int i=0; i<services.length; i++) {
-                try {
-                    if (services[i].
-                        getUnsupportedAttributes(flavor, requestSet) == null) {
-                        matchingServices.add(services[i]);
-                    }
-                } catch (IllegalArgumentException e) {
-                }
-            }
-            services = new PrintService[matchingServices.size()];
-            return matchingServices.toArray(services);
-
-        } else {
-            // We only need to compare 1 PrintService because all
-            // UnixPrintServices are the same anyway.  We will not use
-            // default PrintService because it might be null.
-            PrintService service = services[0];
-            if ((flavor == null ||
-                 service.isDocFlavorSupported(flavor)) &&
-                 service.getUnsupportedAttributes(flavor, requestSet) == null)
-            {
-                return services;
-            } else {
-                return new PrintService[0];
-            }
-        }
-    }
-
-    /*
-     * return empty array as don't support multi docs
-     */
-    public MultiDocPrintService[]
-        getMultiDocPrintServices(DocFlavor[] flavors,
-                                 AttributeSet attributes) {
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-          security.checkPrintJobAccess();
-        }
-        return new MultiDocPrintService[0];
-    }
-
-
-    public synchronized PrintService getDefaultPrintService() {
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-          security.checkPrintJobAccess();
-        }
-
-        // clear defaultPrintService
-        defaultPrintService = null;
-        String psuri = null;
-
-        IPPPrintService.debug_println("isRunning ? "+
-                                      (CUPSPrinter.isCupsRunning()));
-        if (CUPSPrinter.isCupsRunning()) {
-            String[] printerInfo = CUPSPrinter.getDefaultPrinter();
-            if (printerInfo != null && printerInfo.length >= 2) {
-                defaultPrinter = printerInfo[0];
-                psuri = printerInfo[1];
-            }
-        } else {
-            if (isMac() || isSysV()) {
-                defaultPrinter = getDefaultPrinterNameSysV();
-            } else if (isAIX()) {
-                defaultPrinter = getDefaultPrinterNameAIX();
-            } else {
-                defaultPrinter = getDefaultPrinterNameBSD();
-            }
-        }
-        if (defaultPrinter == null) {
-            return null;
-        }
-        defaultPrintService = null;
-        if (printServices != null) {
-            for (int j=0; j<printServices.length; j++) {
-                if (defaultPrinter.equals(getPrinterDestName(printServices[j]))) {
-                    defaultPrintService = printServices[j];
-                    break;
-                }
-            }
-        }
-        if (defaultPrintService == null) {
-            if (CUPSPrinter.isCupsRunning()) {
-                try {
-                    PrintService defaultPS;
-                    if ((psuri != null) && !psuri.startsWith("file")) {
-                        defaultPS = new IPPPrintService(defaultPrinter,
-                                                        psuri, true);
-                    } else {
-                        defaultPS = new IPPPrintService(defaultPrinter,
-                                            new URL("http://"+
-                                                    CUPSPrinter.getServer()+":"+
-                                                    CUPSPrinter.getPort()+"/"+
-                                                    defaultPrinter));
-                    }
-                    defaultPrintService = defaultPS;
-                } catch (Exception e) {
-                }
-            } else {
-                defaultPrintService = new UnixPrintService(defaultPrinter);
-            }
-        }
-
-        return defaultPrintService;
-    }
-
-    public synchronized void
-        getServicesInbackground(BackgroundLookupListener listener) {
-        if (printServices != null) {
-            listener.notifyServices(printServices);
-        } else {
-            if (lookupListeners == null) {
-                lookupListeners = new Vector<>();
-                lookupListeners.add(listener);
-                Thread lookupThread = new Thread(this);
-                lookupThread.start();
-            } else {
-                lookupListeners.add(listener);
-            }
-        }
-    }
-
-    /* This method isn't used in most cases because we rely on code in
-     * javax.print.PrintServiceLookup. This is needed just for the cases
-     * where those interfaces are by-passed.
-     */
-    private PrintService[] copyOf(PrintService[] inArr) {
-        if (inArr == null || inArr.length == 0) {
-            return inArr;
-        } else {
-            PrintService []outArr = new PrintService[inArr.length];
-            System.arraycopy(inArr, 0, outArr, 0, inArr.length);
-            return outArr;
-        }
-    }
-
-    public void run() {
-        PrintService[] services = getPrintServices();
-        synchronized (this) {
-            BackgroundLookupListener listener;
-            for (int i=0; i<lookupListeners.size(); i++) {
-                listener = lookupListeners.elementAt(i);
-                listener.notifyServices(copyOf(services));
-            }
-            lookupListeners = null;
-        }
-    }
-
-    private String getDefaultPrinterNameBSD() {
-        if (cmdIndex == UNINITIALIZED) {
-            cmdIndex = getBSDCommandIndex();
-        }
-        String[] names = execCmd(lpcFirstCom[cmdIndex]);
-        if (names == null || names.length == 0) {
-            return null;
-        }
-
-        if ((cmdIndex==BSD_LPD_NG) &&
-            (names[0].startsWith("missingprinter"))) {
-            return null;
-        }
-        return names[0];
-    }
-
-    private PrintService getNamedPrinterNameBSD(String name) {
-      if (cmdIndex == UNINITIALIZED) {
-        cmdIndex = getBSDCommandIndex();
-      }
-      String command = "/usr/sbin/lpc status " + name + lpcNameCom[cmdIndex];
-      String[] result = execCmd(command);
-
-      if (result == null || !(result[0].equals(name))) {
-          return null;
-      }
-      return new UnixPrintService(name);
-    }
-
-    private String[] getAllPrinterNamesBSD() {
-        if (cmdIndex == UNINITIALIZED) {
-            cmdIndex = getBSDCommandIndex();
-        }
-        String[] names = execCmd(lpcAllCom[cmdIndex]);
-        if (names == null || names.length == 0) {
-          return null;
-        }
-        return names;
-    }
-
-    static String getDefaultPrinterNameSysV() {
-        String defaultPrinter = "lp";
-        String command = "/usr/bin/lpstat -d";
-
-        String [] names = execCmd(command);
-        if (names == null || names.length == 0) {
-            return defaultPrinter;
-        } else {
-            int index = names[0].indexOf(":");
-            if (index == -1  || (names[0].length() <= index+1)) {
-                return null;
-            } else {
-                String name = names[0].substring(index+1).trim();
-                if (name.length() == 0) {
-                    return null;
-                } else {
-                    return name;
-                }
-            }
-        }
-    }
-
-    private PrintService getNamedPrinterNameSysV(String name) {
-
-        String command = "/usr/bin/lpstat -v " + name;
-        String []result = execCmd(command);
-
-        if (result == null || result[0].indexOf("unknown printer") > 0) {
-            return null;
-        } else {
-            return new UnixPrintService(name);
-        }
-    }
-
-    private String[] getAllPrinterNamesSysV() {
-        String defaultPrinter = "lp";
-        String command = "/usr/bin/lpstat -v|/usr/bin/expand|/usr/bin/cut -f3 -d' ' |/usr/bin/cut -f1 -d':' | /usr/bin/sort";
-
-        String [] names = execCmd(command);
-        ArrayList<String> printerNames = new ArrayList<>();
-        for (int i=0; i < names.length; i++) {
-            if (!names[i].equals("_default") &&
-                !names[i].equals(defaultPrinter) &&
-                !names[i].equals("")) {
-                printerNames.add(names[i]);
-            }
-        }
-        return printerNames.toArray(new String[printerNames.size()]);
-    }
-
-    private String getDefaultPrinterNameAIX() {
-        String[] names = execCmd(lpNameComAix[aix_lpstat_d]);
-        // Remove headers and bogus entries added by remote printers.
-        names = UnixPrintService.filterPrinterNamesAIX(names);
-        if (names == null || names.length != 1) {
-            // No default printer found
-            return null;
-        } else {
-            return names[0];
-        }
-    }
-
-    private PrintService getNamedPrinterNameAIX(String name) {
-        // On AIX there should be no blank after '-v'.
-        String[] result = execCmd(lpNameComAix[aix_lpstat_v] + name);
-        // Remove headers and bogus entries added by remote printers.
-        result = UnixPrintService.filterPrinterNamesAIX(result);
-        if (result == null || result.length != 1) {
-            return null;
-        } else {
-            return new UnixPrintService(name);
-        }
-    }
-
-    private String[] getAllPrinterNamesAIX() {
-        // Determine all printers of the system.
-        String [] names = execCmd(lpNameComAix[aix_defaultPrinterEnumeration]);
-
-        // Remove headers and bogus entries added by remote printers.
-        names = UnixPrintService.filterPrinterNamesAIX(names);
-
-        ArrayList<String> printerNames = new ArrayList<String>();
-        for ( int i=0; i < names.length; i++) {
-            printerNames.add(names[i]);
-        }
-        return printerNames.toArray(new String[printerNames.size()]);
-    }
-
-    static String[] execCmd(final String command) {
-        ArrayList<String> results = null;
-        try {
-            final String[] cmd = new String[3];
-            if (isSysV() || isAIX()) {
-                cmd[0] = "/usr/bin/sh";
-                cmd[1] = "-c";
-                cmd[2] = "env LC_ALL=C " + command;
-            } else {
-                cmd[0] = "/bin/sh";
-                cmd[1] = "-c";
-                cmd[2] = "LC_ALL=C " + command;
-            }
-
-            results = AccessController.doPrivileged(
-                new PrivilegedExceptionAction<ArrayList<String>>() {
-                    public ArrayList<String> run() throws IOException {
-
-                        Process proc;
-                        BufferedReader bufferedReader = null;
-                        File f = Files.createTempFile("prn","xc").toFile();
-                        cmd[2] = cmd[2]+">"+f.getAbsolutePath();
-
-                        proc = Runtime.getRuntime().exec(cmd);
-                        try {
-                            boolean done = false; // in case of interrupt.
-                            while (!done) {
-                                try {
-                                    proc.waitFor();
-                                    done = true;
-                                } catch (InterruptedException e) {
-                                }
-                            }
-
-                            if (proc.exitValue() == 0) {
-                                FileReader reader = new FileReader(f);
-                                bufferedReader = new BufferedReader(reader);
-                                String line;
-                                ArrayList<String> results = new ArrayList<>();
-                                while ((line = bufferedReader.readLine())
-                                       != null) {
-                                    results.add(line);
-                                }
-                                return results;
-                            }
-                        } finally {
-                            f.delete();
-                            // promptly close all streams.
-                            if (bufferedReader != null) {
-                                bufferedReader.close();
-                            }
-                            proc.getInputStream().close();
-                            proc.getErrorStream().close();
-                            proc.getOutputStream().close();
-                        }
-                        return null;
-                    }
-                });
-        } catch (PrivilegedActionException e) {
-        }
-        if (results == null) {
-            return new String[0];
-        } else {
-            return results.toArray(new String[results.size()]);
-        }
-    }
-
-    private class PrinterChangeListener extends Thread {
-
-        public void run() {
-            int refreshSecs;
-            while (true) {
-                try {
-                    refreshServices();
-                } catch (Exception se) {
-                    IPPPrintService.debug_println(debugPrefix+"Exception in refresh thread.");
-                    break;
-                }
-
-                if ((printServices != null) &&
-                    (printServices.length > minRefreshTime)) {
-                    // compute new refresh time 1 printer = 1 sec
-                    refreshSecs = printServices.length;
-                } else {
-                    refreshSecs = minRefreshTime;
-                }
-                try {
-                    sleep(refreshSecs * 1000);
-                } catch (InterruptedException e) {
-                    break;
-                }
-            }
-        }
-    }
-}
--- a/jdk/src/java.desktop/unix/native/common/java2d/opengl/GLXGraphicsConfig.c	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/unix/native/common/java2d/opengl/GLXGraphicsConfig.c	Wed Jul 05 20:06:12 2017 +0200
@@ -398,8 +398,8 @@
 static GLXPbuffer
 GLXGC_InitScratchPbuffer(GLXFBConfig fbconfig)
 {
-    int pbattrlist[] = {GLX_PBUFFER_WIDTH, 1,
-                        GLX_PBUFFER_HEIGHT, 1,
+    int pbattrlist[] = {GLX_PBUFFER_WIDTH, 4,
+                        GLX_PBUFFER_HEIGHT, 4,
                         GLX_PRESERVED_CONTENTS, GL_FALSE,
                         0};
 
--- a/jdk/src/java.desktop/windows/classes/META-INF/services/javax.print.PrintServiceLookup	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Provider for Java Print Service
-sun.print.Win32PrintServiceLookup
--- a/jdk/src/java.desktop/windows/classes/META-INF/services/javax.print.StreamPrintServiceFactory	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Providers for Java 2D/JPS Stream print services.
-sun.print.PSStreamPrinterFactory
--- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPathGraphics.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPathGraphics.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1400,7 +1400,9 @@
          * The saved device transform is needed as the current transform
          * is not likely to be the same.
          */
-        deviceClip(savedClip.getPathIterator(savedTransform));
+        if (savedClip != null) {
+            deviceClip(savedClip.getPathIterator(savedTransform));
+        }
 
         /* Scale the bounding rectangle by the scale transform.
          * Because the scaling transform has only x and y
--- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WPrinterJob.java	Wed Jul 05 20:06:12 2017 +0200
@@ -93,7 +93,7 @@
 import sun.print.SunPageSelection;
 import sun.print.Win32MediaTray;
 import sun.print.Win32PrintService;
-import sun.print.Win32PrintServiceLookup;
+import sun.print.PrintServiceLookupProvider;
 import sun.print.ServiceDialog;
 import sun.print.DialogOwner;
 
@@ -454,7 +454,7 @@
                 // native printer is different !
                 // we update the current PrintService
                 try {
-                    setPrintService(Win32PrintServiceLookup.
+                    setPrintService(PrintServiceLookupProvider.
                                     getWin32PrintLUS().
                                     getPrintServiceByName(printerName));
                 } catch (PrinterException e) {
@@ -628,7 +628,7 @@
             String printerName = getNativePrintService();
 
             if (printerName != null) {
-                myService = Win32PrintServiceLookup.getWin32PrintLUS().
+                myService = PrintServiceLookupProvider.getWin32PrintLUS().
                     getPrintServiceByName(printerName);
                 // no need to call setNativePrintService as this name is
                 // currently set in native
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/windows/classes/sun/print/PrintServiceLookupProvider.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 2000, 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.print;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import javax.print.DocFlavor;
+import javax.print.MultiDocPrintService;
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+import javax.print.attribute.Attribute;
+import javax.print.attribute.AttributeSet;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.HashPrintServiceAttributeSet;
+import javax.print.attribute.PrintRequestAttribute;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.print.attribute.PrintServiceAttribute;
+import javax.print.attribute.PrintServiceAttributeSet;
+import javax.print.attribute.standard.PrinterName;
+
+public class PrintServiceLookupProvider extends PrintServiceLookup {
+
+    private String defaultPrinter;
+    private PrintService defaultPrintService;
+    private String[] printers; /* excludes the default printer */
+    private PrintService[] printServices; /* includes the default printer */
+
+    static {
+        java.security.AccessController.doPrivileged(
+            new java.security.PrivilegedAction<Void>() {
+                public Void run() {
+                    System.loadLibrary("awt");
+                    return null;
+                }
+            });
+    }
+
+    /* The singleton win32 print lookup service.
+     * Code that is aware of this field and wants to use it must first
+     * see if its null, and if so instantiate it by calling a method such as
+     * javax.print.PrintServiceLookup.defaultPrintService() so that the
+     * same instance is stored there.
+     */
+    private static PrintServiceLookupProvider win32PrintLUS;
+
+    /* Think carefully before calling this. Preferably don't call it. */
+    public static PrintServiceLookupProvider getWin32PrintLUS() {
+        if (win32PrintLUS == null) {
+            /* This call is internally synchronized.
+             * When it returns an instance of this class will have
+             * been instantiated - else there's a JDK internal error.
+             */
+            PrintServiceLookup.lookupDefaultPrintService();
+        }
+        return win32PrintLUS;
+    }
+
+    public PrintServiceLookupProvider() {
+
+        if (win32PrintLUS == null) {
+            win32PrintLUS = this;
+
+            String osName = AccessController.doPrivileged(
+                new sun.security.action.GetPropertyAction("os.name"));
+            // There's no capability for Win98 to refresh printers.
+            // See "OpenPrinter" for more info.
+            if (osName != null && osName.startsWith("Windows 98")) {
+                return;
+            }
+            // start the printer listener thread
+            PrinterChangeListener thr = new PrinterChangeListener();
+            thr.setDaemon(true);
+            thr.start();
+        } /* else condition ought to never happen! */
+    }
+
+    /* Want the PrintService which is default print service to have
+     * equality of reference with the equivalent in list of print services
+     * This isn't required by the API and there's a risk doing this will
+     * lead people to assume its guaranteed.
+     */
+    public synchronized PrintService[] getPrintServices() {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+            security.checkPrintJobAccess();
+        }
+        if (printServices == null) {
+            refreshServices();
+        }
+        return printServices;
+    }
+
+    private synchronized void refreshServices() {
+        printers = getAllPrinterNames();
+        if (printers == null) {
+            // In Windows it is safe to assume no default if printers == null so we
+            // don't get the default.
+            printServices = new PrintService[0];
+            return;
+        }
+
+        PrintService[] newServices = new PrintService[printers.length];
+        PrintService defService = getDefaultPrintService();
+        for (int p = 0; p < printers.length; p++) {
+            if (defService != null &&
+                printers[p].equals(defService.getName())) {
+                newServices[p] = defService;
+            } else {
+                if (printServices == null) {
+                    newServices[p] = new Win32PrintService(printers[p]);
+                } else {
+                    int j;
+                    for (j = 0; j < printServices.length; j++) {
+                        if ((printServices[j]!= null) &&
+                            (printers[p].equals(printServices[j].getName()))) {
+                            newServices[p] = printServices[j];
+                            printServices[j] = null;
+                            break;
+                        }
+                    }
+                    if (j == printServices.length) {
+                        newServices[p] = new Win32PrintService(printers[p]);
+                    }
+                }
+            }
+        }
+
+        // Look for deleted services and invalidate these
+        if (printServices != null) {
+            for (int j=0; j < printServices.length; j++) {
+                if ((printServices[j] instanceof Win32PrintService) &&
+                    (!printServices[j].equals(defaultPrintService))) {
+                    ((Win32PrintService)printServices[j]).invalidateService();
+                }
+            }
+        }
+        printServices = newServices;
+    }
+
+
+    public synchronized PrintService getPrintServiceByName(String name) {
+
+        if (name == null || name.equals("")) {
+            return null;
+        } else {
+            /* getPrintServices() is now very fast. */
+            PrintService[] printServices = getPrintServices();
+            for (int i=0; i<printServices.length; i++) {
+                if (printServices[i].getName().equals(name)) {
+                    return printServices[i];
+                }
+            }
+            return null;
+        }
+    }
+
+    @SuppressWarnings("unchecked") // Cast to Class<PrintServiceAttribute>
+    boolean matchingService(PrintService service,
+                            PrintServiceAttributeSet serviceSet) {
+        if (serviceSet != null) {
+            Attribute [] attrs =  serviceSet.toArray();
+            Attribute serviceAttr;
+            for (int i=0; i<attrs.length; i++) {
+                serviceAttr
+                    = service.getAttribute((Class<PrintServiceAttribute>)attrs[i].getCategory());
+                if (serviceAttr == null || !serviceAttr.equals(attrs[i])) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    public PrintService[] getPrintServices(DocFlavor flavor,
+                                           AttributeSet attributes) {
+
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+          security.checkPrintJobAccess();
+        }
+        PrintRequestAttributeSet requestSet = null;
+        PrintServiceAttributeSet serviceSet = null;
+
+        if (attributes != null && !attributes.isEmpty()) {
+
+            requestSet = new HashPrintRequestAttributeSet();
+            serviceSet = new HashPrintServiceAttributeSet();
+
+            Attribute[] attrs = attributes.toArray();
+            for (int i=0; i<attrs.length; i++) {
+                if (attrs[i] instanceof PrintRequestAttribute) {
+                    requestSet.add(attrs[i]);
+                } else if (attrs[i] instanceof PrintServiceAttribute) {
+                    serviceSet.add(attrs[i]);
+                }
+            }
+        }
+
+        /*
+         * Special case: If client is asking for a particular printer
+         * (by name) then we can save time by getting just that service
+         * to check against the rest of the specified attributes.
+         */
+        PrintService[] services = null;
+        if (serviceSet != null && serviceSet.get(PrinterName.class) != null) {
+            PrinterName name = (PrinterName)serviceSet.get(PrinterName.class);
+            PrintService service = getPrintServiceByName(name.getValue());
+            if (service == null || !matchingService(service, serviceSet)) {
+                services = new PrintService[0];
+            } else {
+                services = new PrintService[1];
+                services[0] = service;
+            }
+        } else {
+            services = getPrintServices();
+        }
+
+        if (services.length == 0) {
+            return services;
+        } else {
+            ArrayList<PrintService> matchingServices = new ArrayList<>();
+            for (int i=0; i<services.length; i++) {
+                try {
+                    if (services[i].
+                        getUnsupportedAttributes(flavor, requestSet) == null) {
+                        matchingServices.add(services[i]);
+                    }
+                } catch (IllegalArgumentException e) {
+                }
+            }
+            services = new PrintService[matchingServices.size()];
+            return matchingServices.toArray(services);
+        }
+    }
+
+    /*
+     * return empty array as don't support multi docs
+     */
+    public MultiDocPrintService[]
+        getMultiDocPrintServices(DocFlavor[] flavors,
+                                 AttributeSet attributes) {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+          security.checkPrintJobAccess();
+        }
+        return new MultiDocPrintService[0];
+    }
+
+
+    public synchronized PrintService getDefaultPrintService() {
+        SecurityManager security = System.getSecurityManager();
+        if (security != null) {
+          security.checkPrintJobAccess();
+        }
+
+
+        // Windows does not have notification for a change in default
+        // so we always get the latest.
+        defaultPrinter = getDefaultPrinterName();
+        if (defaultPrinter == null) {
+            return null;
+        }
+
+        if ((defaultPrintService != null) &&
+            defaultPrintService.getName().equals(defaultPrinter)) {
+
+            return defaultPrintService;
+        }
+
+         // Not the same as default so proceed to get new PrintService.
+
+        // clear defaultPrintService
+        defaultPrintService = null;
+
+        if (printServices != null) {
+            for (int j=0; j<printServices.length; j++) {
+                if (defaultPrinter.equals(printServices[j].getName())) {
+                    defaultPrintService = printServices[j];
+                    break;
+                }
+            }
+        }
+
+        if (defaultPrintService == null) {
+            defaultPrintService = new Win32PrintService(defaultPrinter);
+        }
+        return defaultPrintService;
+    }
+
+    class PrinterChangeListener extends Thread {
+        long chgObj;
+        PrinterChangeListener() {
+            chgObj = notifyFirstPrinterChange(null);
+        }
+
+        public void run() {
+            if (chgObj != -1) {
+                while (true) {
+                    // wait for configuration to change
+                    if (notifyPrinterChange(chgObj) != 0) {
+                        try {
+                            refreshServices();
+                        } catch (SecurityException se) {
+                            break;
+                        }
+                    } else {
+                        notifyClosePrinterChange(chgObj);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    private native String getDefaultPrinterName();
+    private native String[] getAllPrinterNames();
+    private native long notifyFirstPrinterChange(String printer);
+    private native void notifyClosePrinterChange(long chgObj);
+    private native int notifyPrinterChange(long chgObj);
+}
--- a/jdk/src/java.desktop/windows/classes/sun/print/Win32PrintServiceLookup.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,349 +0,0 @@
-/*
- * Copyright (c) 2000, 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.print;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import javax.print.DocFlavor;
-import javax.print.MultiDocPrintService;
-import javax.print.PrintService;
-import javax.print.PrintServiceLookup;
-import javax.print.attribute.Attribute;
-import javax.print.attribute.AttributeSet;
-import javax.print.attribute.HashPrintRequestAttributeSet;
-import javax.print.attribute.HashPrintServiceAttributeSet;
-import javax.print.attribute.PrintRequestAttribute;
-import javax.print.attribute.PrintRequestAttributeSet;
-import javax.print.attribute.PrintServiceAttribute;
-import javax.print.attribute.PrintServiceAttributeSet;
-import javax.print.attribute.standard.PrinterName;
-
-public class Win32PrintServiceLookup extends PrintServiceLookup {
-
-    private String defaultPrinter;
-    private PrintService defaultPrintService;
-    private String[] printers; /* excludes the default printer */
-    private PrintService[] printServices; /* includes the default printer */
-
-    static {
-        java.security.AccessController.doPrivileged(
-            new java.security.PrivilegedAction<Void>() {
-                public Void run() {
-                    System.loadLibrary("awt");
-                    return null;
-                }
-            });
-    }
-
-    /* The singleton win32 print lookup service.
-     * Code that is aware of this field and wants to use it must first
-     * see if its null, and if so instantiate it by calling a method such as
-     * javax.print.PrintServiceLookup.defaultPrintService() so that the
-     * same instance is stored there.
-     */
-    private static Win32PrintServiceLookup win32PrintLUS;
-
-    /* Think carefully before calling this. Preferably don't call it. */
-    public static Win32PrintServiceLookup getWin32PrintLUS() {
-        if (win32PrintLUS == null) {
-            /* This call is internally synchronized.
-             * When it returns an instance of this class will have
-             * been instantiated - else there's a JDK internal error.
-             */
-            PrintServiceLookup.lookupDefaultPrintService();
-        }
-        return win32PrintLUS;
-    }
-
-    public Win32PrintServiceLookup() {
-
-        if (win32PrintLUS == null) {
-            win32PrintLUS = this;
-
-            String osName = AccessController.doPrivileged(
-                new sun.security.action.GetPropertyAction("os.name"));
-            // There's no capability for Win98 to refresh printers.
-            // See "OpenPrinter" for more info.
-            if (osName != null && osName.startsWith("Windows 98")) {
-                return;
-            }
-            // start the printer listener thread
-            PrinterChangeListener thr = new PrinterChangeListener();
-            thr.setDaemon(true);
-            thr.start();
-        } /* else condition ought to never happen! */
-    }
-
-    /* Want the PrintService which is default print service to have
-     * equality of reference with the equivalent in list of print services
-     * This isn't required by the API and there's a risk doing this will
-     * lead people to assume its guaranteed.
-     */
-    public synchronized PrintService[] getPrintServices() {
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-            security.checkPrintJobAccess();
-        }
-        if (printServices == null) {
-            refreshServices();
-        }
-        return printServices;
-    }
-
-    private synchronized void refreshServices() {
-        printers = getAllPrinterNames();
-        if (printers == null) {
-            // In Windows it is safe to assume no default if printers == null so we
-            // don't get the default.
-            printServices = new PrintService[0];
-            return;
-        }
-
-        PrintService[] newServices = new PrintService[printers.length];
-        PrintService defService = getDefaultPrintService();
-        for (int p = 0; p < printers.length; p++) {
-            if (defService != null &&
-                printers[p].equals(defService.getName())) {
-                newServices[p] = defService;
-            } else {
-                if (printServices == null) {
-                    newServices[p] = new Win32PrintService(printers[p]);
-                } else {
-                    int j;
-                    for (j = 0; j < printServices.length; j++) {
-                        if ((printServices[j]!= null) &&
-                            (printers[p].equals(printServices[j].getName()))) {
-                            newServices[p] = printServices[j];
-                            printServices[j] = null;
-                            break;
-                        }
-                    }
-                    if (j == printServices.length) {
-                        newServices[p] = new Win32PrintService(printers[p]);
-                    }
-                }
-            }
-        }
-
-        // Look for deleted services and invalidate these
-        if (printServices != null) {
-            for (int j=0; j < printServices.length; j++) {
-                if ((printServices[j] instanceof Win32PrintService) &&
-                    (!printServices[j].equals(defaultPrintService))) {
-                    ((Win32PrintService)printServices[j]).invalidateService();
-                }
-            }
-        }
-        printServices = newServices;
-    }
-
-
-    public synchronized PrintService getPrintServiceByName(String name) {
-
-        if (name == null || name.equals("")) {
-            return null;
-        } else {
-            /* getPrintServices() is now very fast. */
-            PrintService[] printServices = getPrintServices();
-            for (int i=0; i<printServices.length; i++) {
-                if (printServices[i].getName().equals(name)) {
-                    return printServices[i];
-                }
-            }
-            return null;
-        }
-    }
-
-    @SuppressWarnings("unchecked") // Cast to Class<PrintServiceAttribute>
-    boolean matchingService(PrintService service,
-                            PrintServiceAttributeSet serviceSet) {
-        if (serviceSet != null) {
-            Attribute [] attrs =  serviceSet.toArray();
-            Attribute serviceAttr;
-            for (int i=0; i<attrs.length; i++) {
-                serviceAttr
-                    = service.getAttribute((Class<PrintServiceAttribute>)attrs[i].getCategory());
-                if (serviceAttr == null || !serviceAttr.equals(attrs[i])) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    public PrintService[] getPrintServices(DocFlavor flavor,
-                                           AttributeSet attributes) {
-
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-          security.checkPrintJobAccess();
-        }
-        PrintRequestAttributeSet requestSet = null;
-        PrintServiceAttributeSet serviceSet = null;
-
-        if (attributes != null && !attributes.isEmpty()) {
-
-            requestSet = new HashPrintRequestAttributeSet();
-            serviceSet = new HashPrintServiceAttributeSet();
-
-            Attribute[] attrs = attributes.toArray();
-            for (int i=0; i<attrs.length; i++) {
-                if (attrs[i] instanceof PrintRequestAttribute) {
-                    requestSet.add(attrs[i]);
-                } else if (attrs[i] instanceof PrintServiceAttribute) {
-                    serviceSet.add(attrs[i]);
-                }
-            }
-        }
-
-        /*
-         * Special case: If client is asking for a particular printer
-         * (by name) then we can save time by getting just that service
-         * to check against the rest of the specified attributes.
-         */
-        PrintService[] services = null;
-        if (serviceSet != null && serviceSet.get(PrinterName.class) != null) {
-            PrinterName name = (PrinterName)serviceSet.get(PrinterName.class);
-            PrintService service = getPrintServiceByName(name.getValue());
-            if (service == null || !matchingService(service, serviceSet)) {
-                services = new PrintService[0];
-            } else {
-                services = new PrintService[1];
-                services[0] = service;
-            }
-        } else {
-            services = getPrintServices();
-        }
-
-        if (services.length == 0) {
-            return services;
-        } else {
-            ArrayList<PrintService> matchingServices = new ArrayList<>();
-            for (int i=0; i<services.length; i++) {
-                try {
-                    if (services[i].
-                        getUnsupportedAttributes(flavor, requestSet) == null) {
-                        matchingServices.add(services[i]);
-                    }
-                } catch (IllegalArgumentException e) {
-                }
-            }
-            services = new PrintService[matchingServices.size()];
-            return matchingServices.toArray(services);
-        }
-    }
-
-    /*
-     * return empty array as don't support multi docs
-     */
-    public MultiDocPrintService[]
-        getMultiDocPrintServices(DocFlavor[] flavors,
-                                 AttributeSet attributes) {
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-          security.checkPrintJobAccess();
-        }
-        return new MultiDocPrintService[0];
-    }
-
-
-    public synchronized PrintService getDefaultPrintService() {
-        SecurityManager security = System.getSecurityManager();
-        if (security != null) {
-          security.checkPrintJobAccess();
-        }
-
-
-        // Windows does not have notification for a change in default
-        // so we always get the latest.
-        defaultPrinter = getDefaultPrinterName();
-        if (defaultPrinter == null) {
-            return null;
-        }
-
-        if ((defaultPrintService != null) &&
-            defaultPrintService.getName().equals(defaultPrinter)) {
-
-            return defaultPrintService;
-        }
-
-         // Not the same as default so proceed to get new PrintService.
-
-        // clear defaultPrintService
-        defaultPrintService = null;
-
-        if (printServices != null) {
-            for (int j=0; j<printServices.length; j++) {
-                if (defaultPrinter.equals(printServices[j].getName())) {
-                    defaultPrintService = printServices[j];
-                    break;
-                }
-            }
-        }
-
-        if (defaultPrintService == null) {
-            defaultPrintService = new Win32PrintService(defaultPrinter);
-        }
-        return defaultPrintService;
-    }
-
-    class PrinterChangeListener extends Thread {
-        long chgObj;
-        PrinterChangeListener() {
-            chgObj = notifyFirstPrinterChange(null);
-        }
-
-        public void run() {
-            if (chgObj != -1) {
-                while (true) {
-                    // wait for configuration to change
-                    if (notifyPrinterChange(chgObj) != 0) {
-                        try {
-                            refreshServices();
-                        } catch (SecurityException se) {
-                            break;
-                        }
-                    } else {
-                        notifyClosePrinterChange(chgObj);
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    private native String getDefaultPrinterName();
-    private native String[] getAllPrinterNames();
-    private native long notifyFirstPrinterChange(String printer);
-    private native void notifyClosePrinterChange(long chgObj);
-    private native int notifyPrinterChange(long chgObj);
-}
--- a/jdk/src/java.desktop/windows/native/libawt/windows/WPrinterJob.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/WPrinterJob.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -68,7 +68,7 @@
 extern "C" {
 
 JNIEXPORT jstring JNICALL
-Java_sun_print_Win32PrintServiceLookup_getDefaultPrinterName(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_getDefaultPrinterName(JNIEnv *env,
                                                              jobject peer)
 {
     TRY;
@@ -119,7 +119,7 @@
 
 
 JNIEXPORT jobjectArray JNICALL
-Java_sun_print_Win32PrintServiceLookup_getAllPrinterNames(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_getAllPrinterNames(JNIEnv *env,
                                                           jobject peer)
 {
     TRY;
@@ -176,7 +176,7 @@
 
 
 JNIEXPORT jlong JNICALL
-Java_sun_print_Win32PrintServiceLookup_notifyFirstPrinterChange(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_notifyFirstPrinterChange(JNIEnv *env,
                                                                 jobject peer,
                                                                 jstring printer) {
     HANDLE hPrinter;
@@ -210,7 +210,7 @@
 
 
 JNIEXPORT void JNICALL
-Java_sun_print_Win32PrintServiceLookup_notifyClosePrinterChange(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_notifyClosePrinterChange(JNIEnv *env,
                                                                 jobject peer,
                                                                 jlong chgObject) {
     FindClosePrinterChangeNotification((HANDLE)chgObject);
@@ -218,7 +218,7 @@
 
 
 JNIEXPORT jint JNICALL
-Java_sun_print_Win32PrintServiceLookup_notifyPrinterChange(JNIEnv *env,
+Java_sun_print_PrintServiceLookupProvider_notifyPrinterChange(JNIEnv *env,
                                                            jobject peer,
                                                            jlong chgObject) {
     DWORD dwChange;
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_PrintControl.cpp	Wed Jul 05 20:06:12 2017 +0200
@@ -771,6 +771,17 @@
     jint maxPage = env->CallIntMethod(printCtrl,
                                       AwtPrintControl::getMaxPageID);
     pd.nMaxPage = (maxPage <= (jint)((WORD)-1)) ? (WORD)maxPage : (WORD)-1;
+    // In the event that the application displays the dialog before
+    // installing a Printable, but sets a page range, then max page will be 1
+    // since the default state of a PrinterJob is an empty "Book" Pageable.
+    // Windows pops up an error dialog in such a case which isn't very
+    // forthcoming about the exact problem.
+    // So if we detect this fix up such a problem here.
+    if (pd.nMinPage > pd.nFromPage) pd.nMinPage = pd.nFromPage;
+    if (pd.nMaxPage < pd.nToPage) pd.nMaxPage = pd.nToPage;
+    if (pd.nFromPage > pd.nMinPage || pd.nToPage < pd.nMaxPage) {
+      pd.Flags |= PD_PAGENUMS;
+    }
 
     if (env->CallBooleanMethod(printCtrl,
                                AwtPrintControl::getDestID)) {
--- a/jdk/src/java.management/share/classes/javax/management/loading/DefaultLoaderRepository.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.management/share/classes/javax/management/loading/DefaultLoaderRepository.java	Wed Jul 05 20:06:12 2017 +0200
@@ -47,7 +47,7 @@
  * <code>DefaultLoaderRepository</code> be rewritten.</p>
  *
  * @deprecated Use
- * {@link javax.management.MBeanServer#getClassLoaderRepository()}}
+ * {@link javax.management.MBeanServer#getClassLoaderRepository()}
  * instead.
  *
  * @since 1.5
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java	Wed Jul 05 20:06:12 2017 +0200
@@ -803,8 +803,10 @@
      * @throws SQLException if a database access error occurs
      * or the given column number is out of bounds
      */
-    public  boolean isDefinitelyWritable(int columnIndex)
-        throws SQLException { return true;}
+    public  boolean isDefinitelyWritable(int columnIndex) throws SQLException {
+        checkColRange(columnIndex);
+        return true;
+    }
 
     /**
      * Retrieves the fully-qualified name of the class in the Java
--- a/jdk/src/jdk.deploy.osx/macosx/classes/apple/security/KeychainStore.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.deploy.osx/macosx/classes/apple/security/KeychainStore.java	Wed Jul 05 20:06:12 2017 +0200
@@ -140,7 +140,8 @@
      * password to recover it.
      *
      * @param alias the alias name
-     * @param password the password for recovering the key
+     * @param password the password for recovering the key. This password is
+     *        used internally as the key is exported in a PKCS12 format.
      *
      * @return the requested key, or null if the given alias does not exist
      * or does not identify a <i>key entry</i>.
@@ -155,6 +156,20 @@
     {
         permissionCheck();
 
+        // An empty password is rejected by MacOS API, no private key data
+        // is exported. If no password is passed (as is the case when
+        // this implementation is used as browser keystore in various
+        // deployment scenarios like Webstart, JFX and applets), create
+        // a dummy password so MacOS API is happy.
+        if (password == null || password.length == 0) {
+            // Must not be a char array with only a 0, as this is an empty
+            // string.
+            if (random == null) {
+                random = new SecureRandom();
+            }
+            password = Long.toString(random.nextLong()).toCharArray();
+        }
+
         Object entry = entries.get(alias.toLowerCase());
 
         if (entry == null || !(entry instanceof KeyEntry)) {
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/de/TimeZoneNames_de.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/de/TimeZoneNames_de.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/es/TimeZoneNames_es.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/es/TimeZoneNames_es.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/fr/TimeZoneNames_fr.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/fr/TimeZoneNames_fr.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/it/TimeZoneNames_it.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/it/TimeZoneNames_it.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/ja/TimeZoneNames_ja.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/ja/TimeZoneNames_ja.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/ko/TimeZoneNames_ko.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/ko/TimeZoneNames_ko.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/pt/TimeZoneNames_pt_BR.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/pt/TimeZoneNames_pt_BR.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", TRUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/sv/TimeZoneNames_sv.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/sv/TimeZoneNames_sv.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/zh/TimeZoneNames_zh_CN.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/zh/TimeZoneNames_zh_CN.java	Wed Jul 05 20:06:12 2017 +0200
@@ -829,7 +829,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -917,6 +917,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/src/jdk.localedata/share/classes/sun/util/resources/zh/TimeZoneNames_zh_TW.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/src/jdk.localedata/share/classes/sun/util/resources/zh/TimeZoneNames_zh_TW.java	Wed Jul 05 20:06:12 2017 +0200
@@ -831,7 +831,7 @@
             {"Europe/Madrid", CET},
             {"Europe/Malta", CET},
             {"Europe/Mariehamn", EET},
-            {"Europe/Minsk", FET},
+            {"Europe/Minsk", MSK},
             {"Europe/Monaco", CET},
             {"Europe/Moscow", MSK},
             {"Europe/Nicosia", EET},
@@ -919,6 +919,9 @@
             {"PRT", AST},
             {"Pacific/Apia", WST_SAMOA},
             {"Pacific/Auckland", NZST},
+            {"Pacific/Bougainville", new String[] {"Bougainville Standard Time", "BST",
+                                                   "Bougainville Daylight Time", "BST",
+                                                   "Bougainville Time", "BT"}},
             {"Pacific/Chatham", CHAST},
             {"Pacific/Chuuk", CHUT},
             {"Pacific/Easter", EASTER},
--- a/jdk/test/ProblemList.txt	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/ProblemList.txt	Wed Jul 05 20:06:12 2017 +0200
@@ -200,6 +200,9 @@
 
 # jdk_rmi
 
+# 7140992
+java/rmi/server/Unreferenced/finiteGCLatency/FiniteGCLatency.java  generic-all
+
 # 7146541
 java/rmi/transport/rapidExportUnexport/RapidExportUnexport.java	linux-all
 
--- a/jdk/test/TEST.ROOT	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/TEST.ROOT	Wed Jul 05 20:06:12 2017 +0200
@@ -12,3 +12,6 @@
 
 # Group definitions
 groups=TEST.groups [closed/TEST.groups]
+
+# Tests using jtreg 4.1 b10 features
+requiredVersion=4.1 b10
--- a/jdk/test/com/sun/jdi/OptionTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/com/sun/jdi/OptionTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 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
@@ -34,9 +34,11 @@
  */
 
 import java.net.ServerSocket;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class OptionTest extends Object {
-    private Process subprocess;
+    private static final Pattern TRANSPORT_ERROR_PTRN = Pattern.compile("^ERROR: transport error .+$", Pattern.MULTILINE);
     private int subprocessStatus;
     private static final String CR = System.getProperty("line.separator");
     private static final int BUFFERSIZE = 4096;
@@ -153,7 +155,7 @@
             OptionTest myTest = new OptionTest();
             String results [] = myTest.run(VMConnection.insertDebuggeeVMOptions(cmds));
             if (!(results[RETSTAT].equals("0")) ||
-                (results[STDERR].startsWith("ERROR:"))) {
+                (TRANSPORT_ERROR_PTRN.matcher(results[STDERR]).find())) {
                 throw new Exception("Test failed: jdwp doesn't like " + cmds[1]);
             }
         }
@@ -179,7 +181,7 @@
             OptionTest myTest = new OptionTest();
             String results[] = myTest.run(VMConnection.insertDebuggeeVMOptions(cmds));
 
-            if (!results[RETSTAT].equals("0") && results[STDERR].startsWith("ERROR:")) {
+            if (!results[RETSTAT].equals("0") && TRANSPORT_ERROR_PTRN.matcher(results[STDERR]).find()) {
                 // We got expected error, test passed
             }
             else {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Container/ContainerAIOOBE/ContainerAIOOBE.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+import java.awt.Button;
+import java.awt.Component;
+import java.awt.Container;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+/**
+ * @test
+ * @bug 8059590
+ * @summary ArrayIndexOutOfBoundsException occurs when Container with overridden getComponents() is deserialized.
+ * @author Alexey Ivanov
+ * @run main ContainerAIOOBE
+ */
+public class ContainerAIOOBE {
+
+    public static void main(final String[] args) throws Exception {
+        ZContainer z = new ZContainer();
+        z.add(new Button());
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(z);
+        oos.flush();
+        oos.close();
+
+        byte[] array = baos.toByteArray();
+        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(array));
+
+        // Reading the object must not throw ArrayIndexOutOfBoundsException
+        ZContainer zz = (ZContainer) ois.readObject();
+
+        if (zz.getComponentCount() != 1) {
+            throw new Exception("deserialized object must have 1 component");
+        }
+        if (!(zz.getComponent(0) instanceof Button)) {
+            throw new Exception("deserialized object must contain Button component");
+        }
+        if (zz.getComponents().length != 0) {
+            throw new Exception("deserialized object returns non-empty array");
+        }
+        System.out.println("Test passed");
+    }
+
+    static class ZContainer extends Container {
+        public Component[] getComponents() {
+            return new Component[0];
+        }
+    }
+}
--- a/jdk/test/java/awt/GraphicsDevice/CloneConfigsTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/awt/GraphicsDevice/CloneConfigsTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug     6822057 7124400
+ * @bug     6822057 7124400 8059848
  *
  * @summary Test verifies that list of supported graphics configurations
  *          can not be changed via modification of elements of an array
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/color/LoadProfileWithSM.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+import java.awt.color.*;
+
+/*
+ * @test
+ * @bug 8058969
+ * @summary test standard profiles loads with SecurityManager installed.
+ * @run main/othervm LoadProfileWithSM
+ */
+
+public class LoadProfileWithSM {
+
+    public static void main(String[] args) {
+        System.setSecurityManager(new SecurityManager());
+        ICC_Profile profile =
+            ((ICC_ColorSpace)(ColorSpace.getInstance(
+                ColorSpace.CS_GRAY))).getProfile();
+        /* request profile data in order to force profile loading */
+        profile.getData();
+   }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/DrawImage/IncorrectClipXorModeSW2Surface.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,179 @@
+/*
+ * 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.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.DataBufferInt;
+import java.awt.image.DataBufferShort;
+import java.awt.image.VolatileImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+
+import static java.awt.geom.Rectangle2D.Double;
+
+/**
+ * @test
+ * @bug 8061456
+ * @summary Tests drawing BI to volatile image using different clips + xor mode.
+ *          Results of the blit BI to compatibleImage is used for comparison.
+ * @author Sergey Bylokhov
+ */
+public final class IncorrectClipXorModeSW2Surface {
+
+    private static int[] SIZES = {2, 10, 100};
+    private static final Shape[] SHAPES = {
+                                           new Rectangle(0, 0, 0, 0),
+                                           new Rectangle(0, 0, 1, 1),
+                                           new Rectangle(0, 1, 1, 1),
+                                           new Rectangle(1, 0, 1, 1),
+                                           new Rectangle(1, 1, 1, 1),
+
+                                           new Double(0, 0, 0.5, 0.5),
+                                           new Double(0, 0.5, 0.5, 0.5),
+                                           new Double(0.5, 0, 0.5, 0.5),
+                                           new Double(0.5, 0.5, 0.5, 0.5),
+                                           new Double(0.25, 0.25, 0.5, 0.5),
+                                           new Double(0, 0.25, 1, 0.5),
+                                           new Double(0.25, 0, 0.5, 1),
+
+                                           new Double(.10, .10, .20, .20),
+                                           new Double(.75, .75, .20, .20),
+                                           new Double(.75, .10, .20, .20),
+                                           new Double(.10, .75, .20, .20),
+    };
+
+    public static void main(final String[] args) throws IOException {
+        GraphicsEnvironment ge = GraphicsEnvironment
+                .getLocalGraphicsEnvironment();
+        GraphicsConfiguration gc = ge.getDefaultScreenDevice()
+                                     .getDefaultConfiguration();
+        AffineTransform at;
+        for (int size : SIZES) {
+            at = AffineTransform.getScaleInstance(size, size);
+            for (Shape clip : SHAPES) {
+                clip = at.createTransformedShape(clip);
+                for (Shape to : SHAPES) {
+                    to = at.createTransformedShape(to);
+                    // Prepare test images
+                    BufferedImage snapshot;
+                    BufferedImage bi = getBufferedImage(size);
+                    VolatileImage vi = getVolatileImage(gc, size);
+                    while (true) {
+                        vi.validate(gc);
+                        Graphics2D g2d = vi.createGraphics();
+                        g2d.setColor(Color.GREEN);
+                        g2d.fillRect(0, 0, size, size);
+                        g2d.dispose();
+                        if (vi.validate(gc) != VolatileImage.IMAGE_OK) {
+                            continue;
+                        }
+                        draw(clip, to, bi, vi);
+                        snapshot = vi.getSnapshot();
+                        if (vi.contentsLost()) {
+                            continue;
+                        }
+                        break;
+                    }
+                    // Prepare gold images
+                    BufferedImage goldvi = getCompatibleImage(gc, size);
+                    BufferedImage goldbi = getBufferedImage(size);
+                    draw(clip, to, goldbi, goldvi);
+                    validate(snapshot, goldvi);
+                    vi.flush();
+                }
+            }
+        }
+    }
+
+    private static void draw(Shape clip, Shape shape, Image from, Image to) {
+        Graphics2D g2d = (Graphics2D) to.getGraphics();
+        g2d.setXORMode(Color.BLACK);
+        g2d.setClip(clip);
+        Rectangle toBounds = shape.getBounds();
+        g2d.drawImage(from, toBounds.x, toBounds.y, toBounds.width,
+                      toBounds.height, null);
+        g2d.dispose();
+    }
+
+    private static BufferedImage getBufferedImage(int sw) {
+        final BufferedImage bi = new BufferedImage(sw, sw, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g2d = bi.createGraphics();
+        g2d.setColor(Color.RED);
+        g2d.fillRect(0, 0, sw, sw);
+        g2d.dispose();
+
+        final DataBuffer db = bi.getRaster().getDataBuffer();
+        if (db instanceof DataBufferInt) {
+            ((DataBufferInt) db).getData();
+        } else if (db instanceof DataBufferShort) {
+            ((DataBufferShort) db).getData();
+        } else if (db instanceof DataBufferByte) {
+            ((DataBufferByte) db).getData();
+        } else {
+            try {
+                bi.setAccelerationPriority(0.0f);
+            } catch (final Throwable ignored) {
+            }
+        }
+        return bi;
+    }
+
+    private static VolatileImage getVolatileImage(GraphicsConfiguration gc,
+                                                  int size) {
+        return gc.createCompatibleVolatileImage(size, size);
+    }
+
+    private static BufferedImage getCompatibleImage(GraphicsConfiguration gc,
+                                                    int size) {
+        BufferedImage image = gc.createCompatibleImage(size, size);
+        Graphics2D g2d = image.createGraphics();
+        g2d.setColor(Color.GREEN);
+        g2d.fillRect(0, 0, size, size);
+        g2d.dispose();
+        return image;
+    }
+
+    private static void validate(BufferedImage bi, BufferedImage goldbi)
+            throws IOException {
+        for (int x = 0; x < bi.getWidth(); ++x) {
+            for (int y = 0; y < bi.getHeight(); ++y) {
+                if (goldbi.getRGB(x, y) != bi.getRGB(x, y)) {
+                    ImageIO.write(bi, "png", new File("actual.png"));
+                    ImageIO.write(goldbi, "png", new File("expected.png"));
+                    throw new RuntimeException("Test failed.");
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/DrawImage/IncorrectUnmanagedImageSourceOffset.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,150 @@
+/*
+ * 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.
+ */
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.DataBufferInt;
+import java.awt.image.DataBufferShort;
+import java.awt.image.VolatileImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+
+import static java.awt.Transparency.*;
+import static java.awt.image.BufferedImage.*;
+
+/**
+ * @test
+ * @bug 8029253
+ * @summary Tests asymmetric source offsets when unmanaged image is drawn to VI.
+ *          Results of the blit to compatibleImage are used for comparison.
+ * @author Sergey Bylokhov
+ */
+public final class IncorrectUnmanagedImageSourceOffset {
+
+    private static final int[] TYPES = {TYPE_INT_RGB, TYPE_INT_ARGB,
+                                        TYPE_INT_ARGB_PRE, TYPE_INT_BGR,
+                                        TYPE_3BYTE_BGR, TYPE_4BYTE_ABGR,
+                                        TYPE_4BYTE_ABGR_PRE,
+                                        /*TYPE_USHORT_565_RGB,
+                                        TYPE_USHORT_555_RGB, TYPE_BYTE_GRAY,
+                                        TYPE_USHORT_GRAY,*/ TYPE_BYTE_BINARY,
+                                        TYPE_BYTE_INDEXED};
+    private static final int[] TRANSPARENCIES = {OPAQUE, BITMASK, TRANSLUCENT};
+
+    public static void main(final String[] args) throws IOException {
+        for (final int viType : TRANSPARENCIES) {
+            for (final int biType : TYPES) {
+                BufferedImage bi = makeUnmanagedBI(biType);
+                fill(bi);
+                test(bi, viType);
+            }
+        }
+    }
+
+    private static void test(BufferedImage bi, int type)
+            throws IOException {
+        GraphicsEnvironment ge = GraphicsEnvironment
+                .getLocalGraphicsEnvironment();
+        GraphicsConfiguration gc = ge.getDefaultScreenDevice()
+                                     .getDefaultConfiguration();
+        VolatileImage vi = gc.createCompatibleVolatileImage(511, 255, type);
+        BufferedImage gold = gc.createCompatibleImage(511, 255, type);
+        // draw to compatible Image
+        Graphics2D big = gold.createGraphics();
+        // force scaled blit
+        big.drawImage(bi, 7, 11, 127, 111, 7, 11, 127 * 2, 111, null);
+        big.dispose();
+        // draw to volatile image
+        BufferedImage snapshot;
+        while (true) {
+            vi.validate(gc);
+            if (vi.validate(gc) != VolatileImage.IMAGE_OK) {
+                try {
+                    Thread.sleep(100);
+                } catch (final InterruptedException ignored) {
+                }
+                continue;
+            }
+            Graphics2D vig = vi.createGraphics();
+            // force scaled blit
+            vig.drawImage(bi, 7, 11, 127, 111, 7, 11, 127 * 2, 111, null);
+            vig.dispose();
+            snapshot = vi.getSnapshot();
+            if (vi.contentsLost()) {
+                try {
+                    Thread.sleep(100);
+                } catch (final InterruptedException ignored) {
+                }
+                continue;
+            }
+            break;
+        }
+        // validate images
+        for (int x = 7; x < 127; ++x) {
+            for (int y = 11; y < 111; ++y) {
+                if (gold.getRGB(x, y) != snapshot.getRGB(x, y)) {
+                    ImageIO.write(gold, "png", new File("gold.png"));
+                    ImageIO.write(snapshot, "png", new File("bi.png"));
+                    throw new RuntimeException("Test failed.");
+                }
+            }
+        }
+    }
+
+    private static BufferedImage makeUnmanagedBI(final int type) {
+        final BufferedImage bi = new BufferedImage(511, 255, type);
+        final DataBuffer db = bi.getRaster().getDataBuffer();
+        if (db instanceof DataBufferInt) {
+            ((DataBufferInt) db).getData();
+        } else if (db instanceof DataBufferShort) {
+            ((DataBufferShort) db).getData();
+        } else if (db instanceof DataBufferByte) {
+            ((DataBufferByte) db).getData();
+        } else {
+            try {
+                bi.setAccelerationPriority(0.0f);
+            } catch (final Throwable ignored) {
+            }
+        }
+        return bi;
+    }
+
+    private static void fill(final Image image) {
+        final Graphics2D graphics = (Graphics2D) image.getGraphics();
+        graphics.setComposite(AlphaComposite.Src);
+        for (int i = 0; i < image.getHeight(null); ++i) {
+            graphics.setColor(new Color(i, 0, 0));
+            graphics.fillRect(0, i, image.getWidth(null), 1);
+        }
+        graphics.dispose();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/DrawImage/UnmanagedDrawImagePerformance.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,125 @@
+/*
+ * 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.
+ */
+
+import java.awt.AlphaComposite;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Image;
+import java.awt.Polygon;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.DataBufferInt;
+import java.awt.image.DataBufferShort;
+import java.awt.image.VolatileImage;
+
+import static java.awt.Transparency.*;
+import static java.awt.image.BufferedImage.*;
+
+/*
+ * @test
+ * @bug 8029253
+ * @summary Unmanaged images should be drawn fast.
+ * @author Sergey Bylokhov
+ */
+public final class UnmanagedDrawImagePerformance {
+
+    private static final int[] TYPES = {TYPE_INT_RGB, TYPE_INT_ARGB,
+                                        TYPE_INT_ARGB_PRE, TYPE_INT_BGR,
+                                        TYPE_3BYTE_BGR, TYPE_4BYTE_ABGR,
+                                        TYPE_4BYTE_ABGR_PRE,
+                                        TYPE_USHORT_565_RGB,
+                                        TYPE_USHORT_555_RGB, TYPE_BYTE_GRAY,
+                                        TYPE_USHORT_GRAY, TYPE_BYTE_BINARY,
+                                        TYPE_BYTE_INDEXED};
+    private static final int[] TRANSPARENCIES = {OPAQUE, BITMASK, TRANSLUCENT};
+    private static final int SIZE = 1000;
+    private static final AffineTransform[] TRANSFORMS = {
+            AffineTransform.getScaleInstance(.5, .5),
+            AffineTransform.getScaleInstance(1, 1),
+            AffineTransform.getScaleInstance(2, 2),
+            AffineTransform.getShearInstance(7, 11)};
+
+    public static void main(final String[] args) {
+        for (final AffineTransform atfm : TRANSFORMS) {
+            for (final int viType : TRANSPARENCIES) {
+                for (final int biType : TYPES) {
+                    final BufferedImage bi = makeUnmanagedBI(biType);
+                    final VolatileImage vi = makeVI(viType);
+                    final long time = test(bi, vi, atfm) / 1000000000;
+                    if (time > 1) {
+                        throw new RuntimeException(String.format(
+                                "drawImage is slow: %d seconds", time));
+                    }
+                }
+            }
+        }
+    }
+
+    private static long test(Image bi, Image vi, AffineTransform atfm) {
+        final Polygon p = new Polygon();
+        p.addPoint(0, 0);
+        p.addPoint(SIZE, 0);
+        p.addPoint(0, SIZE);
+        p.addPoint(SIZE, SIZE);
+        p.addPoint(0, 0);
+        Graphics2D g2d = (Graphics2D) vi.getGraphics();
+        g2d.clip(p);
+        g2d.transform(atfm);
+        g2d.setComposite(AlphaComposite.SrcOver);
+        final long start = System.nanoTime();
+        g2d.drawImage(bi, 0, 0, null);
+        final long time = System.nanoTime() - start;
+        g2d.dispose();
+        return time;
+    }
+
+    private static VolatileImage makeVI(final int type) {
+        final GraphicsEnvironment ge = GraphicsEnvironment
+                .getLocalGraphicsEnvironment();
+        final GraphicsDevice gd = ge.getDefaultScreenDevice();
+        final GraphicsConfiguration gc = gd.getDefaultConfiguration();
+        return gc.createCompatibleVolatileImage(SIZE, SIZE, type);
+    }
+
+    private static BufferedImage makeUnmanagedBI(final int type) {
+        final BufferedImage img = new BufferedImage(SIZE, SIZE, type);
+        final DataBuffer db = img.getRaster().getDataBuffer();
+        if (db instanceof DataBufferInt) {
+            ((DataBufferInt) db).getData();
+        } else if (db instanceof DataBufferShort) {
+            ((DataBufferShort) db).getData();
+        } else if (db instanceof DataBufferByte) {
+            ((DataBufferByte) db).getData();
+        } else {
+            try {
+                img.setAccelerationPriority(0.0f);
+            } catch (final Throwable ignored) {
+            }
+        }
+        return img;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/ImagePrinting/NullClipARGB.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+/**
+ * @test
+ * @bug 8061392
+ * @summary Test no NPE when printing transparency with null clip.
+ */
+
+import java.awt.*;
+import java.awt.image.*;
+import java.awt.print.*;
+
+public class NullClipARGB implements Printable {
+
+    public static void main( String[] args ) {
+
+        try {
+            PrinterJob pj = PrinterJob.getPrinterJob();
+            pj.setPrintable(new NullClipARGB());
+            pj.print();
+            } catch (Exception ex) {
+             throw new RuntimeException(ex);
+        }
+    }
+
+    public int print(Graphics g, PageFormat pf, int pageIndex)
+               throws PrinterException{
+
+        if (pageIndex != 0) {
+            return NO_SUCH_PAGE;
+        }
+        Graphics2D g2 = (Graphics2D)g;
+        System.out.println("original clip="+g2.getClip());
+        g2.translate(pf.getImageableX(), pf.getImageableY());
+        g2.rotate(0.2);
+        g2.setClip(null);
+        g2.setColor( Color.BLACK );
+        g2.drawString("This text should be visible through the image", 0, 20);
+        BufferedImage bi = new BufferedImage(100, 100,
+                                              BufferedImage.TYPE_INT_ARGB );
+        Graphics ig = bi.createGraphics();
+        ig.setColor( new Color( 192, 192, 192, 80 ) );
+        ig.fillRect( 0, 0, 100, 100 );
+        ig.setColor( Color.BLACK );
+        ig.drawRect( 0, 0, 99, 99 );
+        ig.dispose();
+        g2.drawImage(bi, 10, 0, 90, 90, null );
+        g2.translate(100, 100);
+        g2.drawString("This text should also be visible through the image", 0, 20);
+        g2.drawImage(bi, 10, 0, 90, 90, null );
+        return PAGE_EXISTS;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/PageRangesDlgTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+/**
+ * @test
+ * @bug 8061267
+ * @summary The specified page range should be displayed in the dialog
+ * @run main/manual=yesno PageRangesDlgTest
+ */
+
+import javax.print.*;
+import javax.print.attribute.*;
+import javax.print.attribute.standard.*;
+import java.awt.*;
+import java.awt.print.*;
+
+public class PageRangesDlgTest implements Printable {
+
+    static String[] instr = {
+     "This test is to check that the print dialog displays the specified",
+     "page ranges. You must have a printer installed for this test.",
+     "It is valid only on dialogs which support page ranges",
+     "In each dialog, check that a page range of 2 to 3 is requested",
+     "Optionally press Print instead of Cancel, and verify that the",
+     "correct number/set of pages is printed",
+    };
+
+    public static void main(String args[]) throws Exception {
+        for (int i=0;i<instr.length;i++) {
+            System.out.println(instr[i]);
+        }
+        PrinterJob job = PrinterJob.getPrinterJob();
+        if (job.getPrintService() == null) {
+           System.out.println("No printers. Test cannot continue.");
+           return;
+        }
+        job.setPrintable(new PageRangesDlgTest());
+        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
+        aset.add(new PageRanges(2,3));
+        if (job.printDialog(aset)) {
+           job.print(aset);
+        }
+
+        job = PrinterJob.getPrinterJob();
+        job.setPrintable(new PageRangesDlgTest());
+        aset.add(DialogTypeSelection.NATIVE);
+        if (job.printDialog()) {
+            job.print();
+        }
+    }
+
+    public int print(Graphics g, PageFormat pf, int pi)
+                     throws PrinterException  {
+
+        System.out.println("pi="+pi);
+        if (pi >= 5) {
+            return NO_SUCH_PAGE;
+        }
+
+        g.drawString("Page : " + (pi+1), 200, 200);
+
+        return PAGE_EXISTS;
+    }
+}
--- a/jdk/test/java/io/FileDescriptor/Finalize.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/io/FileDescriptor/Finalize.java	Wed Jul 05 20:06:12 2017 +0200
@@ -245,9 +245,10 @@
          * write to fc2 - when fos1 is gc'ed and finalizer is run,
          * write to fc2 should not fail
          */
-        bb = ByteBuffer.allocateDirect(data.length);
-        bb = bb.put(data);
-        bb = (ByteBuffer) bb.flip();
+        bb = ByteBuffer.allocateDirect(data.length)
+                       .put(data)
+                       .flip();
+
         ret = fc2.write(bb);
         System.out.println("Wrote:" +  ret + " bytes to fc2");
         fc2.close();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/io/FileDescriptor/RememberAppend.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8023173
+ * @summary FileDescriptor should respect append flag
+ */
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileOutputStream;
+
+public class RememberAppend {
+    private static final byte[] bytes = "ABC ".getBytes();
+
+    public static void main(String[] args) throws Throwable {
+        File f = File.createTempFile("tmp.file", null);
+        f.deleteOnExit();
+
+        try (FileOutputStream fos1 = new FileOutputStream(f.getPath(), true)) {
+            fos1.write(bytes);
+        }
+
+        try (FileOutputStream fos1 = new FileOutputStream(f.getPath(), true);
+             FileOutputStream fos2 = new FileOutputStream(fos1.getFD())) {
+            fos2.write(bytes);
+        }
+
+        if (f.length() != 2 * bytes.length) {
+            throw new RuntimeException("Append flag ignored");
+        }
+    }
+}
--- a/jdk/test/java/lang/instrument/DaemonThread/TestDaemonThread.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/lang/instrument/DaemonThread/TestDaemonThread.java	Wed Jul 05 20:06:12 2017 +0200
@@ -28,7 +28,7 @@
  *
  * @build jdk.testlibrary.* DummyAgent DummyClass TestDaemonThreadLauncher TestDaemonThread
  * @run shell ../MakeJAR3.sh DummyAgent
- * @run main TestDaemonThreadLauncher /timeout=240
+ * @run main/timeout=240 TestDaemonThreadLauncher
  *
  */
 import java.io.File;
--- a/jdk/test/java/net/URLPermission/URLTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/net/URLPermission/URLTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -29,11 +29,11 @@
  * @bug 8010464
  * @library /lib/testlibrary/
  * @build jdk.testlibrary.SimpleSSLContext
- * @run main/othervm/policy=policy.1 URLTest one
+ * @run main/othervm/java.security.policy=policy.1 URLTest one
  * @run main/othervm URLTest one
- * @run main/othervm/policy=policy.2 URLTest two
+ * @run main/othervm/java.security.policy=policy.2 URLTest two
  * @run main/othervm URLTest two
- * @run main/othervm/policy=policy.3 URLTest three
+ * @run main/othervm/java.security.policy=policy.3 URLTest three
  * @run main/othervm URLTest three
  */
 
--- a/jdk/test/java/net/URLPermission/policy.1	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/net/URLPermission/policy.1	Wed Jul 05 20:06:12 2017 +0200
@@ -37,60 +37,3 @@
     permission "java.util.PropertyPermission" "test.src.path", "read";
 };
 
-// Normal permissions that aren't granted when run under jtreg
-grant codeBase "file:${java.home}/lib/ext/ucrypto.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2ucrypto";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.OracleUcrypto";
-        permission java.security.SecurityPermission "clearProviderProperties.OracleUcrypto";
-        permission java.security.SecurityPermission "removeProviderProperty.OracleUcrypto";
-        permission java.io.FilePermission "${java.home}/lib/security/ucrypto-solaris.cfg", "read";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunec.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "loadLibrary.sunec";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunEC";
-        permission java.security.SecurityPermission "clearProviderProperties.SunEC";
-        permission java.security.SecurityPermission "removeProviderProperty.SunEC";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunjce_provider.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunJCE";
-        permission java.security.SecurityPermission "clearProviderProperties.SunJCE";
-        permission java.security.SecurityPermission "removeProviderProperty.SunJCE";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2pkcs11";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.*";
-        permission java.security.SecurityPermission "clearProviderProperties.*";
-        permission java.security.SecurityPermission "removeProviderProperty.*";
-        permission java.security.SecurityPermission "getProperty.auth.login.defaultCallbackHandler";
-        permission java.security.SecurityPermission "authProvider.*";
-        // Needed for reading PKCS11 config file and NSS library check
-        permission java.io.FilePermission "<<ALL FILES>>", "read";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunmscapi.jar" {
-        Permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "loadLibrary.sunmscapi";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunMSCAPI";
-        permission java.security.SecurityPermission "clearProviderProperties.SunMSCAPI";
-        permission java.security.SecurityPermission "removeProviderProperty.SunMSCAPI";
-};
-
-grant codeBase "file:${{java.home}}/jre/lib/rt.jar" {
-        permission java.security.AllPermission;
-};
-
--- a/jdk/test/java/net/URLPermission/policy.2	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/net/URLPermission/policy.2	Wed Jul 05 20:06:12 2017 +0200
@@ -37,60 +37,3 @@
     permission "java.util.PropertyPermission" "test.src.path", "read";
 };
 
-// Normal permissions that aren't granted when run under jtreg
-grant codeBase "file:${java.home}/lib/ext/ucrypto.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2ucrypto";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.OracleUcrypto";
-        permission java.security.SecurityPermission "clearProviderProperties.OracleUcrypto";
-        permission java.security.SecurityPermission "removeProviderProperty.OracleUcrypto";
-        permission java.io.FilePermission "${java.home}/lib/security/ucrypto-solaris.cfg", "read";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunec.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "loadLibrary.sunec";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunEC";
-        permission java.security.SecurityPermission "clearProviderProperties.SunEC";
-        permission java.security.SecurityPermission "removeProviderProperty.SunEC";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunjce_provider.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunJCE";
-        permission java.security.SecurityPermission "clearProviderProperties.SunJCE";
-        permission java.security.SecurityPermission "removeProviderProperty.SunJCE";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2pkcs11";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.*";
-        permission java.security.SecurityPermission "clearProviderProperties.*";
-        permission java.security.SecurityPermission "removeProviderProperty.*";
-        permission java.security.SecurityPermission "getProperty.auth.login.defaultCallbackHandler";
-        permission java.security.SecurityPermission "authProvider.*";
-        // Needed for reading PKCS11 config file and NSS library check
-        permission java.io.FilePermission "<<ALL FILES>>", "read";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunmscapi.jar" {
-        Permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "loadLibrary.sunmscapi";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunMSCAPI";
-        permission java.security.SecurityPermission "clearProviderProperties.SunMSCAPI";
-        permission java.security.SecurityPermission "removeProviderProperty.SunMSCAPI";
-};
-
-grant codeBase "file:///export/repos/jdk8/build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/jre/lib/rt.jar" {
-        permission java.security.AllPermission;
-};
-
--- a/jdk/test/java/net/URLPermission/policy.3	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/net/URLPermission/policy.3	Wed Jul 05 20:06:12 2017 +0200
@@ -36,61 +36,3 @@
     permission "java.lang.RuntimePermission" "setFactory";
     permission "java.util.PropertyPermission" "test.src.path", "read";
 };
-
-// Normal permissions that aren't granted when run under jtreg
-grant codeBase "file:${java.home}/lib/ext/ucrypto.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2ucrypto";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.OracleUcrypto";
-        permission java.security.SecurityPermission "clearProviderProperties.OracleUcrypto";
-        permission java.security.SecurityPermission "removeProviderProperty.OracleUcrypto";
-        permission java.io.FilePermission "${java.home}/lib/security/ucrypto-solaris.cfg", "read";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunec.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "loadLibrary.sunec";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunEC";
-        permission java.security.SecurityPermission "clearProviderProperties.SunEC";
-        permission java.security.SecurityPermission "removeProviderProperty.SunEC";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunjce_provider.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunJCE";
-        permission java.security.SecurityPermission "clearProviderProperties.SunJCE";
-        permission java.security.SecurityPermission "removeProviderProperty.SunJCE";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2pkcs11";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.*";
-        permission java.security.SecurityPermission "clearProviderProperties.*";
-        permission java.security.SecurityPermission "removeProviderProperty.*";
-        permission java.security.SecurityPermission "getProperty.auth.login.defaultCallbackHandler";
-        permission java.security.SecurityPermission "authProvider.*";
-        // Needed for reading PKCS11 config file and NSS library check
-        permission java.io.FilePermission "<<ALL FILES>>", "read";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunmscapi.jar" {
-        Permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "loadLibrary.sunmscapi";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunMSCAPI";
-        permission java.security.SecurityPermission "clearProviderProperties.SunMSCAPI";
-        permission java.security.SecurityPermission "removeProviderProperty.SunMSCAPI";
-};
-
-grant codeBase "file:${{java.home}}/jre/lib/rt.jar" {
-        permission java.security.AllPermission;
-};
-
--- a/jdk/test/java/nio/charset/CharsetEncoder/Flush.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/nio/charset/CharsetEncoder/Flush.java	Wed Jul 05 20:06:12 2017 +0200
@@ -35,7 +35,7 @@
 public class Flush {
     private static byte[] contents(ByteBuffer bb) {
         byte[] contents = new byte[bb.position()];
-        ((ByteBuffer)(bb.duplicate().flip())).get(contents);
+        bb.duplicate().flip().get(contents);
         return contents;
     }
 
--- a/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ActivateFails.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/ActivateFails.java	Wed Jul 05 20:06:12 2017 +0200
@@ -33,7 +33,7 @@
  * @library ../../../testlibrary
  * @build TestLibrary RMID ActivationLibrary
  *     ActivateMe ActivateFails_Stub ShutdownThread
- * @run main/othervm/policy=security.policy/timeout=240 ActivateFails
+ * @run main/othervm/java.security.policy=security.policy/timeout=240 ActivateFails
  */
 
 import java.rmi.*;
--- a/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/security.policy	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/rmi/activation/ActivateFailedException/activateFails/security.policy	Wed Jul 05 20:06:12 2017 +0200
@@ -2,10 +2,6 @@
  * security policy used by the test process
  */
 
-grant codeBase "file:${java.home}/lib/ext/*" {
-    permission java.security.AllPermission;
-};
-
 grant {
   // standard test activation permissions
   permission java.io.FilePermission "..${/}..${/}test.props", "read";
--- a/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted.java	Wed Jul 05 20:06:12 2017 +0200
@@ -29,7 +29,7 @@
  * @library ../../../testlibrary
  * @build TestLibrary RMID ActivationLibrary
  *     CanCreateStubs StubClassesPermitted_Stub
- * @run main/othervm/policy=security.policy/secure=java.lang.SecurityManager/timeout=240 StubClassesPermitted
+ * @run main/othervm/java.security.policy=security.policy/secure=java.lang.SecurityManager/timeout=240 StubClassesPermitted
  */
 
 import java.io.*;
--- a/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/security.policy	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/security.policy	Wed Jul 05 20:06:12 2017 +0200
@@ -2,10 +2,6 @@
  * security policy used by the test process
  */
 
-grant codeBase "file:${java.home}/lib/ext/*" {
-    permission java.security.AllPermission;
-};
-
 grant {
   // standard test activation permissions
   permission java.io.FilePermission "..${/}..${/}test.props", "read";
--- a/jdk/test/java/security/KeyRep/Serial.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/security/KeyRep/Serial.java	Wed Jul 05 20:06:12 2017 +0200
@@ -26,7 +26,7 @@
  * @bug 4532506 4999599
  * @summary Serializing KeyPair on one VM (Sun),
  *      and Deserializing on another (IBM) fails
- * @run main/othervm/policy=Serial.policy Serial
+ * @run main/othervm/java.security.policy=Serial.policy Serial
  */
 
 import java.io.*;
--- a/jdk/test/java/security/KeyRep/Serial.policy	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/security/KeyRep/Serial.policy	Wed Jul 05 20:06:12 2017 +0200
@@ -1,12 +1,3 @@
-grant codeBase "file:${java.home}/lib/ext/sunjce_provider.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunJCE";
-        permission java.security.SecurityPermission "clearProviderProperties.SunJCE";
-        permission java.security.SecurityPermission "removeProviderProperty.SunJCE";
-};
-
 grant {
     // XXX note package access is *not* granted to the 'sun' package
 };
--- a/jdk/test/java/security/KeyRep/SerialDSAPubKey.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/security/KeyRep/SerialDSAPubKey.java	Wed Jul 05 20:06:12 2017 +0200
@@ -26,7 +26,7 @@
  * @bug 6232513
  * @summary RMI interoperability issue with DSAPublicKey obj between
  *              JDK1.4 & JDK1.5
- * @run main/othervm/policy=SerialDSAPubKey.policy -Dsun.security.key.serial.interop=true -Dsun.security.pkcs11.enable-solaris=false SerialDSAPubKey
+ * @run main/othervm/java.security.policy=SerialDSAPubKey.policy -Dsun.security.key.serial.interop=true -Dsun.security.pkcs11.enable-solaris=false SerialDSAPubKey
  */
 
 import java.io.*;
--- a/jdk/test/java/security/KeyRep/SerialOld.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/security/KeyRep/SerialOld.java	Wed Jul 05 20:06:12 2017 +0200
@@ -26,7 +26,7 @@
  * @bug 4532506
  * @summary Serializing KeyPair on one VM (Sun),
  *      and Deserializing on another (IBM) fails
- * @run main/othervm/policy=SerialOld.policy SerialOld
+ * @run main/othervm/java.security.policy=SerialOld.policy SerialOld
  */
 
 import java.io.*;
--- a/jdk/test/java/security/KeyRep/SerialOld.policy	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/security/KeyRep/SerialOld.policy	Wed Jul 05 20:06:12 2017 +0200
@@ -1,55 +1,3 @@
-grant codeBase "file:${java.home}/lib/ext/ucrypto.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2ucrypto";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.OracleUcrypto";
-        permission java.security.SecurityPermission "clearProviderProperties.OracleUcrypto";
-        permission java.security.SecurityPermission "removeProviderProperty.OracleUcrypto";
-        permission java.io.FilePermission "${java.home}/lib/security/ucrypto-solaris.cfg", "read";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunec.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "loadLibrary.sunec";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunEC";
-        permission java.security.SecurityPermission "clearProviderProperties.SunEC";
-        permission java.security.SecurityPermission "removeProviderProperty.SunEC";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunjce_provider.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunJCE";
-        permission java.security.SecurityPermission "clearProviderProperties.SunJCE";
-        permission java.security.SecurityPermission "removeProviderProperty.SunJCE";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2pkcs11";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.*";
-        permission java.security.SecurityPermission "clearProviderProperties.*";
-        permission java.security.SecurityPermission "removeProviderProperty.*";
-        permission java.security.SecurityPermission "getProperty.auth.login.defaultCallbackHandler";
-        permission java.security.SecurityPermission "authProvider.*";
-        // Needed for reading PKCS11 config file and NSS library check
-        permission java.io.FilePermission "<<ALL FILES>>", "read";
-};
-
-grant codeBase "file:${java.home}/lib/ext/sunmscapi.jar" {
-        Permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "loadLibrary.sunmscapi";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunMSCAPI";
-        permission java.security.SecurityPermission "clearProviderProperties.SunMSCAPI";
-        permission java.security.SecurityPermission "removeProviderProperty.SunMSCAPI";
-};
-
 grant {
 
     permission java.io.FilePermission "${test.src}${file.separator}*", "read";
--- a/jdk/test/java/security/Security/removing/RemoveStaticProvider.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/security/Security/removing/RemoveStaticProvider.java	Wed Jul 05 20:06:12 2017 +0200
@@ -25,7 +25,7 @@
  * @test
  * @bug 4420687
  * @summary Make sure that a removed provider won't be acceessable.
- * @run main/othervm/policy=RemoveStaticProvider.policy RemoveStaticProvider
+ * @run main/othervm/java.security.policy=RemoveStaticProvider.policy RemoveStaticProvider
  */
 import java.security.*;
 import javax.crypto.*;
--- a/jdk/test/java/security/Security/removing/RemoveStaticProvider.policy	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/java/security/Security/removing/RemoveStaticProvider.policy	Wed Jul 05 20:06:12 2017 +0200
@@ -1,13 +1,3 @@
-
-grant codeBase "file:${java.home}/lib/ext/sunjce_provider.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.SunJCE";
-        permission java.security.SecurityPermission "clearProviderProperties.SunJCE";
-        permission java.security.SecurityPermission "removeProviderProperty.SunJCE";
-};
-
 grant {
     permission java.security.SecurityPermission "removeProvider.SunJCE";
     permission java.security.SecurityPermission "insertProvider.SunJCE";
--- a/jdk/test/java/sql/TEST.properties	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-# JDBC unit tests uses TestNG
-TestNG.dirs = .
-
--- a/jdk/test/java/sql/test/sql/BatchUpdateExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,326 +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 test.sql;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.ObjectInputStream;
-import java.sql.BatchUpdateException;
-import java.sql.SQLException;
-import java.util.Arrays;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.SerializedBatchUpdateException;
-import util.BaseTest;
-
-public class BatchUpdateExceptionTests extends BaseTest {
-
-    private final int[] uc = {1, 2, 3};
-    private final long[] luc = {1, 2, 3};
-
-    private final String testSrcDir = System.getProperty("test.src", ".")
-            + File.separatorChar;
-
-    /**
-     * Create BatchUpdateException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        BatchUpdateException be = new BatchUpdateException(null,
-                null, errorCode, (int[]) null, null);
-        assertTrue(be.getMessage() == null && be.getSQLState() == null
-                && be.getUpdateCounts() == null && be.getCause() == null
-                && be.getLargeUpdateCounts() == null
-                && be.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create BatchUpdateException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        BatchUpdateException ex = new BatchUpdateException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && ex.getUpdateCounts() == null
-                && ex.getLargeUpdateCounts() == null);
-    }
-
-    /**
-     * Create BatchUpdateException with null Throwable
-     */
-    @Test
-    public void test2() {
-        BatchUpdateException ex = new BatchUpdateException((Throwable) null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && ex.getUpdateCounts() == null
-                && ex.getLargeUpdateCounts() == null);
-    }
-
-    /**
-     * Create BatchUpdateException with message and update counts
-     */
-    @Test
-    public void test3() {
-
-        BatchUpdateException ex = new BatchUpdateException(reason, uc);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && Arrays.equals(ex.getUpdateCounts(), uc)
-                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
-        );
-    }
-
-    /**
-     * Create BatchUpdateException with update counts
-     */
-    @Test
-    public void test4() {
-        BatchUpdateException ex = new BatchUpdateException(uc);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && Arrays.equals(ex.getUpdateCounts(), uc)
-                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
-        );
-    }
-
-    /**
-     * Create BatchUpdateException with Throwable and update counts
-     */
-    @Test
-    public void test5() {
-        BatchUpdateException ex = new BatchUpdateException(uc, t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0
-                && Arrays.equals(ex.getUpdateCounts(), uc)
-                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
-        );
-    }
-
-    /**
-     * Create BatchUpdateException with message, Throwable, and update counts
-     */
-    @Test
-    public void test6() {
-        BatchUpdateException ex = new BatchUpdateException(reason, uc, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0
-                && Arrays.equals(ex.getUpdateCounts(), uc)
-                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
-        );
-    }
-
-    /**
-     * Create BatchUpdateException with message, SQLState, Throwable, and update
-     * counts
-     */
-    @Test
-    public void test7() {
-        BatchUpdateException ex = new BatchUpdateException(reason, state, uc, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0
-                && Arrays.equals(ex.getUpdateCounts(), uc)
-                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
-        );
-    }
-
-    /**
-     * Create BatchUpdateException with message, SQLState, errorCode code
-     * Throwable, and update counts
-     */
-    @Test
-    public void test8() {
-        BatchUpdateException ex = new BatchUpdateException(reason, state, errorCode,
-                uc, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode
-                && Arrays.equals(ex.getUpdateCounts(), uc)
-                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
-        );
-    }
-
-    /**
-     * Create BatchUpdateException with message, SQLState, errorCode code
-     * Throwable, and long [] update counts
-     */
-    @Test
-    public void test9() {
-        BatchUpdateException ex = new BatchUpdateException(reason, state, errorCode,
-                luc, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode
-                && Arrays.equals(ex.getUpdateCounts(), uc)
-                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
-        );
-    }
-
-    /**
-     * Validate that a copy of the update counts array is made
-     */
-    @Test
-    public void test10() {
-        int[] uc1 = {1, 2};
-        BatchUpdateException ex = new BatchUpdateException(uc1);
-        assertTrue(Arrays.equals(ex.getUpdateCounts(), uc1));
-        uc1[0] = 6689;
-        assertFalse(Arrays.equals(ex.getUpdateCounts(), uc1));
-    }
-
-    /**
-     * Validate that if null is specified for the update count, it is returned
-     * as null
-     */
-    @Test
-    public void test11() {
-        BatchUpdateException ex = new BatchUpdateException((int[]) null);
-        assertTrue(ex.getMessage() == null && ex.getSQLState() == null
-                && ex.getErrorCode() == 0 && ex.getUpdateCounts() == null
-                && ex.getLargeUpdateCounts() == null);
-    }
-
-    /**
-     * Serialize a BatchUpdateException and make sure you can read it back
-     * properly
-     */
-    @Test
-    public void test12() throws Exception {
-        BatchUpdateException be = new BatchUpdateException(reason, state, errorCode,
-                uc, t);
-        BatchUpdateException bue
-                = createSerializedException(be);
-        assertTrue(reason.equals(bue.getMessage())
-                && bue.getSQLState().equals(state)
-                && cause.equals(bue.getCause().toString())
-                && bue.getErrorCode() == errorCode
-                && Arrays.equals(bue.getLargeUpdateCounts(), luc)
-                && Arrays.equals(bue.getUpdateCounts(), uc));
-    }
-
-
-
-    /**
-     * De-Serialize a BatchUpdateException from JDBC 4.0 and make sure you can
-     * read it back properly
-     */
-    @Test
-    public void test13() throws Exception {
-        String reason1 = "This was the error msg";
-        String state1 = "user defined sqlState";
-        String cause1 = "java.lang.Throwable: throw 1";
-        int errorCode1 = 99999;
-        Throwable t = new Throwable("throw 1");
-        int[] uc1 = {1, 2, 21};
-        long[] luc1 = {1, 2, 21};
-
-        ObjectInputStream ois = new ObjectInputStream(
-                new ByteArrayInputStream(SerializedBatchUpdateException.DATA));
-        BatchUpdateException bue = (BatchUpdateException) ois.readObject();
-        assertTrue(reason1.equals(bue.getMessage())
-                && bue.getSQLState().equals(state1)
-                && bue.getErrorCode() == errorCode1
-                && cause1.equals(bue.getCause().toString())
-                && Arrays.equals(bue.getLargeUpdateCounts(), luc1)
-                && Arrays.equals(bue.getUpdateCounts(), uc1));
-    }
-
-    /**
-     * Serialize a BatchUpdateException with an Integer.MAX_VALUE + 1 and
-     * validate you can read it back properly
-     */
-    @Test
-    public void test14() throws Exception {
-        int[] uc1 = {Integer.MAX_VALUE, Integer.MAX_VALUE + 1};
-        long[] luc1 = {Integer.MAX_VALUE, Integer.MAX_VALUE + 1};
-        BatchUpdateException be = new BatchUpdateException(reason, state, errorCode,
-                luc1, t);
-                BatchUpdateException bue
-                = createSerializedException(be);
-        assertTrue(reason.equals(bue.getMessage())
-                && bue.getSQLState().equals(state)
-                && cause.equals(bue.getCause().toString())
-                && bue.getErrorCode() == errorCode
-                && Arrays.equals(bue.getLargeUpdateCounts(), luc1)
-                && Arrays.equals(bue.getUpdateCounts(), uc1));
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test15() {
-        BatchUpdateException ex = new BatchUpdateException("Exception 1", uc, t1);
-        BatchUpdateException ex1 = new BatchUpdateException("Exception 2", uc);
-        BatchUpdateException ex2 = new BatchUpdateException("Exception 3", uc, t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test16() {
-        BatchUpdateException ex = new BatchUpdateException("Exception 1", uc,  t1);
-        BatchUpdateException ex1 = new BatchUpdateException("Exception 2", uc);
-        BatchUpdateException ex2 = new BatchUpdateException("Exception 3", uc, t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        SQLException sqe = ex;
-        int num = 0;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-}
--- a/jdk/test/java/sql/test/sql/DataTruncationTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +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 test.sql;
-
-import java.sql.DataTruncation;
-import java.sql.SQLException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class DataTruncationTests extends BaseTest {
-
-    private final String READ_TRUNCATION = "01004";
-    private final String WRITE_TRUNCATION = "22001";
-    private final String dtReason = "Data truncation";
-    private final int dterrorCode = 0;
-    private final String[] dtmsgs = {dtReason, "cause 1", dtReason,
-        dtReason, "cause 2"};
-    private boolean onRead = false;
-    private final boolean parameter = false;
-    private final int index = 21;
-    private final int dataSize = 25;
-    private final int transferSize = 10;
-
-    /**
-     * Create DataTruncation object indicating a truncation on read
-     */
-    @Test
-    public void test() {
-        onRead = true;
-        DataTruncation e = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize);
-        assertTrue(e.getMessage().equals(dtReason)
-                && e.getSQLState().equals(READ_TRUNCATION)
-                && e.getCause() == null
-                && e.getErrorCode() == dterrorCode
-                && e.getParameter() == parameter
-                && e.getRead() == onRead
-                && e.getDataSize() == dataSize
-                && e.getTransferSize() == transferSize
-                && e.getIndex() == index);
-    }
-
-    /**
-     * Create DataTruncation object indicating a truncation on write
-     */
-    @Test
-    public void test1() {
-        onRead = false;
-        DataTruncation e = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize);
-        assertTrue(e.getMessage().equals(dtReason)
-                && e.getSQLState().equals(WRITE_TRUNCATION)
-                && e.getCause() == null
-                && e.getErrorCode() == dterrorCode
-                && e.getParameter() == parameter
-                && e.getRead() == onRead
-                && e.getDataSize() == dataSize
-                && e.getTransferSize() == transferSize
-                && e.getIndex() == index);
-    }
-
-    /**
-     * Create DataTruncation object indicating a truncation on read with a
-     * Throwable
-     */
-    @Test
-    public void test2() {
-        onRead = true;
-        DataTruncation e = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize, t);
-        assertTrue(e.getMessage().equals(dtReason)
-                && e.getSQLState().equals(READ_TRUNCATION)
-                && cause.equals(e.getCause().toString())
-                && e.getErrorCode() == dterrorCode
-                && e.getParameter() == parameter
-                && e.getRead() == onRead
-                && e.getDataSize() == dataSize
-                && e.getTransferSize() == transferSize
-                && e.getIndex() == index);
-    }
-
-    /**
-     * Create DataTruncation object indicating a truncation on read with null
-     * specified for the Throwable
-     */
-    @Test
-    public void test3() {
-        onRead = true;;
-        DataTruncation e = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize, null);
-        assertTrue(e.getMessage().equals(dtReason)
-                && e.getSQLState().equals(READ_TRUNCATION)
-                && e.getCause() == null
-                && e.getErrorCode() == dterrorCode
-                && e.getParameter() == parameter
-                && e.getRead() == onRead
-                && e.getDataSize() == dataSize
-                && e.getTransferSize() == transferSize
-                && e.getIndex() == index);
-    }
-
-    /**
-     * Create DataTruncation object indicating a truncation on read and you can
-     * pass a -1 for the index
-     */
-    @Test
-    public void test4() {
-        onRead = true;
-        int negIndex = -1;
-        DataTruncation e = new DataTruncation(negIndex, parameter, onRead,
-                dataSize, transferSize);
-        assertTrue(e.getMessage().equals(dtReason)
-                && e.getSQLState().equals(READ_TRUNCATION)
-                && e.getCause() == null
-                && e.getErrorCode() == dterrorCode
-                && e.getParameter() == parameter
-                && e.getRead() == onRead
-                && e.getDataSize() == dataSize
-                && e.getTransferSize() == transferSize
-                && e.getIndex() == negIndex);
-    }
-
-    /**
-     * Serialize a DataTruncation and make sure you can read it back properly
-     */
-    @Test
-    public void test5() throws Exception {
-        DataTruncation e = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize);
-        DataTruncation ex1 = createSerializedException(e);
-        assertTrue(e.getMessage().equals(dtReason)
-                && e.getSQLState().equals(READ_TRUNCATION)
-                && e.getCause() == null
-                && e.getErrorCode() == dterrorCode
-                && e.getParameter() == parameter
-                && e.getRead() == onRead
-                && e.getDataSize() == dataSize
-                && e.getTransferSize() == transferSize
-                && e.getIndex() == index);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct using
-     * for-each loop
-     */
-    @Test
-    public void test11() {
-        DataTruncation ex = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize, t1);
-        DataTruncation ex1 = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize);
-        DataTruncation ex2 = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize, t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(dtmsgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct using
-     * traditional while loop
-     */
-    @Test
-    public void test12() {
-        DataTruncation ex = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize, t1);
-        DataTruncation ex1 = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize);
-        DataTruncation ex2 = new DataTruncation(index, parameter, onRead,
-                dataSize, transferSize, t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(dtmsgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(dtmsgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-}
--- a/jdk/test/java/sql/test/sql/DateTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,373 +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 test.sql;
-
-import java.sql.Date;
-import java.time.Instant;
-import java.time.LocalDate;
-import static org.testng.Assert.*;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class DateTests extends BaseTest {
-
-    /*
-     * Validate an IllegalArgumentException is thrown for an invalid Date string
-     */
-    @Test(dataProvider = "invalidDateValues",
-            expectedExceptions = IllegalArgumentException.class)
-    public void test(String d) throws Exception {
-        Date.valueOf(d);
-    }
-
-    /*
-     * Test that a date created from a date string is equal to the value
-     * returned from toString()
-     */
-    @Test(dataProvider = "validDateValues")
-    public void test00(String d, String expectedD) {
-        Date d1 = Date.valueOf(d);
-        Date d2 = Date.valueOf(expectedD);
-        assertTrue(d1.equals(d2) && d2.equals(d1)
-                && d1.toString().equals(expectedD), "Error d1 != d2");
-    }
-
-    /*
-     * Validate that a Date.after() returns false when same date is compared
-     */
-    @Test
-    public void test01() {
-        Date d = Date.valueOf("1961-08-30");
-        assertFalse(d.after(d), "Error d.after(d) = true");
-    }
-
-    /*
-     * Validate that a Date.after() returns true when later date is compared to
-     * earlier date
-     */
-    @Test
-    public void test2() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(System.currentTimeMillis());
-        assertTrue(d2.after(d), "Error d2.after(d) = false");
-    }
-
-    /*
-     * Validate that a Date.after() returns false when earlier date is compared
-     * to later date
-     */
-    @Test
-    public void test3() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(d.getTime());
-        assertFalse(d.after(d2), "Error d.after(d2) = true");
-    }
-
-    /*
-     * Validate that a Date.after() returns false when date compared to another
-     * date created from the original date
-     */
-    @Test
-    public void test4() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(d.getTime());
-        assertFalse(d.after(d2), "Error d.after(d2) = true");
-        assertFalse(d2.after(d), "Error d2.after(d) = true");
-    }
-
-    /*
-     * Validate that a Date.before() returns false when same date is compared
-     */
-    @Test
-    public void test5() {
-        Date d = Date.valueOf("1961-08-30");
-        assertFalse(d.before(d), "Error d.before(d) = true");
-    }
-
-    /*
-     * Validate that a Date.before() returns true when earlier date is compared
-     * to later date
-     */
-    @Test
-    public void test6() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(System.currentTimeMillis());
-        assertTrue(d.before(d2), "Error d.before(d2) = false");
-    }
-
-    /*
-     * Validate that a Date.before() returns false when later date is compared
-     * to earlier date
-     */
-    @Test
-    public void test7() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(d.getTime());
-        assertFalse(d2.before(d), "Error d2.before(d) = true");
-    }
-
-    /*
-     * Validate that a Date.before() returns false when date compared to another
-     * date created from the original date
-     */
-    @Test
-    public void test8() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(d.getTime());
-        assertFalse(d.before(d2), "Error d.before(d2) = true");
-        assertFalse(d2.before(d), "Error d2.before(d) = true");
-    }
-
-    /*
-     * Validate that a Date.compareTo returns 0 when both Date objects are the
-     * same
-     */
-    @Test
-    public void test9() {
-        Date d = Date.valueOf("1961-08-30");
-        assertTrue(d.compareTo(d) == 0, "Error d.compareTo(d) !=0");
-    }
-
-    /*
-     * Validate that a Date.compareTo returns 0 when both Date objects represent
-     * the same date
-     */
-    @Test
-    public void test10() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(d.getTime());
-        assertTrue(d.compareTo(d2) == 0, "Error d.compareTo(d2) !=0");
-    }
-
-    /*
-     * Validate that a Date.compareTo returns -1 when comparing a date to a
-     * later date
-     */
-    @Test
-    public void test11() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(System.currentTimeMillis());
-        assertTrue(d.compareTo(d2) == -1, "Error d.compareTo(d2) != -1");
-    }
-
-    /*
-     * Validate that a Date.compareTo returns 1 when comparing a date to an
-     * earlier date
-     */
-    @Test
-    public void test12() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(System.currentTimeMillis());
-        assertTrue(d2.compareTo(d) == 1, "Error d.compareTo(d2) != 1");
-    }
-
-    /*
-     * Validate that a Date made from a LocalDate are equal
-     */
-    @Test
-    public void test13() {
-        Date d = Date.valueOf("1961-08-30");
-        LocalDate ldt = d.toLocalDate();
-        Date d2 = Date.valueOf(ldt);
-        assertTrue(d.equals(d2), "Error d != d2");
-    }
-
-    /*
-     * Validate that a Date LocalDate value, made from a LocalDate are equal
-     */
-    @Test
-    public void test14() {
-        LocalDate ldt = LocalDate.now();
-        Date d = Date.valueOf(ldt);
-        assertTrue(ldt.equals(d.toLocalDate()),
-                "Error LocalDate values are not equal");
-    }
-
-    /*
-     * Validate an NPE occurs when a null LocalDate is passed to valueOf
-     */
-    @Test(expectedExceptions = NullPointerException.class)
-    public void test15() throws Exception {
-        LocalDate ld = null;
-        Date.valueOf(ld);
-    }
-
-    /*
-     * Validate an UnsupportedOperationException occurs when toInstant() is
-     * called
-     */
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void test16() throws Exception {
-        Date d = Date.valueOf("1961-08-30");
-        Instant instant = d.toInstant();
-    }
-
-    /*
-     * Validate that two Date objects are equal when one is created from the
-     * toString() of the other
-     */
-    @Test
-    public void test17() {
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = Date.valueOf(d.toString());
-        assertTrue(d.equals(d2) && d2.equals(d), "Error d != d2");
-    }
-
-    /*
-     * Validate that two Date values one created using valueOf and another via a
-     * constructor are equal
-     */
-    @Test
-    public void test18() {
-
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(61, 7, 30);
-        assertTrue(d.equals(d2), "Error d != d2");
-    }
-
-    /*
-     * Validate that two Date values one created using getTime() of the other
-     * are equal
-     */
-    @Test
-    public void test19() {
-
-        Date d = Date.valueOf("1961-08-30");
-        Date d2 = new Date(d.getTime());
-        assertTrue(d.equals(d2), "Error d != d2");
-    }
-
-    /*
-     * Validate that a Date value is equal to itself
-     */
-    @Test
-    public void test20() {
-
-        Date d = Date.valueOf("1961-08-30");
-        assertTrue(d.equals(d), "Error d != d");
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling getHours
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test21() throws Exception {
-        Date d = Date.valueOf("1961-08-30");
-        d.getHours();
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling getMinutes
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test22() throws Exception {
-        Date d = Date.valueOf("1961-08-30");
-        d.getMinutes();
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling getSeconds
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test23() throws Exception {
-        Date d = Date.valueOf("1961-08-30");
-        d.getSeconds();
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling setHours
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test24() throws Exception {
-        Date d = Date.valueOf("1961-08-30");
-        d.setHours(8);
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling setMinutes
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test25() throws Exception {
-        Date d = Date.valueOf("1961-08-30");
-        d.setMinutes(0);
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling setSeconds
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test26() throws Exception {
-        Date d = Date.valueOf("1961-08-30");
-        d.setSeconds(0);
-    }
-
-    /*
-     * DataProvider used to provide Date which are not valid and are used
-     * to validate that an IllegalArgumentException will be thrown from the
-     * valueOf method
-     */
-    @DataProvider(name = "invalidDateValues")
-    private Object[][] invalidDateValues() {
-        return new Object[][]{
-            {"20009-11-01"},
-            {"09-11-01"},
-            {"-11-01"},
-            {"2009-111-01"},
-            {"2009--01"},
-            {"2009-13-01"},
-            {"2009-11-011"},
-            {"2009-11-"},
-            {"2009-11-00"},
-            {"2009-11-33"},
-            {"--"},
-            {""},
-            {null},
-            {"-"},
-            {"2009"},
-            {"2009-01"},
-            {"---"},
-            {"2009-13--1"},
-            {"1900-1-0"},
-            {"2009-01-01 10:50:01"},
-            {"1996-12-10 12:26:19.1"},
-            {"10:50:01"}
-        };
-    }
-
-    /*
-     * DataProvider used to provide Dates which are  valid and are used
-     * to validate that an IllegalArgumentException will not be thrown from the
-     * valueOf method and the corect value from toString() is returned
-     */
-    @DataProvider(name = "validDateValues")
-    private Object[][] validDateValues() {
-        return new Object[][]{
-            {"2009-08-30", "2009-08-30"},
-            {"2009-01-8", "2009-01-08"},
-            {"2009-1-01", "2009-01-01"},
-            {"2009-1-1", "2009-01-01"}
-
-        };
-    }
-}
--- a/jdk/test/java/sql/test/sql/DriverManagerPermissionsTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,154 +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 test.sql;
-
-import java.security.AccessControlException;
-import java.security.Policy;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-import util.BaseTest;
-import util.StubDriver;
-import util.TestPolicy;
-
-public class DriverManagerPermissionsTests extends BaseTest {
-
-    private  static Policy policy;
-    private static SecurityManager sm;
-
-    /*
-     * Install a SecurityManager along with a base Policy to allow testNG to run
-     */
-    @BeforeClass
-    public static void setUpClass() throws Exception {
-        setPolicy(new TestPolicy());
-        System.setSecurityManager(new SecurityManager());
-    }
-
-    /*
-     * Install the original Policy and SecurityManager
-     */
-    @AfterClass
-    public static void tearDownClass() throws Exception {
-        System.setSecurityManager(sm);
-        setPolicy(policy);
-    }
-
-    /*
-     * Save off the original Policy and SecurityManager
-     */
-    public DriverManagerPermissionsTests() {
-        policy = Policy.getPolicy();
-        sm = System.getSecurityManager();
-    }
-
-    /*
-     * Validate that AccessControlException is thrown if SQLPermission("setLog")
-     * has not been granted
-     */
-    @Test(expectedExceptions = AccessControlException.class)
-    public void test() {
-        setPolicy(new TestPolicy());
-        DriverManager.setLogStream(null);
-    }
-
-    /*
-     * Validate that setLogStream succeeds if SQLPermission("setLog") has been
-     * granted
-     */
-    @Test
-    public void test1() {
-        Policy.setPolicy(new TestPolicy("setLog"));
-        DriverManager.setLogStream(null);
-    }
-
-    /*
-     * Validate that setLogStream succeeds if AllPermissions has been granted
-     */
-    @Test
-    public void test2() {
-        setPolicy(new TestPolicy("all"));
-        DriverManager.setLogStream(null);
-    }
-
-    /*
-     * Validate that AccessControlException is thrown if SQLPermission("setLog")
-     * has not been granted
-     */
-    @Test(expectedExceptions = AccessControlException.class)
-    public void test4() {
-        setPolicy(new TestPolicy());
-        DriverManager.setLogWriter(null);
-    }
-
-    /*
-     * Validate that setLogWriter succeeds if SQLPermission("setLog") has been
-     * granted
-     */
-    @Test
-    public void test5() {
-        setPolicy(new TestPolicy("setLog"));
-        DriverManager.setLogWriter(null);
-    }
-
-    /*
-     * Validate that setLogWriter succeeds if AllPermissions has been granted
-     */
-    @Test
-    public void test6() {
-        setPolicy(new TestPolicy("all"));
-        DriverManager.setLogWriter(null);
-    }
-
-    /*
-     * Validate that AccessControlException is thrown if
-     * SQLPermission("deregisterDriver") has not been granted
-     */
-    @Test(expectedExceptions = AccessControlException.class)
-    public void test7() throws SQLException {
-        setPolicy(new TestPolicy());
-        DriverManager.deregisterDriver(new StubDriver());
-    }
-
-    /*
-     * Validate that deregisterDriver succeeds if
-     * SQLPermission("deregisterDriver") has been granted
-     */
-    @Test
-    public void test8() throws SQLException {
-        setPolicy(new TestPolicy("deregisterDriver"));
-        DriverManager.deregisterDriver(new StubDriver());
-    }
-
-    /*
-     * Validate that deregisterDriver succeeds if AllPermissions has been
-     * granted
-     */
-    @Test
-    public void test9() throws SQLException {
-        setPolicy(new TestPolicy("all"));
-        DriverManager.deregisterDriver(new StubDriver());
-    }
-}
--- a/jdk/test/java/sql/test/sql/DriverManagerTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,354 +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 test.sql;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.CharArrayReader;
-import java.io.CharArrayWriter;
-import java.io.File;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.sql.Driver;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.Properties;
-import static org.testng.Assert.*;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-import util.StubDriver;
-
-public class DriverManagerTests {
-
-    private final String StubDriverURL = "jdbc:tennis:boy";
-    private final String StubDriverDAURL = "jdbc:luckydog:tennis";
-    private final String InvalidURL = "jdbc:cardio:tennis";
-    private String[] results = {"output", "more output", "and more", "the end"};
-    private String noOutput = "should not find this";
-
-    public DriverManagerTests() {
-    }
-
-    @BeforeClass
-    public static void setUpClass() throws Exception {
-    }
-
-    @AfterClass
-    public static void tearDownClass() throws Exception {
-    }
-
-    @BeforeMethod
-    public void setUpMethod() throws Exception {
-        removeAllDrivers();
-    }
-
-    @AfterMethod
-    public void tearDownMethod() throws Exception {
-    }
-
-    /**
-     * Utility method to remove all registered drivers
-     */
-    private static void removeAllDrivers() {
-        java.util.Enumeration e = DriverManager.getDrivers();
-        while (e.hasMoreElements()) {
-            try {
-                DriverManager.deregisterDriver((Driver) (e.nextElement()));
-            } catch (SQLException ex) {
-                System.out.print(ex.getMessage());
-            }
-        }
-    }
-
-    /**
-     * Utility method to see if a driver is registered
-     */
-    private boolean isDriverRegistered(Driver d) {
-        boolean foundDriver = false;
-        java.util.Enumeration e = DriverManager.getDrivers();
-        while (e.hasMoreElements()) {
-            if (d == (Driver) e.nextElement()) {
-                foundDriver = true;
-                break;
-            }
-        }
-        return foundDriver;
-    }
-
-    /**
-     * Validate that values set using setLoginTimeout will be returned by
-     * getLoginTimeout
-     */
-    @Test
-    public void test() {
-        int[] vals = {-1, 0, 5};
-        for (int val : vals) {
-            DriverManager.setLoginTimeout(val);
-            assertEquals(val, DriverManager.getLoginTimeout());
-        }
-    }
-
-    /**
-     * Validate that NullPointerException is thrown when null is passed to
-     * registerDriver
-     */
-    @Test(expectedExceptions = NullPointerException.class)
-    public void test1() throws Exception {
-        Driver d = null;
-        DriverManager.registerDriver(d);
-    }
-
-    /**
-     * Validate that NullPointerException is thrown when null is passed to
-     * registerDriver
-     */
-    @Test(expectedExceptions = NullPointerException.class)
-    public void test2() throws Exception {
-        Driver d = null;
-        DriverManager.registerDriver(d, null);
-    }
-
-    /**
-     * Validate that a null value allows for deRegisterDriver to return
-     */
-    @Test
-    public void test3() throws Exception {
-        DriverManager.deregisterDriver(null);
-
-    }
-
-    /**
-     * Validate that SQLException is thrown when there is no Driver to service
-     * the URL
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test4() throws Exception {
-        DriverManager.getConnection(InvalidURL);
-    }
-
-    /**
-     * Validate that SQLException is thrown when there is no Driver to service
-     * the URL
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test5() throws Exception {
-        DriverManager.getConnection(InvalidURL, new Properties());
-    }
-
-    /**
-     * Validate that SQLException is thrown when there is no Driver to service
-     * the URL
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test6() throws Exception {
-        DriverManager.getConnection(InvalidURL, "LuckyDog", "tennisanyone");
-    }
-
-    /**
-     * Validate that SQLException is thrown when null is passed for the URL
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test7() throws Exception {
-        DriverManager.getConnection(null);
-    }
-
-    /**
-     * Validate that SQLException is thrown when null is passed for the URL
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test8() throws Exception {
-        DriverManager.getConnection(null, new Properties());
-    }
-
-    /**
-     * Validate that SQLException is thrown when null is passed for the URL
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test9() throws Exception {
-        DriverManager.getConnection(null, "LuckyDog", "tennisanyone");
-    }
-
-    /**
-     * Validate that SQLException is thrown when there is no Driver to service
-     * the URL
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test10() throws Exception {
-        DriverManager.getDriver(InvalidURL);
-    }
-
-    /**
-     * Validate that SQLException is thrown when null is passed for the URL
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test11() throws Exception {
-        DriverManager.getDriver(null);
-    }
-
-    /**
-     * Validate that a non-null Driver is returned by getDriver when a valid URL
-     * is specified
-     */
-    @Test
-    public void test12() throws Exception {
-
-        DriverManager.registerDriver(new StubDriver());
-        assertTrue(DriverManager.getDriver(StubDriverURL) != null);
-    }
-
-    /**
-     * Validate that SQLException is thrown when the URL is not valid for any of
-     * the registered drivers
-     */
-    @Test(expectedExceptions = SQLException.class)
-    public void test13() throws Exception {
-        DriverManager.registerDriver(new StubDriver());
-        DriverManager.getDriver(InvalidURL);
-    }
-
-    /**
-     * Validate that a Connection object is returned when a valid URL is
-     * specified to getConnection
-     *
-     */
-    @Test
-    public void test14() throws Exception {
-
-        DriverManager.registerDriver(new StubDriver());
-        assertTrue(
-                DriverManager.getConnection(StubDriverURL) != null);
-        assertTrue(DriverManager.getConnection(StubDriverURL,
-                "LuckyDog", "tennisanyone") != null);
-        Properties props = new Properties();
-        props.put("user", "LuckyDog");
-        props.put("password", "tennisanyone");
-        assertTrue(
-                DriverManager.getConnection(StubDriverURL,
-                        props) != null);
-    }
-
-    /**
-     * Register a driver and make sure you find it via its URL. Deregister the
-     * driver and validate it is not longer registered
-     *
-     * @throws Exception
-     */
-    @Test()
-    public void test15() throws Exception {
-        DriverManager.registerDriver(new StubDriver());
-        Driver d = DriverManager.getDriver(StubDriverURL);
-        assertTrue(d != null);
-        assertTrue(isDriverRegistered(d));
-        DriverManager.deregisterDriver(d);
-        assertFalse(isDriverRegistered(d));
-    }
-
-    /**
-     * Validate that DriverAction.release is called when a driver is registered
-     * via registerDriver(Driver, DriverAction)
-     *
-     * @throws Exception
-     */
-    @Test
-    public void test16() throws Exception {
-        File file = new File(util.StubDriverDA.DriverActionCalled);
-        file.delete();
-        assertFalse(file.exists());
-        Driver d = null;
-        Class.forName("util.StubDriverDA");
-        d = DriverManager.getDriver(StubDriverDAURL);
-        DriverManager.deregisterDriver(d);
-        assertFalse(isDriverRegistered(d), "Driver is registered");
-        assertTrue(file.exists());
-    }
-
-    /**
-     * Create a PrintStream and use to send output via DriverManager.println
-     * Validate that if you disable the stream, the output sent is not present
-     */
-    @Test
-    public void tests17() throws Exception {
-        ByteArrayOutputStream os = new ByteArrayOutputStream();
-        PrintStream ps = new PrintStream(os);
-        DriverManager.setLogStream(ps);
-        assertTrue(DriverManager.getLogStream() == ps);
-
-        DriverManager.println(results[0]);
-        DriverManager.setLogStream((PrintStream) null);
-        assertTrue(DriverManager.getLogStream() == null);
-        DriverManager.println(noOutput);
-        DriverManager.setLogStream(ps);
-        DriverManager.println(results[1]);
-        DriverManager.println(results[2]);
-        DriverManager.println(results[3]);
-        DriverManager.setLogStream((PrintStream) null);
-        DriverManager.println(noOutput);
-
-        /*
-         * Check we do not get the output when the stream is disabled
-         */
-        InputStreamReader is
-                = new InputStreamReader(new ByteArrayInputStream(os.toByteArray()));
-        BufferedReader reader = new BufferedReader(is);
-        for (String result : results) {
-            assertTrue(result.equals(reader.readLine()));
-        }
-    }
-
-    /**
-     * Create a PrintWriter and use to to send output via DriverManager.println
-     * Validate that if you disable the writer, the output sent is not present
-     */
-    @Test
-    public void tests18() throws Exception {
-        CharArrayWriter cw = new CharArrayWriter();
-        PrintWriter pw = new PrintWriter(cw);
-        DriverManager.setLogWriter(pw);
-        assertTrue(DriverManager.getLogWriter() == pw);
-
-        DriverManager.println(results[0]);
-        DriverManager.setLogWriter(null);
-        assertTrue(DriverManager.getLogWriter() == null);
-        DriverManager.println(noOutput);
-        DriverManager.setLogWriter(pw);
-        DriverManager.println(results[1]);
-        DriverManager.println(results[2]);
-        DriverManager.println(results[3]);
-        DriverManager.setLogWriter(null);
-        DriverManager.println(noOutput);
-
-        /*
-         * Check we do not get the output when the stream is disabled
-         */
-        BufferedReader reader
-                = new BufferedReader(new CharArrayReader(cw.toCharArray()));
-        for (String result : results) {
-            assertTrue(result.equals(reader.readLine()));
-        }
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLClientInfoExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,227 +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 test.sql;
-
-import java.sql.ClientInfoStatus;
-import java.sql.SQLClientInfoException;
-import java.sql.SQLException;
-import java.util.HashMap;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLClientInfoExceptionTests extends BaseTest {
-
-    private final HashMap<String, ClientInfoStatus> map = new HashMap<>();
-
-    public SQLClientInfoExceptionTests() {
-        map.put("1", ClientInfoStatus.REASON_UNKNOWN_PROPERTY);
-        map.put("21", ClientInfoStatus.REASON_UNKNOWN_PROPERTY);
-    }
-
-    /**
-     * Create SQLClientInfoException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLClientInfoException e = new SQLClientInfoException(null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == 0
-                && e.getFailedProperties() == null);
-    }
-
-    /**
-     * Create SQLClientInfoException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLClientInfoException ex = new SQLClientInfoException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && ex.getFailedProperties() == null);
-    }
-
-    /**
-     * Create SQLClientInfoException with null Throwable
-     */
-    @Test
-    public void test2() {
-
-        SQLClientInfoException ex = new SQLClientInfoException(map, null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && ex.getFailedProperties().equals(map));
-    }
-
-    /**
-     * Create SQLClientInfoException with message
-     */
-    @Test
-    public void test3() {
-        SQLClientInfoException ex = new SQLClientInfoException(reason, map);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && ex.getFailedProperties().equals(map));
-    }
-
-    /**
-     * Create SQLClientInfoException with null Throwable
-     */
-    @Test
-    public void test4() {
-        SQLClientInfoException ex = new SQLClientInfoException(reason, map, null);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && ex.getFailedProperties().equals(map));
-    }
-
-    /**
-     * Create SQLClientInfoException with message, and SQLState
-     */
-    @Test
-    public void test5() {
-        SQLClientInfoException ex = new SQLClientInfoException(reason, state,
-                map);
-
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0
-                && ex.getFailedProperties().equals(map));
-    }
-
-    /**
-     * Create SQLClientInfoException with message, and SQLState
-     */
-    @Test
-    public void test6() {
-        SQLClientInfoException ex = new SQLClientInfoException(reason, state,
-                map, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0
-                && ex.getFailedProperties().equals(map));
-    }
-
-    /**
-     * Create SQLClientInfoException with message, SQLState, errorCode, and
-     * Throwable
-     */
-    @Test
-    public void test7() {
-        SQLClientInfoException ex = new SQLClientInfoException(reason, state,
-                errorCode, map);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode
-                && ex.getFailedProperties().equals(map));
-    }
-
-    /**
-     * Create SQLClientInfoException with message, SQLState, and error code
-     */
-    @Test
-    public void test8() {
-        SQLClientInfoException ex = new SQLClientInfoException(reason, state,
-                errorCode, map, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode
-                && ex.getFailedProperties().equals(map));
-    }
-
-    /**
-     * Serialize a SQLClientInfoException and make sure you can read it back
-     * properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLClientInfoException e = new SQLClientInfoException(reason, state,
-                errorCode, map, t);
-        SQLClientInfoException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode
-                && ex1.getFailedProperties().equals(map));
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct using
-     * for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLClientInfoException ex = new SQLClientInfoException("Exception 1",
-                map, t1);
-        SQLClientInfoException ex1 = new SQLClientInfoException("Exception 2",
-                map);
-        SQLClientInfoException ex2 = new SQLClientInfoException("Exception 3",
-                map, t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct using
-     * traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLClientInfoException ex = new SQLClientInfoException("Exception 1",
-                map, t1);
-        SQLClientInfoException ex1 = new SQLClientInfoException("Exception 2",
-                map);
-        SQLClientInfoException ex2 = new SQLClientInfoException("Exception 3",
-                map, t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLDataExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +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 test.sql;
-
-import java.sql.SQLDataException;
-import java.sql.SQLException;
-import java.sql.SQLNonTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLDataExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLDataException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLDataException e = new SQLDataException(null, null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLDataException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLDataException ex = new SQLDataException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLDataException with message
-     */
-    @Test
-    public void test2() {
-        SQLDataException ex = new SQLDataException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLDataException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLDataException ex = new SQLDataException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLDataException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLDataException ex = new SQLDataException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLDataException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLDataException ex = new SQLDataException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLDataException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLDataException ex = new SQLDataException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLDataException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLDataException ex = new SQLDataException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLDataException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLDataException ex = new SQLDataException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLDataException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLDataException ex = new SQLDataException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLDataException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLDataException e = new SQLDataException(reason, state, errorCode, t);
-        SQLDataException ex1 = createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLDataException ex = new SQLDataException("Exception 1", t1);
-        SQLDataException ex1 = new SQLDataException("Exception 2");
-        SQLDataException ex2 = new SQLDataException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLDataException ex = new SQLDataException("Exception 1", t1);
-        SQLDataException ex1 = new SQLDataException("Exception 2");
-        SQLDataException ex2 = new SQLDataException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLDataException and validate it is an instance of
-     * SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLDataException();
-        assertTrue(ex instanceof SQLNonTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +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 test.sql;
-
-import java.sql.SQLException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLException e = new SQLException(null, null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLException ex = new SQLException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLException with message
-     */
-    @Test
-    public void test2() {
-        SQLException ex = new SQLException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLException ex = new SQLException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLException ex = new SQLException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLException ex = new SQLException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLException ex = new SQLException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLException ex = new SQLException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLException ex = new SQLException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLException ex = new SQLException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLException e = new SQLException(reason, state, errorCode, t);
-        SQLException ex1 = createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLException ex = new SQLException("Exception 1", t1);
-        SQLException ex1 = new SQLException("Exception 2");
-        SQLException ex2 = new SQLException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLException ex = new SQLException("Exception 1", t1);
-        SQLException ex1 = new SQLException("Exception 2");
-        SQLException ex2 = new SQLException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        while (ex != null) {
-            assertTrue(msgs[num++].equals(ex.getMessage()));
-            Throwable c = ex.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            ex = ex.getNextException();
-        }
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLFeatureNotSupportedExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,232 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
-import java.sql.SQLNonTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLFeatureNotSupportedExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLFeatureNotSupportedException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLFeatureNotSupportedException e =
-                new SQLFeatureNotSupportedException(null, null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLFeatureNotSupportedException ex = new SQLFeatureNotSupportedException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with message
-     */
-    @Test
-    public void test2() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException((Throwable) null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLFeatureNotSupportedException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLFeatureNotSupportedException e =
-                new SQLFeatureNotSupportedException(reason, state, errorCode, t);
-        SQLFeatureNotSupportedException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException("Exception 1", t1);
-        SQLFeatureNotSupportedException ex1 =
-                new SQLFeatureNotSupportedException("Exception 2");
-        SQLFeatureNotSupportedException ex2 =
-                new SQLFeatureNotSupportedException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLFeatureNotSupportedException ex =
-                new SQLFeatureNotSupportedException("Exception 1", t1);
-        SQLFeatureNotSupportedException ex1 =
-                new SQLFeatureNotSupportedException("Exception 2");
-        SQLFeatureNotSupportedException ex2 =
-                new SQLFeatureNotSupportedException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLFeatureNotSupportedException and validate it is an instance of
-     * SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLFeatureNotSupportedException();
-        assertTrue(ex instanceof SQLNonTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLIntegrityConstraintViolationExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,235 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLIntegrityConstraintViolationException;
-import java.sql.SQLNonTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLIntegrityConstraintViolationExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLIntegrityConstraintViolationException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLIntegrityConstraintViolationException e =
-                new SQLIntegrityConstraintViolationException(null,
-                null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with message
-     */
-    @Test
-    public void test2() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLIntegrityConstraintViolationException and make sure
-     * you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLIntegrityConstraintViolationException e =
-                new SQLIntegrityConstraintViolationException(reason, state, errorCode, t);
-        SQLIntegrityConstraintViolationException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException("Exception 1", t1);
-        SQLIntegrityConstraintViolationException ex1 =
-                new SQLIntegrityConstraintViolationException("Exception 2");
-        SQLIntegrityConstraintViolationException ex2 =
-                new SQLIntegrityConstraintViolationException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLIntegrityConstraintViolationException ex =
-                new SQLIntegrityConstraintViolationException("Exception 1", t1);
-        SQLIntegrityConstraintViolationException ex1 =
-                new SQLIntegrityConstraintViolationException("Exception 2");
-        SQLIntegrityConstraintViolationException ex2 =
-                new SQLIntegrityConstraintViolationException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLIntegrityConstraintViolationException and validate it is an instance of
-     * SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLIntegrityConstraintViolationException();
-        assertTrue(ex instanceof SQLNonTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLInvalidAuthorizationSpecExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,239 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLInvalidAuthorizationSpecException;
-import java.sql.SQLNonTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLInvalidAuthorizationSpecExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException and setting all objects to
-     * null
-     */
-    @Test
-    public void test() {
-        SQLInvalidAuthorizationSpecException e
-                = new SQLInvalidAuthorizationSpecException(null,
-                        null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with message
-     */
-    @Test
-    public void test2() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with message, SQLState, and
-     * error code
-     */
-    @Test
-    public void test4() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with message, SQLState,
-     * errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with message, SQLState, and
-     * Throwable
-     */
-    @Test
-    public void test6() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException((Throwable) null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLInvalidAuthorizationSpecException and make sure you can
-     * read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLInvalidAuthorizationSpecException e
-                = new SQLInvalidAuthorizationSpecException(reason, state, errorCode, t);
-        SQLInvalidAuthorizationSpecException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct using
-     * for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException("Exception 1", t1);
-        SQLInvalidAuthorizationSpecException ex1
-                = new SQLInvalidAuthorizationSpecException("Exception 2");
-        SQLInvalidAuthorizationSpecException ex2
-                = new SQLInvalidAuthorizationSpecException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct using
-     * traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLInvalidAuthorizationSpecException ex
-                = new SQLInvalidAuthorizationSpecException("Exception 1", t1);
-        SQLInvalidAuthorizationSpecException ex1
-                = new SQLInvalidAuthorizationSpecException("Exception 2");
-        SQLInvalidAuthorizationSpecException ex2
-                = new SQLInvalidAuthorizationSpecException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLInvalidAuthorizationSpecException and validate it is an
-     * instance of SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLInvalidAuthorizationSpecException();
-        assertTrue(ex instanceof SQLNonTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLNonTransientConnectionExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,235 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLNonTransientConnectionException;
-import java.sql.SQLNonTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLNonTransientConnectionExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLNonTransientConnectionException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLNonTransientConnectionException e =
-                new SQLNonTransientConnectionException(null,
-                null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with message
-     */
-    @Test
-    public void test2() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLNonTransientConnectionException and make sure you can
-     * read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLNonTransientConnectionException e =
-                new SQLNonTransientConnectionException(reason, state, errorCode, t);
-        SQLNonTransientConnectionException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException("Exception 1", t1);
-        SQLNonTransientConnectionException ex1 =
-                new SQLNonTransientConnectionException("Exception 2");
-        SQLNonTransientConnectionException ex2 =
-                new SQLNonTransientConnectionException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLNonTransientConnectionException ex =
-                new SQLNonTransientConnectionException("Exception 1", t1);
-        SQLNonTransientConnectionException ex1 =
-                new SQLNonTransientConnectionException("Exception 2");
-        SQLNonTransientConnectionException ex2 =
-                new SQLNonTransientConnectionException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLNonTransientConnectionException and validate it is an instance of
-     * SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLNonTransientConnectionException();
-        assertTrue(ex instanceof SQLNonTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLNonTransientExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLNonTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLNonTransientExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLNonTransientException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLNonTransientException e = new SQLNonTransientException(null,
-                null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLNonTransientException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLNonTransientException ex = new SQLNonTransientException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientException with message
-     */
-    @Test
-    public void test2() {
-        SQLNonTransientException ex = new SQLNonTransientException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLNonTransientException ex = new SQLNonTransientException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {;
-        SQLNonTransientException ex =
-                new SQLNonTransientException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLNonTransientException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLNonTransientException ex =
-                new SQLNonTransientException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLNonTransientException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLNonTransientException ex = new SQLNonTransientException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLNonTransientException ex = new SQLNonTransientException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLNonTransientException ex = new SQLNonTransientException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLNonTransientException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLNonTransientException ex = new SQLNonTransientException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLNonTransientException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLNonTransientException e =
-                new SQLNonTransientException(reason, state, errorCode, t);
-        SQLNonTransientException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLNonTransientException ex = new SQLNonTransientException("Exception 1", t1);
-        SQLNonTransientException ex1 = new SQLNonTransientException("Exception 2");
-        SQLNonTransientException ex2 = new SQLNonTransientException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLNonTransientException ex = new SQLNonTransientException("Exception 1", t1);
-        SQLNonTransientException ex1 = new SQLNonTransientException("Exception 2");
-        SQLNonTransientException ex2 = new SQLNonTransientException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLRecoverableExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLRecoverableException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLRecoverableExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLRecoverableException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLRecoverableException e = new SQLRecoverableException(null,
-               null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLRecoverableException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLRecoverableException ex = new SQLRecoverableException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLRecoverableException with message
-     */
-    @Test
-    public void test2() {
-        SQLRecoverableException ex = new SQLRecoverableException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLRecoverableException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLRecoverableException ex = new SQLRecoverableException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLRecoverableException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLRecoverableException ex =
-                new SQLRecoverableException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLRecoverableException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLRecoverableException ex =
-                new SQLRecoverableException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLRecoverableException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLRecoverableException ex = new SQLRecoverableException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLRecoverableException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLRecoverableException ex = new SQLRecoverableException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLRecoverableException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLRecoverableException ex = new SQLRecoverableException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLRecoverableException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLRecoverableException ex = new SQLRecoverableException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLRecoverableException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLRecoverableException e =
-                new SQLRecoverableException(reason, state, errorCode, t);
-        SQLRecoverableException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLRecoverableException ex = new SQLRecoverableException("Exception 1", t1);
-        SQLRecoverableException ex1 = new SQLRecoverableException("Exception 2");
-        SQLRecoverableException ex2 = new SQLRecoverableException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLRecoverableException ex = new SQLRecoverableException("Exception 1", t1);
-        SQLRecoverableException ex1 = new SQLRecoverableException("Exception 2");
-        SQLRecoverableException ex2 = new SQLRecoverableException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLSyntaxErrorExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,221 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLNonTransientException;
-import java.sql.SQLSyntaxErrorException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLSyntaxErrorExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLSyntaxErrorException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLSyntaxErrorException e = new SQLSyntaxErrorException(null,
-                null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with message
-     */
-    @Test
-    public void test2() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLSyntaxErrorException ex =
-                new SQLSyntaxErrorException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLSyntaxErrorException ex =
-                new SQLSyntaxErrorException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLSyntaxErrorException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLSyntaxErrorException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-
-        SQLSyntaxErrorException e =
-                new SQLSyntaxErrorException(reason, state, errorCode, t);
-        SQLSyntaxErrorException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException("Exception 1", t1);
-        SQLSyntaxErrorException ex1 = new SQLSyntaxErrorException("Exception 2");
-        SQLSyntaxErrorException ex2 = new SQLSyntaxErrorException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLSyntaxErrorException ex = new SQLSyntaxErrorException("Exception 1", t1);
-        SQLSyntaxErrorException ex1 = new SQLSyntaxErrorException("Exception 2");
-        SQLSyntaxErrorException ex2 = new SQLSyntaxErrorException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLSyntaxErrorException and validate it is an instance of
-     * SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLSyntaxErrorException();
-        assertTrue(ex instanceof SQLNonTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLTimeoutExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLTimeoutException;
-import java.sql.SQLTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLTimeoutExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLTimeoutException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLTimeoutException e = new SQLTimeoutException(null,
-                null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTimeoutException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLTimeoutException ex = new SQLTimeoutException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTimeoutException with message
-     */
-    @Test
-    public void test2() {
-        SQLTimeoutException ex = new SQLTimeoutException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTimeoutException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLTimeoutException ex = new SQLTimeoutException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTimeoutException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLTimeoutException ex = new SQLTimeoutException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTimeoutException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLTimeoutException ex = new SQLTimeoutException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTimeoutException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLTimeoutException ex = new SQLTimeoutException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTimeoutException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLTimeoutException ex = new SQLTimeoutException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTimeoutException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLTimeoutException ex = new SQLTimeoutException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTimeoutException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLTimeoutException ex = new SQLTimeoutException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLTimeoutException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLTimeoutException e =
-                new SQLTimeoutException(reason, state, errorCode, t);
-        SQLTimeoutException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLTimeoutException ex = new SQLTimeoutException("Exception 1", t1);
-        SQLTimeoutException ex1 = new SQLTimeoutException("Exception 2");
-        SQLTimeoutException ex2 = new SQLTimeoutException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLTimeoutException ex = new SQLTimeoutException("Exception 1", t1);
-        SQLTimeoutException ex1 = new SQLTimeoutException("Exception 2");
-        SQLTimeoutException ex2 = new SQLTimeoutException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLTimeoutException and validate it is an instance of
-     * SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLTimeoutException();
-        assertTrue(ex instanceof SQLTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLTransactionRollbackExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,233 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLTransactionRollbackException;
-import java.sql.SQLTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLTransactionRollbackExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLTransactionRollbackException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLTransactionRollbackException e =
-                new SQLTransactionRollbackException(null,
-                null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLTransactionRollbackException ex = new SQLTransactionRollbackException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with message
-     */
-    @Test
-    public void test2() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransactionRollbackException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLTransactionRollbackException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLTransactionRollbackException e =
-                new SQLTransactionRollbackException(reason, state, errorCode, t);
-        SQLTransactionRollbackException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException("Exception 1", t1);
-        SQLTransactionRollbackException ex1 =
-                new SQLTransactionRollbackException("Exception 2");
-        SQLTransactionRollbackException ex2 =
-                new SQLTransactionRollbackException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLTransactionRollbackException ex =
-                new SQLTransactionRollbackException("Exception 1", t1);
-        SQLTransactionRollbackException ex1 =
-                new SQLTransactionRollbackException("Exception 2");
-        SQLTransactionRollbackException ex2 =
-                new SQLTransactionRollbackException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLTransactionRollbackException and validate it is an instance of
-     * SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLTransactionRollbackException();
-        assertTrue(ex instanceof SQLTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLTransientConnectionExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,233 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLTransientConnectionException;
-import java.sql.SQLTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLTransientConnectionExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLTransientConnectionException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLTransientConnectionException e =
-                new SQLTransientConnectionException( null,
-                null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLTransientConnectionException ex = new SQLTransientConnectionException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with message
-     */
-    @Test
-    public void test2() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {;
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientConnectionException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLTransientConnectionException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLTransientConnectionException e =
-                new SQLTransientConnectionException(reason, state, errorCode, t);
-        SQLTransientConnectionException ex1 =
-                createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException("Exception 1", t1);
-        SQLTransientConnectionException ex1 =
-                new SQLTransientConnectionException("Exception 2");
-        SQLTransientConnectionException ex2 =
-                new SQLTransientConnectionException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLTransientConnectionException ex =
-                new SQLTransientConnectionException("Exception 1", t1);
-        SQLTransientConnectionException ex1 =
-                new SQLTransientConnectionException("Exception 2");
-        SQLTransientConnectionException ex2 =
-                new SQLTransientConnectionException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Create SQLTransientConnectionException and validate it is an instance of
-     * SQLNonTransientException
-     */
-    @Test
-    public void test13() {
-        Exception ex = new SQLTransientConnectionException();
-        assertTrue(ex instanceof SQLTransientException);
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLTransientExceptionTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLTransientException;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLTransientExceptionTests extends BaseTest {
-
-    /**
-     * Create SQLTransientException and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLTransientException e = new SQLTransientException(null,
-                null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransientException with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLTransientException ex = new SQLTransientException();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientException with message
-     */
-    @Test
-    public void test2() {
-        SQLTransientException ex = new SQLTransientException(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientException with message, and SQLState
-     */
-    @Test
-    public void test3() {
-        SQLTransientException ex = new SQLTransientException(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientException with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLTransientException ex = new SQLTransientException(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransientException with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLTransientException ex =
-                new SQLTransientException(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLTransientException with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLTransientException ex = new SQLTransientException(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientException with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLTransientException ex = new SQLTransientException(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientException with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLTransientException ex = new SQLTransientException((Throwable)null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLTransientException with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLTransientException ex = new SQLTransientException(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLTransientException and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLTransientException e =
-                new SQLTransientException(reason, state, errorCode, t);
-        SQLTransientException ex1 = createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLTransientException ex = new SQLTransientException("Exception 1", t1);
-        SQLTransientException ex1 = new SQLTransientException("Exception 2");
-        SQLTransientException ex2 = new SQLTransientException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct
-     * using traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLTransientException ex = new SQLTransientException("Exception 1", t1);
-        SQLTransientException ex1 = new SQLTransientException("Exception 2");
-        SQLTransientException ex2 = new SQLTransientException("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-}
--- a/jdk/test/java/sql/test/sql/SQLWarningTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,249 +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 test.sql;
-
-import java.sql.SQLException;
-import java.sql.SQLWarning;
-import static org.testng.Assert.*;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class SQLWarningTests extends BaseTest {
-
-    private final String[] warnings = {"Warning 1", "cause 1", "Warning 2",
-            "Warning 3", "cause 2"};
-
-    /**
-     * Create SQLWarning and setting all objects to null
-     */
-    @Test
-    public void test() {
-        SQLWarning e = new SQLWarning(null, null, errorCode, null);
-        assertTrue(e.getMessage() == null && e.getSQLState() == null
-                && e.getCause() == null && e.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLWarning with no-arg constructor
-     */
-    @Test
-    public void test1() {
-        SQLWarning ex = new SQLWarning();
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLWarning with message
-     */
-    @Test
-    public void test2() {
-        SQLWarning ex = new SQLWarning(reason);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLWarning with message, and SQLState
-     */
-    @Test
-    public void test3() {
-
-        SQLWarning ex = new SQLWarning(reason, state);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLWarning with message, SQLState, and error code
-     */
-    @Test
-    public void test4() {
-        SQLWarning ex = new SQLWarning(reason, state, errorCode);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && ex.getCause() == null
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLWarning with message, SQLState, errorCode, and Throwable
-     */
-    @Test
-    public void test5() {
-        SQLWarning ex = new SQLWarning(reason, state, errorCode, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Create SQLWarning with message, SQLState, and Throwable
-     */
-    @Test
-    public void test6() {
-        SQLWarning ex = new SQLWarning(reason, state, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState().equals(state)
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLWarning with message, and Throwable
-     */
-    @Test
-    public void test7() {
-        SQLWarning ex = new SQLWarning(reason, t);
-        assertTrue(ex.getMessage().equals(reason)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLWarning with null Throwable
-     */
-    @Test
-    public void test8() {
-        SQLWarning ex = new SQLWarning((Throwable) null);
-        assertTrue(ex.getMessage() == null
-                && ex.getSQLState() == null
-                && ex.getCause() == null
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Create SQLWarning with Throwable
-     */
-    @Test
-    public void test9() {
-        SQLWarning ex = new SQLWarning(t);
-        assertTrue(ex.getMessage().equals(cause)
-                && ex.getSQLState() == null
-                && cause.equals(ex.getCause().toString())
-                && ex.getErrorCode() == 0);
-    }
-
-    /**
-     * Serialize a SQLWarning and make sure you can read it back properly
-     */
-    @Test
-    public void test10() throws Exception {
-        SQLWarning e = new SQLWarning(reason, state, errorCode, t);
-        SQLWarning ex1 = createSerializedException(e);
-        assertTrue(reason.equals(ex1.getMessage())
-                && ex1.getSQLState().equals(state)
-                && cause.equals(ex1.getCause().toString())
-                && ex1.getErrorCode() == errorCode);
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct using
-     * for-each loop
-     */
-    @Test
-    public void test11() {
-        SQLWarning ex = new SQLWarning("Exception 1", t1);
-        SQLWarning ex1 = new SQLWarning("Exception 2");
-        SQLWarning ex2 = new SQLWarning("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(msgs[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned Exceptions is correct using
-     * traditional while loop
-     */
-    @Test
-    public void test12() {
-        SQLWarning ex = new SQLWarning("Exception 1", t1);
-        SQLWarning ex1 = new SQLWarning("Exception 2");
-        SQLWarning ex2 = new SQLWarning("Exception 3", t2);
-        ex.setNextException(ex1);
-        ex.setNextException(ex2);
-        int num = 0;
-        SQLException sqe = ex;
-        while (sqe != null) {
-            assertTrue(msgs[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextException();
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned SQLWarning is correct using
-     * for-each loop
-     */
-    @Test
-    public void test13() {
-        SQLWarning ex = new SQLWarning("Warning 1", t1);
-        SQLWarning ex1 = new SQLWarning("Warning 2");
-        SQLWarning ex2 = new SQLWarning("Warning 3", t2);
-        ex.setNextWarning(ex1);
-        ex.setNextWarning(ex2);
-        int num = 0;
-        for (Throwable e : ex) {
-            assertTrue(warnings[num++].equals(e.getMessage()));
-        }
-    }
-
-    /**
-     * Validate that the ordering of the returned SQLWarning is correct using
-     * traditional while loop
-     */
-    @Test
-    public void test14() {
-        SQLWarning ex = new SQLWarning("Warning 1", t1);
-        SQLWarning ex1 = new SQLWarning("Warning 2");
-        SQLWarning ex2 = new SQLWarning("Warning 3", t2);
-        ex.setNextWarning(ex1);
-        ex.setNextWarning(ex2);
-        int num = 0;
-        SQLWarning sqe = ex;
-        while (sqe != null) {
-            assertTrue(warnings[num++].equals(sqe.getMessage()));
-            Throwable c = sqe.getCause();
-            while (c != null) {
-                assertTrue(msgs[num++].equals(c.getMessage()));
-                c = c.getCause();
-            }
-            sqe = sqe.getNextWarning();
-        }
-    }
-}
--- a/jdk/test/java/sql/test/sql/TimeTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,348 +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 test.sql;
-
-import java.sql.Time;
-import java.time.LocalTime;
-import static org.testng.Assert.*;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class TimeTests extends BaseTest {
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling getYear
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test01() {
-        Time t = Time.valueOf("08:30:59");
-        t.getYear();
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling getMonth
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test02() {
-        Time t = Time.valueOf("08:30:59");
-        t.getMonth();
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling getDay
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test03() {
-        Time t = Time.valueOf("08:30:59");
-        t.getDay();
-    }
-
-    /**
-     * Validate an IllegalArgumentException is thrown for calling getDate
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test04() {
-        Time t = Time.valueOf("08:30:59");
-        t.getDate();
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling setYear
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test05() {
-        Time t = Time.valueOf("08:30:59");
-        t.setYear(8);
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling setMonth
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test06() {
-        Time t = Time.valueOf("08:30:59");
-        t.setMonth(8);
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling setDate
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test07() {
-        Time t = Time.valueOf("08:30:59");
-        t.setDate(30);
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for calling getDate
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test08() {
-        Time t = Time.valueOf("08:30:59");
-        t.getDate();
-    }
-
-    /*
-     * Validate that a Time made from a toLocalTime() LocalTime are equal
-     */
-    @Test
-    public void test09() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = Time.valueOf(t.toLocalTime());
-        assertTrue(t.equals(t2), "Error t != t2");
-    }
-
-    /*
-     * Validate that a Time LocalTime value, made from a LocalTime are equal
-     */
-    @Test
-    public void test10() {
-        LocalTime lt = LocalTime.of(8, 30, 59);
-        Time t = Time.valueOf(lt);
-        System.out.println("lt=" + lt + ",t=" + t.toLocalTime());
-        assertTrue(lt.equals(t.toLocalTime()),
-                "Error LocalTime values are not equal");
-    }
-
-    /*
-     * Validate an NPE occurs when a null LocalDate is passed to valueOf
-     */
-    @Test(expectedExceptions = NullPointerException.class)
-    public void test11() throws Exception {
-        LocalTime ld = null;
-        Time.valueOf(ld);
-    }
-
-    /*
-     * Validate an UnsupportedOperationException occurs when toInstant() is
-     * called
-     */
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void test12() throws Exception {
-        Time t = new Time(System.currentTimeMillis());
-        t.toInstant();
-    }
-
-    /*
-     * Validate that two Time objects are equal when one is created from the
-     * toString() of the other and that the correct value is returned from
-     * toString()
-     */
-    @Test(dataProvider = "validTimeValues")
-    public void test13(String time, String expected) {
-        Time t1 = Time.valueOf(time);
-        Time t2 = Time.valueOf(t1.toString());
-        assertTrue(t1.equals(t2) && t2.equals(t1)
-                && t1.toString().equals(expected), "Error t1 != t2");
-    }
-
-    /*
-     * Validate that two Time values one created using valueOf and another via a
-     * constructor are equal
-     */
-    @Test
-    public void test14() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(8, 30, 59);
-        assertTrue(t.equals(t2) && t2.equals(t), "Error t != t2");
-    }
-
-    /*
-     * Validate that two Time values one created using valueOf and another via a
-     * constructor are equal
-     */
-    @Test
-    public void test15() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(t.getTime());
-        assertTrue(t.equals(t2) && t2.equals(t), "Error t != t2");
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for an invalid Time string
-     */
-    @Test(dataProvider = "invalidTimeValues",
-            expectedExceptions = IllegalArgumentException.class)
-    public void test16(String time) throws Exception {
-        Time.valueOf(time);
-    }
-
-    /*
-     * Validate that Time.after() returns false when same date is compared
-     */
-    @Test
-    public void test17() {
-        Time t = Time.valueOf("08:30:59");
-        assertFalse(t.after(t), "Error t.after(t) = true");
-    }
-
-    /*
-     * Validate that Time.after() returns true when later date is compared to
-     * earlier date
-     */
-    @Test
-    public void test18() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(System.currentTimeMillis());
-        assertTrue(t2.after(t), "Error t2.after(t) = false");
-    }
-
-    /*
-     * Validate that Time.after() returns false when earlier date is compared to
-     * itself
-     */
-    @Test
-    public void test19() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(t.getTime());
-        assertFalse(t.after(t2), "Error t.after(t2) = true");
-        assertFalse(t2.after(t), "Error t2.after(t) = true");
-    }
-
-    /*
-     * Validate that Time.before() returns false when same date is compared
-     */
-    @Test
-    public void test20() {
-        Time t = Time.valueOf("08:30:59");
-        assertFalse(t.before(t), "Error t.before(t) = true");
-    }
-
-    /*
-     * Validate that Time.before() returns true when earlier date is compared to
-     * later date
-     */
-    @Test
-    public void test21() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(System.currentTimeMillis());
-        assertTrue(t.before(t2), "Error t.before(t2) = false");
-    }
-
-    /*
-     * Validate that Time.before() returns false when earlier date is compared
-     * to itself
-     */
-    @Test
-    public void test22() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(t.getTime());
-        assertFalse(t.before(t2), "Error t.after(t2) = true");
-        assertFalse(t2.before(t), "Error t2.after(t) = true");
-    }
-
-    /*
-     * Validate that Time.compareTo returns 0 when both Date objects are the
-     * same
-     */
-    @Test
-    public void test23() {
-        Time t = Time.valueOf("08:30:59");
-        assertTrue(t.compareTo(t) == 0, "Error t.compareTo(t) !=0");
-    }
-
-    /*
-     * Validate thatTime.compareTo returns 0 when both Time objects are the same
-     */
-    @Test
-    public void test24() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(t.getTime());
-        assertTrue(t.compareTo(t2) == 0, "Error t.compareTo(t2) !=0");
-    }
-
-    /*
-     * Validate that Time.compareTo returns 1 when comparing a later Time to an
-     * earlier Time
-     */
-    @Test
-    public void test25() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(t.getTime() + 1);
-        assertTrue(t2.compareTo(t) == 1, "Error t2.compareTo(t) !=1");
-    }
-
-    /*
-     * Validate thatTime.compareTo returns 1 when comparing a later Time to an
-     * earlier Time
-     */
-    @Test
-    public void test26() {
-        Time t = Time.valueOf("08:30:59");
-        Time t2 = new Time(t.getTime() + 1);
-        assertTrue(t.compareTo(t2) == -1, "Error t.compareTo(t2) != -1");
-    }
-
-    /*
-     * DataProvider used to provide Time values which are not valid and are used
-     * to validate that an IllegalArgumentException will be thrown from the
-     * valueOf method
-     */
-    @DataProvider(name = "invalidTimeValues")
-    private Object[][] invalidTimeValues() {
-        return new Object[][]{
-            {"2009-11-01 10:50:01"},
-            {"1961-08-30 10:50:01.1"},
-            {"1961-08-30"},
-            {"00:00:00."},
-            {"10:50:0.1"},
-            {":00:00"},
-            {"00::00"},
-            {"00:00:"},
-            {"::"},
-            {" : : "},
-            {"0a:00:00"},
-            {"00:bb:00"},
-            {"00:01:cc"},
-            {"08:10:Batman"},
-            {"08:10:10:10"},
-            {"08:10"},
-            {"a:b:c"},
-            {null},
-            {"8:"}
-        };
-    }
-
-    /*
-     * DataProvider used to provide Time values which are  valid and are used
-     * to validate that an IllegalArgumentException will  not be thrown from the
-     * valueOf method.  It also contains the expected return value from
-     * toString()
-     */
-    @DataProvider(name = "validTimeValues")
-    private Object[][] validTimeValues() {
-        return new Object[][]{
-            {"10:50:01", "10:50:01"},
-            {"01:1:1", "01:01:01"},
-            {"01:01:1", "01:01:01"},
-            {"1:01:1", "01:01:01"},
-            {"2:02:02", "02:02:02"},
-            {"2:02:2", "02:02:02"},
-            {"10:50:1", "10:50:01"},
-            {"00:00:00", "00:00:00"},
-            {"08:30:59", "08:30:59"},
-            {"9:0:1", "09:00:01"}
-        };
-    }
-}
--- a/jdk/test/java/sql/test/sql/TimestampTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,777 +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 test.sql;
-
-import java.sql.Date;
-import java.sql.Time;
-import java.sql.Timestamp;
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Calendar;
-import java.util.TimeZone;
-import static org.testng.Assert.*;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-import util.BaseTest;
-
-public class TimestampTests extends BaseTest {
-
-    private static TimeZone defaultTimeZone = null;
-
-    /*
-     * Need to set and use a custom TimeZone which does not
-     * observe daylight savings time for this test.
-     */
-    @BeforeClass
-    public static void setUpClass() throws Exception {
-        defaultTimeZone = TimeZone.getDefault();
-        TimeZone tzone = TimeZone.getTimeZone("GMT+01");
-        assertFalse(tzone.observesDaylightTime());
-        TimeZone.setDefault(tzone);
-    }
-
-    /*
-     * Conservatively reset the default time zone after test.
-     */
-    @AfterClass
-    public static void tearDownClass() throws Exception {
-        TimeZone.setDefault(defaultTimeZone);
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for an invalid Timestamp
-     */
-    @Test(dataProvider = "invalidTimestampValues",
-            expectedExceptions = IllegalArgumentException.class)
-    public void test(String ts) throws Exception {
-        Timestamp.valueOf(ts);
-    }
-
-    /*
-     * Validate that two Timestamp are equal when the leading 0 in seconds is
-     * omitted
-     */
-    @Test
-    public void test01() throws Exception {
-        String testTS = "2009-01-01 10:50:00";
-        String ExpectedTS = "2009-01-01 10:50:0";
-        Timestamp ts = Timestamp.valueOf(testTS);
-        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
-        assertEquals(ts, ts2, "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate two Timestamps created from the same string are equal
-     */
-    @Test
-    public void test02() throws Exception {
-        String testTS = "2009-01-01 10:50:0";
-        Timestamp ts = Timestamp.valueOf(testTS);
-        Timestamp ts2 = Timestamp.valueOf(testTS);
-        assertEquals(ts, ts2, "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that two Timestamp values one with leading 0s for month and day
-     * equals same string without the leading 0s.
-     */
-    @Test
-    public void test03() throws Exception {
-        String testTS = "2009-1-1 10:50:0";
-        String ExpectedTS = "2009-01-01 10:50:0";
-        Timestamp ts = Timestamp.valueOf(testTS);
-        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
-        assertEquals(ts, ts2, "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that two Timestamp values one with leading 0s for day omitted
-     * are equal
-     */
-    @Test
-    public void test04() throws Exception {
-        String testTS = "2009-01-1 10:50:0";
-        String ExpectedTS = "2009-01-01 10:50:0";
-        Timestamp ts = Timestamp.valueOf(testTS);
-        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
-        assertEquals(ts, ts2, "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that two Timestamp values one with leading 0s for month omitted
-     * and both with leading 0s for seconds omitted are equal
-     */
-    @Test
-    public void test05() throws Exception {
-        String testTS = "2009-1-01 10:50:0";
-        String ExpectedTS = "2009-01-01 10:50:0";
-        Timestamp ts = Timestamp.valueOf(testTS);
-        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
-        assertEquals(ts, ts2, "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that two Timestamp values one with leading 0s for month omitted
-     */
-    @Test
-    public void test06() throws Exception {
-        String testTS = "2005-1-01 10:20:50.00";
-        String ExpectedTS = "2005-01-01 10:20:50.00";
-        Timestamp ts = Timestamp.valueOf(testTS);
-        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
-        assertEquals(ts, ts2, "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that two Timestamp values one created using valueOf and another
-     * via a constructor are equal
-     */
-    @Test
-    public void test07() {
-
-        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.001");
-        Timestamp ts2 = new Timestamp(96, 11, 13, 14, 15, 25, 1000000);
-        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that two Timestamp values one created using valueOf and another
-     * via a constructor are equal
-     */
-    @Test
-    public void test08() {
-        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.001");
-        Timestamp ts2 = new Timestamp(ts1.getTime());
-        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that two Timestamp values one created using valueOf and another
-     * via a constructor are equal
-     */
-    @Test
-    public void test09() {
-
-        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.0");
-        Timestamp ts2 = new Timestamp(96, 11, 13, 14, 15, 25, 0);
-        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that a Timestamp cannot be equal to null
-     */
-    @Test
-    public void test10() {
-
-        Timestamp ts1 = Timestamp.valueOf("1961-08-30 14:15:25.745634");
-        Timestamp ts2 = null;
-        assertFalse(ts1.equals(ts2), "Error ts1 == null");
-    }
-
-    /*
-     * Validate that a Timestamp is equal to another timestamp created with the
-     * using the same value but not equal to a Timestamp which is one day later
-     */
-    @Test
-    public void test11() {
-
-        Timestamp ts1 = Timestamp.valueOf("1996-12-10 12:26:19.12");
-        Timestamp ts2 = Timestamp.valueOf("1996-12-10 12:26:19.12");
-        Timestamp ts3 = Timestamp.valueOf("1996-12-11 12:24:19.12");
-        assertTrue(ts1.equals(ts2) && ts2.equals(ts1), "Error ts1 != ts2");
-        assertFalse(ts1.equals(ts3) && ts3.equals(ts1), "Error ts1 == ts3");
-
-    }
-
-    /*
-     * Validate that a Timestamp is equal to itself
-     */
-    @Test
-    public void test12() {
-        Timestamp ts1 = Timestamp.valueOf("1996-10-15 12:26:19.12");
-        assertTrue(ts1.equals(ts1), "Error ts1 != ts1");
-    }
-
-    /*
-     * Validate that two Timestamps are equal when one is created from the
-     * toString() of the other
-     */
-    @Test(dataProvider = "validTimestampValues")
-    public void test13(String ts, String expectedTS) {
-        Timestamp ts1 = Timestamp.valueOf(ts);
-        Timestamp ts2 = Timestamp.valueOf(ts1.toString());
-        assertTrue(ts1.equals(ts2) && ts2.equals(ts1)
-                && ts1.toString().equals(expectedTS), "Error ts1 != ts2");
-    }
-
-    // Before Tests
-    /*
-     * Validate that Timestamp ts1 is before Timestamp ts2
-     */
-    @Test
-    public void test14() {
-        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
-        Timestamp ts2 = Timestamp.valueOf("1996-12-13 15:15:25.645634");
-        assertTrue(ts1.before(ts2), "Error ts1 not before ts2");
-    }
-
-    /*
-     * Validate that Timestamp ts1 is before Timestamp ts2
-     */
-    @Test
-    public void test15() {
-        Timestamp ts1 = Timestamp.valueOf("1961-08-30 14:15:25");
-        Timestamp ts2 = Timestamp.valueOf("1999-12-13 15:15:25");
-        assertTrue(ts1.before(ts2), "Error ts1 not before ts2");
-    }
-
-    /*
-     * Validate that Timestamp ts1 is before Timestamp ts2
-     */
-    @Test
-    public void test16() {
-
-        Timestamp ts1 = Timestamp.valueOf("1999-12-13 14:15:25.745634");
-        Timestamp ts2 = Timestamp.valueOf("1999-11-13 15:15:25.645634");
-        assertFalse(ts1.before(ts2), "Error ts1 before ts2");
-    }
-
-    /*
-     * Validate that a NullPointerException is thrown if a null is passed to
-     * the before method
-     */
-    @Test(expectedExceptions = NullPointerException.class)
-    public void test17() throws Exception {
-        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
-        ts1.before(null);
-    }
-
-    /*
-     * Validate a Timestamp cannot be before itself
-     */
-    @Test
-    public void test18() {
-        Timestamp ts1 = Timestamp.valueOf("1999-11-10 12:26:19.3456543");
-        assertFalse(ts1.before(ts1), "Error ts1 before ts1!");
-    }
-
-    /*
-     * Create 3 Timestamps and make sure the 1st is before the other two
-     * Timestamps which are each greater than the one before it
-     */
-    @Test
-    public void test19() {
-
-        Timestamp ts1 = new Timestamp(1234560000);
-        Timestamp ts2 = new Timestamp(1234567000);
-        Timestamp ts3 = new Timestamp(1234569000);
-        assertTrue(ts1.before(ts2) && ts2.before(ts3) && ts1.before(ts3));
-    }
-
-    /*
-     * Validate that Timestamp ts1 is not after Timestamp ts2
-     */
-    @Test
-    public void test20() {
-        Timestamp ts1 = Timestamp.valueOf("1999-12-13 14:15:25.745634");
-        Timestamp ts2 = Timestamp.valueOf("1999-12-13 15:15:25.645634");
-        assertFalse(ts1.after(ts2), "Error ts1 is after ts2");
-
-    }
-
-    /*
-     * Validate that Timestamp ts1 is after Timestamp ts2
-     */
-    @Test
-    public void test21() {
-        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
-        Timestamp ts2 = Timestamp.valueOf("1996-11-13 15:15:25.645634");
-        assertTrue(ts1.after(ts2), "Error ts1 not after ts2");
-    }
-
-    /*
-     * Validate that a NullPointerException is thrown if a null is passed to the
-     * after method
-     */
-    @Test(expectedExceptions = NullPointerException.class)
-    public void test22() throws Exception {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        ts1.after(null);
-    }
-
-    /*
-     * Validate that a Timestamp cannot be after itself
-     */
-    @Test
-    public void test23() {
-        Timestamp ts1 = Timestamp.valueOf("1999-11-10 12:26:19.3456543");
-        assertFalse(ts1.after(ts1), "Error ts1 is after itself");
-    }
-
-    /*
-     * Validate that a Timestamp after() works correctly with Timestamp created
-     * using milliseconds
-     */
-    @Test
-    public void test24() {
-
-        Timestamp ts1 = new Timestamp(1234568000);
-        Timestamp ts2 = new Timestamp(1234565000);
-        Timestamp ts3 = new Timestamp(1234562000);
-        assertTrue(ts1.after(ts2) && ts2.after(ts3) && ts1.after(ts3));
-    }
-
-    /*
-     * Validate compareTo returns 0 for Timestamps that are the same
-     */
-    @Test
-    public void test25() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        Timestamp ts2 = new Timestamp(ts1.getTime());
-        assertTrue(ts1.compareTo(ts2) == 0, "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate compareTo returns -1 for when the 1st Timestamp is earlier than
-     * the 2nd Timestamp
-     */
-    @Test
-    public void test26() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        Timestamp ts2 = new Timestamp(ts1.getTime() + 1000);
-        assertTrue(ts1.compareTo(ts2) == -1, "Error ts1 not before ts2");
-        assertTrue(ts2.compareTo(ts1) == 1, "Error ts1 is not before ts2");
-    }
-
-    /*
-     * Validate compareTo returns 1 for when the 1st Timestamp is later than the
-     * 2nd Timestamp
-     */
-    @Test
-    public void test27() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        Timestamp ts2 = new Timestamp(ts1.getTime() - 1000);
-        assertTrue(ts1.compareTo(ts2) == 1, "Error ts1 not after ts2");
-        assertTrue(ts2.compareTo(ts1) == -1, "Error ts1 not after ts2");
-    }
-
-    /*
-     * Validate compareTo returns 0 for Timestamps that are the same
-     */
-    @Test
-    public void test28() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        java.util.Date ts2 = new java.util.Date(ts1.getTime());
-        assertTrue(ts1.compareTo(ts2) == 0, "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate compareTo returns 0 for Timestamps that are the same
-     */
-    @Test
-    public void test29() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        java.util.Date d = new java.util.Date(ts1.getTime());
-        assertFalse(ts1.equals(d), "Error ts1 == d");
-    }
-
-    /*
-     * Validate compareTo returns 0 for Timestamps that are the same
-     */
-    @Test
-    public void test30() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        java.util.Date d = new Timestamp(ts1.getTime());
-        assertTrue(ts1.equals(d), "Error ts1 != d");
-    }
-
-    /*
-     * Validate equals returns false when a Date object is passed to equals
-     */
-    @Test
-    public void test31() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        Date d = new Date(ts1.getTime());
-        assertFalse(ts1.equals(d), "Error ts1 != d");
-    }
-
-    /*
-     * Validate equals returns false when a Date object is passed to equals
-     */
-    @Test
-    public void test32() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        java.util.Date d = new Date(ts1.getTime());
-        assertFalse(ts1.equals(d), "Error ts1 != d");
-    }
-
-    /*
-     * Validate equals returns false when a Time object is passed to equals
-     */
-    @Test
-    public void test33() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        Time t1 = new Time(ts1.getTime());
-        assertFalse(ts1.equals(t1), "Error ts1 == t1");
-    }
-
-    /*
-     * Validate equals returns false when a String object is passed to equals
-     */
-    @Test
-    public void test34() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        assertFalse(ts1.equals("1966-08-30 08:08:08"), "Error ts1 == a String");
-    }
-
-    /*
-     * Validate getTime() returns the same value from 2 timeStamps created by
-     */
-    @Test
-    public void test35() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        Timestamp ts2 = Timestamp.valueOf("1966-08-30 08:08:08");
-        assertTrue(ts2.getTime() == ts1.getTime(),
-                "ts1.getTime() != ts2.getTime()");
-        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate getTime() returns the same value from 2 timeStamps when
-     * setTime() is used to specify the same value for both Timestamps
-     */
-    @Test
-    public void test36() {
-        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
-        Timestamp ts2 = Timestamp.valueOf("1961-08-30 00:00:00");
-        ts2.setTime(ts1.getTime());
-        assertTrue(ts2.getTime() == ts1.getTime(),
-                "ts1.getTime() != ts2.getTime()");
-        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for an invalid nanos value
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test38() throws Exception {
-        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
-        ts1.setNanos(-1);
-
-    }
-
-    /*
-     * Validate an IllegalArgumentException is thrown for an invalid nanos value
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void test39() throws Exception {
-        int nanos = 999999999;
-        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
-        ts1.setNanos(nanos + 1);
-    }
-
-    /*
-     * Validate you can set nanos to 999999999
-     */
-    @Test
-    public void test40() throws Exception {
-        int nanos = 999999999;
-        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
-        ts1.setNanos(nanos);
-        assertTrue(ts1.getNanos() == nanos, "Error Invalid Nanos value");
-    }
-
-    /*
-     * Validate you can set nanos to 0
-     */
-    @Test
-    public void test41() throws Exception {
-        int nanos = 0;
-        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
-        ts1.setNanos(nanos);
-        assertTrue(ts1.getNanos() == nanos, "Error Invalid Nanos value");
-    }
-
-    /*
-     * Validate that a Timestamp made from a LocalDateTime are equal
-     */
-    @Test
-    public void test42() throws Exception {
-        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
-        LocalDateTime ldt = ts1.toLocalDateTime();
-        Timestamp ts2 = Timestamp.valueOf(ldt);
-        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that a Timestamp LocalDateTime value, made from a LocalDateTime
-     * are equal
-     */
-    @Test
-    public void test43() throws Exception {
-        LocalDateTime ldt = LocalDateTime.now();
-        Timestamp ts2 = Timestamp.valueOf(ldt);
-        assertTrue(ldt.equals(ts2.toLocalDateTime()),
-                "Error LocalDateTime values are not equal");
-    }
-
-    /*
-     * Validate an NPE occurs when a null LocalDateTime is passed to valueOF
-     */
-    @Test(expectedExceptions = NullPointerException.class)
-    public void test44() throws Exception {
-        LocalDateTime ldt = null;
-        Timestamp.valueOf(ldt);
-    }
-
-    /*
-     * Validate that a Timestamp made from a Instant are equal
-     */
-    @Test
-    public void test45() throws Exception {
-        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
-        Instant instant = ts1.toInstant();
-        Timestamp ts2 = Timestamp.from(instant);
-        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
-    }
-
-    /*
-     * Validate that a Timestamp made from a Instant are equal
-     */
-    @Test
-    public void test46() throws Exception {
-        Instant instant = Instant.now();
-        Timestamp ts2 = Timestamp.from(instant);
-        assertTrue(instant.equals(ts2.toInstant()),
-                "Error Instant values do not match");
-    }
-
-    /*
-     * Validate an NPE occurs when a null instant is passed to from
-     */
-    @Test(expectedExceptions = NullPointerException.class)
-    public void test47() throws Exception {
-        Instant instant = null;
-        Timestamp.from(instant);
-    }
-
-    // Added SQE tests
-    /*
-     * Create a Timestamp and a 2nd Timestamp that is 1 month earlier and
-     * validate that it is not before or after the original Timestamp
-     */
-    @Test
-    public void test48() {
-        Calendar cal = Calendar.getInstance();
-        Timestamp ts1 = new Timestamp(System.currentTimeMillis());
-        cal.setTimeInMillis(ts1.getTime());
-        cal.add(Calendar.MONTH, -1);
-        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
-        Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
-        assertFalse(ts1.before(ts2) || ts2.after(ts1));
-    }
-
-    /*
-     * Create two Timestamps and validate that compareTo returns 1 to indicate
-     * the 1st Timestamp is greater than the 2nd Timestamp
-     */
-    @Test
-    public void test49() {
-        Calendar cal = Calendar.getInstance();
-        Timestamp ts1 = new Timestamp(System.currentTimeMillis());
-        cal.setTimeInMillis(ts1.getTime());
-        cal.add(Calendar.MONTH, -1);
-        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
-        Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
-        assertTrue(ts1.compareTo(ts2) == 1);
-    }
-
-    /*
-     * Create two Timestamps and validate that the 1st Timestamp is not equal to
-     * the 2nd Timestamp but equal to itself
-     */
-    @Test
-    public void test50() {
-        Calendar cal = Calendar.getInstance();
-        Timestamp ts1 = new Timestamp(System.currentTimeMillis());
-        cal.setTimeInMillis(ts1.getTime());
-        cal.add(Calendar.MONTH, -1);
-        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
-        Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
-        assertTrue(!ts1.equals(ts2) && ts1.equals(ts1));
-    }
-
-    /*
-     * Validate that two Timestamps are equal when one is created from the
-     * toString() of the other
-     */
-    @Test(dataProvider = "validateNanos")
-    public void test51(String ts, int nanos) {
-        Timestamp ts1 = Timestamp.valueOf(ts);
-        Timestamp ts2 = Timestamp.valueOf(ts1.toString());
-        assertTrue(ts1.getNanos() == nanos && ts1.equals(ts2),
-                "Error with Nanos");
-    }
-
-    @Test(dataProvider = "validTimestampLongValues")
-    public void test52(long value, String ts) {
-        Timestamp ts1 = new Timestamp(value);
-        assertEquals(ts1.toString(), ts, "ts1.toString() != ts");
-    }
-
-    /*
-     * DataProvider used to provide Timestamps which are not valid and are used
-     * to validate that an IllegalArgumentException will be thrown from the
-     * valueOf method
-     */
-    @DataProvider(name = "invalidTimestampValues")
-    private Object[][] invalidTimestampValues() {
-        return new Object[][]{
-            {"2009-11-01-01 10:50:01"},
-            {"aaaa-11-01-01 10:50"},
-            {"aaaa-11-01 10:50"},
-            {"1961--30 00:00:00"},
-            {"--30 00:00:00"},
-            {"-- 00:00:00"},
-            {"1961-1- 00:00:00"},
-            {"2009-11-01"},
-            {"10:50:01"},
-            {"1961-a-30 00:00:00"},
-            {"1961-01-bb 00:00:00"},
-            {"1961-08-30 00:00:00."},
-            {"1961-08-30 :00:00"},
-            {"1961-08-30 00::00"},
-            {"1961-08-30 00:00:"},
-            {"1961-08-30 ::"},
-            {"1961-08-30 0a:00:00"},
-            {"1961-08-30 00:bb:00"},
-            {"1961-08-30 00:01:cc"},
-            {"1961-08-30 00:00:00.01a"},
-            {"1961-08-30 00:00:00.a"},
-            {"1996-12-10 12:26:19.1234567890"},
-            {null}
-        };
-    }
-
-    /*
-     * DataProvider used to provide Timestamps which are  valid and are used
-     * to validate that an IllegalArgumentException will not be thrown from the
-     * valueOf method and the corect value from toString() is returned
-     */
-    @DataProvider(name = "validTimestampValues")
-    private Object[][] validTimestampValues() {
-        return new Object[][]{
-            {"1961-08-30 00:00:00", "1961-08-30 00:00:00.0"},
-            {"1961-08-30 11:22:33", "1961-08-30 11:22:33.0"},
-            {"1961-8-30 00:00:00", "1961-08-30 00:00:00.0"},
-            {"1966-08-1 00:00:00", "1966-08-01 00:00:00.0"},
-            {"1996-12-10 12:26:19.1", "1996-12-10 12:26:19.1"},
-            {"1996-12-10 12:26:19.12", "1996-12-10 12:26:19.12"},
-            {"1996-12-10 12:26:19.123", "1996-12-10 12:26:19.123"},
-            {"1996-12-10 12:26:19.1234", "1996-12-10 12:26:19.1234"},
-            {"1996-12-10 12:26:19.12345", "1996-12-10 12:26:19.12345"},
-            {"1996-12-10 12:26:19.123456", "1996-12-10 12:26:19.123456"},
-            {"1996-12-10 12:26:19.1234567", "1996-12-10 12:26:19.1234567"},
-            {"1996-12-10 12:26:19.12345678", "1996-12-10 12:26:19.12345678"},
-            {"1996-12-10 12:26:19.123456789", "1996-12-10 12:26:19.123456789"},
-            {"1996-12-10 12:26:19.000000001", "1996-12-10 12:26:19.000000001"},
-            {"1996-12-10 12:26:19.000000012", "1996-12-10 12:26:19.000000012"},
-            {"1996-12-10 12:26:19.000000123", "1996-12-10 12:26:19.000000123"},
-            {"1996-12-10 12:26:19.000001234", "1996-12-10 12:26:19.000001234"},
-            {"1996-12-10 12:26:19.000012345", "1996-12-10 12:26:19.000012345"},
-            {"1996-12-10 12:26:19.000123456", "1996-12-10 12:26:19.000123456"},
-            {"1996-12-10 12:26:19.001234567", "1996-12-10 12:26:19.001234567"},
-            {"1996-12-10 12:26:19.12345678", "1996-12-10 12:26:19.12345678"},
-            {"1996-12-10 12:26:19.0", "1996-12-10 12:26:19.0"},
-            {"1996-12-10 12:26:19.01230", "1996-12-10 12:26:19.0123"}
-        };
-    }
-
-    @DataProvider(name = "validTimestampLongValues")
-    private Object[][] validTimestampLongValues() {
-        return new Object[][]{
-            {1L, "1970-01-01 01:00:00.001"},
-            {-3600*1000L - 1, "1969-12-31 23:59:59.999"},
-            {-(20000L*365*24*60*60*1000), "18018-08-28 01:00:00.0"},
-            {Timestamp.valueOf("1961-08-30 11:22:33").getTime(), "1961-08-30 11:22:33.0"},
-            {Timestamp.valueOf("1961-08-30 11:22:33.54321000").getTime(), "1961-08-30 11:22:33.543"}, // nanoprecision lost
-            {new Timestamp(114, 10, 10, 10, 10, 10, 100000000).getTime(), "2014-11-10 10:10:10.1"},
-            {new Timestamp(0, 10, 10, 10, 10, 10, 100000).getTime(), "1900-11-10 10:10:10.0"}, // nanoprecision lost
-            {new Date(114, 10, 10).getTime(), "2014-11-10 00:00:00.0"},
-            {new Date(0, 10, 10).getTime(), "1900-11-10 00:00:00.0"},
-            {LocalDateTime.of(1960, 10, 10, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
-                .toInstant().toEpochMilli(), "1960-10-10 19:10:10.0"},
-
-            // millisecond timestamps wraps around at year 1, so Long.MIN_VALUE looks similar
-            // Long.MAX_VALUE, while actually representing 292278994 BCE
-            {Long.MIN_VALUE, "292278994-08-17 08:12:55.192"},
-            {Long.MAX_VALUE + 1, "292278994-08-17 08:12:55.192"},
-            {Long.MAX_VALUE, "292278994-08-17 08:12:55.807"},
-            {Long.MIN_VALUE - 1, "292278994-08-17 08:12:55.807"},
-
-            // wrap around point near 0001-01-01, test that we never get a negative year:
-            {-(1970L*365*24*60*60*1000), "0001-04-25 01:00:00.0"},
-            {-(1970L*365*24*60*60*1000 + 115*24*60*60*1000L), "0001-12-31 01:00:00.0"},
-            {-(1970L*365*24*60*60*1000 + 115*24*60*60*1000L - 23*60*60*1000L), "0001-01-01 00:00:00.0"},
-
-            {LocalDateTime.of(0, 1, 1, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
-                .toInstant().toEpochMilli() - 2*24*60*60*1000L, "0001-01-01 19:03:08.0"}, // 1 BCE
-            {LocalDateTime.of(0, 1, 1, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
-                .toInstant().toEpochMilli() - 3*24*60*60*1000L, "0002-12-31 19:03:08.0"} // 2 BCE
-        };
-    }
-
-    /*
-     * DataProvider used to provide Timestamp and Nanos values in order to
-     * validate that the correct Nanos value is generated from the specified
-     * Timestamp
-     */
-    @DataProvider(name = "validateNanos")
-    private Object[][] validateNanos() {
-        return new Object[][]{
-            {"1961-08-30 00:00:00", 0},
-            {"1996-12-10 12:26:19.1", 100000000},
-            {"1996-12-10 12:26:19.12", 120000000},
-            {"1996-12-10 12:26:19.123", 123000000},
-            {"1996-12-10 12:26:19.1234", 123400000},
-            {"1996-12-10 12:26:19.12345", 123450000},
-            {"1996-12-10 12:26:19.123456", 123456000},
-            {"1996-12-10 12:26:19.1234567", 123456700},
-            {"1996-12-10 12:26:19.12345678", 123456780},
-            {"1996-12-10 12:26:19.123456789", 123456789},
-            {"1996-12-10 12:26:19.000000001", 1},
-            {"1996-12-10 12:26:19.000000012", 12},
-            {"1996-12-10 12:26:19.000000123", 123},
-            {"1996-12-10 12:26:19.000001234", 1234},
-            {"1996-12-10 12:26:19.000012345", 12345},
-            {"1996-12-10 12:26:19.000123456", 123456},
-            {"1996-12-10 12:26:19.001234567", 1234567},
-            {"1996-12-10 12:26:19.012345678", 12345678},
-            {"1996-12-10 12:26:19.0", 0},
-            {"1996-12-10 12:26:19.01230", 12300000}
-        };
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/TEST.properties	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,3 @@
+# JDBC unit tests uses TestNG
+TestNG.dirs = .
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/BatchUpdateExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,326 @@
+/*
+ * 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 test.sql;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.ObjectInputStream;
+import java.sql.BatchUpdateException;
+import java.sql.SQLException;
+import java.util.Arrays;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.SerializedBatchUpdateException;
+import util.BaseTest;
+
+public class BatchUpdateExceptionTests extends BaseTest {
+
+    private final int[] uc = {1, 2, 3};
+    private final long[] luc = {1, 2, 3};
+
+    private final String testSrcDir = System.getProperty("test.src", ".")
+            + File.separatorChar;
+
+    /**
+     * Create BatchUpdateException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        BatchUpdateException be = new BatchUpdateException(null,
+                null, errorCode, (int[]) null, null);
+        assertTrue(be.getMessage() == null && be.getSQLState() == null
+                && be.getUpdateCounts() == null && be.getCause() == null
+                && be.getLargeUpdateCounts() == null
+                && be.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create BatchUpdateException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        BatchUpdateException ex = new BatchUpdateException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && ex.getUpdateCounts() == null
+                && ex.getLargeUpdateCounts() == null);
+    }
+
+    /**
+     * Create BatchUpdateException with null Throwable
+     */
+    @Test
+    public void test2() {
+        BatchUpdateException ex = new BatchUpdateException((Throwable) null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && ex.getUpdateCounts() == null
+                && ex.getLargeUpdateCounts() == null);
+    }
+
+    /**
+     * Create BatchUpdateException with message and update counts
+     */
+    @Test
+    public void test3() {
+
+        BatchUpdateException ex = new BatchUpdateException(reason, uc);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && Arrays.equals(ex.getUpdateCounts(), uc)
+                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
+        );
+    }
+
+    /**
+     * Create BatchUpdateException with update counts
+     */
+    @Test
+    public void test4() {
+        BatchUpdateException ex = new BatchUpdateException(uc);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && Arrays.equals(ex.getUpdateCounts(), uc)
+                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
+        );
+    }
+
+    /**
+     * Create BatchUpdateException with Throwable and update counts
+     */
+    @Test
+    public void test5() {
+        BatchUpdateException ex = new BatchUpdateException(uc, t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0
+                && Arrays.equals(ex.getUpdateCounts(), uc)
+                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
+        );
+    }
+
+    /**
+     * Create BatchUpdateException with message, Throwable, and update counts
+     */
+    @Test
+    public void test6() {
+        BatchUpdateException ex = new BatchUpdateException(reason, uc, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0
+                && Arrays.equals(ex.getUpdateCounts(), uc)
+                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
+        );
+    }
+
+    /**
+     * Create BatchUpdateException with message, SQLState, Throwable, and update
+     * counts
+     */
+    @Test
+    public void test7() {
+        BatchUpdateException ex = new BatchUpdateException(reason, state, uc, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0
+                && Arrays.equals(ex.getUpdateCounts(), uc)
+                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
+        );
+    }
+
+    /**
+     * Create BatchUpdateException with message, SQLState, errorCode code
+     * Throwable, and update counts
+     */
+    @Test
+    public void test8() {
+        BatchUpdateException ex = new BatchUpdateException(reason, state, errorCode,
+                uc, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode
+                && Arrays.equals(ex.getUpdateCounts(), uc)
+                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
+        );
+    }
+
+    /**
+     * Create BatchUpdateException with message, SQLState, errorCode code
+     * Throwable, and long [] update counts
+     */
+    @Test
+    public void test9() {
+        BatchUpdateException ex = new BatchUpdateException(reason, state, errorCode,
+                luc, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode
+                && Arrays.equals(ex.getUpdateCounts(), uc)
+                && Arrays.equals(ex.getLargeUpdateCounts(), luc)
+        );
+    }
+
+    /**
+     * Validate that a copy of the update counts array is made
+     */
+    @Test
+    public void test10() {
+        int[] uc1 = {1, 2};
+        BatchUpdateException ex = new BatchUpdateException(uc1);
+        assertTrue(Arrays.equals(ex.getUpdateCounts(), uc1));
+        uc1[0] = 6689;
+        assertFalse(Arrays.equals(ex.getUpdateCounts(), uc1));
+    }
+
+    /**
+     * Validate that if null is specified for the update count, it is returned
+     * as null
+     */
+    @Test
+    public void test11() {
+        BatchUpdateException ex = new BatchUpdateException((int[]) null);
+        assertTrue(ex.getMessage() == null && ex.getSQLState() == null
+                && ex.getErrorCode() == 0 && ex.getUpdateCounts() == null
+                && ex.getLargeUpdateCounts() == null);
+    }
+
+    /**
+     * Serialize a BatchUpdateException and make sure you can read it back
+     * properly
+     */
+    @Test
+    public void test12() throws Exception {
+        BatchUpdateException be = new BatchUpdateException(reason, state, errorCode,
+                uc, t);
+        BatchUpdateException bue
+                = createSerializedException(be);
+        assertTrue(reason.equals(bue.getMessage())
+                && bue.getSQLState().equals(state)
+                && cause.equals(bue.getCause().toString())
+                && bue.getErrorCode() == errorCode
+                && Arrays.equals(bue.getLargeUpdateCounts(), luc)
+                && Arrays.equals(bue.getUpdateCounts(), uc));
+    }
+
+
+
+    /**
+     * De-Serialize a BatchUpdateException from JDBC 4.0 and make sure you can
+     * read it back properly
+     */
+    @Test
+    public void test13() throws Exception {
+        String reason1 = "This was the error msg";
+        String state1 = "user defined sqlState";
+        String cause1 = "java.lang.Throwable: throw 1";
+        int errorCode1 = 99999;
+        Throwable t = new Throwable("throw 1");
+        int[] uc1 = {1, 2, 21};
+        long[] luc1 = {1, 2, 21};
+
+        ObjectInputStream ois = new ObjectInputStream(
+                new ByteArrayInputStream(SerializedBatchUpdateException.DATA));
+        BatchUpdateException bue = (BatchUpdateException) ois.readObject();
+        assertTrue(reason1.equals(bue.getMessage())
+                && bue.getSQLState().equals(state1)
+                && bue.getErrorCode() == errorCode1
+                && cause1.equals(bue.getCause().toString())
+                && Arrays.equals(bue.getLargeUpdateCounts(), luc1)
+                && Arrays.equals(bue.getUpdateCounts(), uc1));
+    }
+
+    /**
+     * Serialize a BatchUpdateException with an Integer.MAX_VALUE + 1 and
+     * validate you can read it back properly
+     */
+    @Test
+    public void test14() throws Exception {
+        int[] uc1 = {Integer.MAX_VALUE, Integer.MAX_VALUE + 1};
+        long[] luc1 = {Integer.MAX_VALUE, Integer.MAX_VALUE + 1};
+        BatchUpdateException be = new BatchUpdateException(reason, state, errorCode,
+                luc1, t);
+                BatchUpdateException bue
+                = createSerializedException(be);
+        assertTrue(reason.equals(bue.getMessage())
+                && bue.getSQLState().equals(state)
+                && cause.equals(bue.getCause().toString())
+                && bue.getErrorCode() == errorCode
+                && Arrays.equals(bue.getLargeUpdateCounts(), luc1)
+                && Arrays.equals(bue.getUpdateCounts(), uc1));
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test15() {
+        BatchUpdateException ex = new BatchUpdateException("Exception 1", uc, t1);
+        BatchUpdateException ex1 = new BatchUpdateException("Exception 2", uc);
+        BatchUpdateException ex2 = new BatchUpdateException("Exception 3", uc, t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test16() {
+        BatchUpdateException ex = new BatchUpdateException("Exception 1", uc,  t1);
+        BatchUpdateException ex1 = new BatchUpdateException("Exception 2", uc);
+        BatchUpdateException ex2 = new BatchUpdateException("Exception 3", uc, t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        SQLException sqe = ex;
+        int num = 0;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/DataTruncationTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,209 @@
+/*
+ * 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 test.sql;
+
+import java.sql.DataTruncation;
+import java.sql.SQLException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class DataTruncationTests extends BaseTest {
+
+    private final String READ_TRUNCATION = "01004";
+    private final String WRITE_TRUNCATION = "22001";
+    private final String dtReason = "Data truncation";
+    private final int dterrorCode = 0;
+    private final String[] dtmsgs = {dtReason, "cause 1", dtReason,
+        dtReason, "cause 2"};
+    private boolean onRead = false;
+    private final boolean parameter = false;
+    private final int index = 21;
+    private final int dataSize = 25;
+    private final int transferSize = 10;
+
+    /**
+     * Create DataTruncation object indicating a truncation on read
+     */
+    @Test
+    public void test() {
+        onRead = true;
+        DataTruncation e = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize);
+        assertTrue(e.getMessage().equals(dtReason)
+                && e.getSQLState().equals(READ_TRUNCATION)
+                && e.getCause() == null
+                && e.getErrorCode() == dterrorCode
+                && e.getParameter() == parameter
+                && e.getRead() == onRead
+                && e.getDataSize() == dataSize
+                && e.getTransferSize() == transferSize
+                && e.getIndex() == index);
+    }
+
+    /**
+     * Create DataTruncation object indicating a truncation on write
+     */
+    @Test
+    public void test1() {
+        onRead = false;
+        DataTruncation e = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize);
+        assertTrue(e.getMessage().equals(dtReason)
+                && e.getSQLState().equals(WRITE_TRUNCATION)
+                && e.getCause() == null
+                && e.getErrorCode() == dterrorCode
+                && e.getParameter() == parameter
+                && e.getRead() == onRead
+                && e.getDataSize() == dataSize
+                && e.getTransferSize() == transferSize
+                && e.getIndex() == index);
+    }
+
+    /**
+     * Create DataTruncation object indicating a truncation on read with a
+     * Throwable
+     */
+    @Test
+    public void test2() {
+        onRead = true;
+        DataTruncation e = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize, t);
+        assertTrue(e.getMessage().equals(dtReason)
+                && e.getSQLState().equals(READ_TRUNCATION)
+                && cause.equals(e.getCause().toString())
+                && e.getErrorCode() == dterrorCode
+                && e.getParameter() == parameter
+                && e.getRead() == onRead
+                && e.getDataSize() == dataSize
+                && e.getTransferSize() == transferSize
+                && e.getIndex() == index);
+    }
+
+    /**
+     * Create DataTruncation object indicating a truncation on read with null
+     * specified for the Throwable
+     */
+    @Test
+    public void test3() {
+        onRead = true;;
+        DataTruncation e = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize, null);
+        assertTrue(e.getMessage().equals(dtReason)
+                && e.getSQLState().equals(READ_TRUNCATION)
+                && e.getCause() == null
+                && e.getErrorCode() == dterrorCode
+                && e.getParameter() == parameter
+                && e.getRead() == onRead
+                && e.getDataSize() == dataSize
+                && e.getTransferSize() == transferSize
+                && e.getIndex() == index);
+    }
+
+    /**
+     * Create DataTruncation object indicating a truncation on read and you can
+     * pass a -1 for the index
+     */
+    @Test
+    public void test4() {
+        onRead = true;
+        int negIndex = -1;
+        DataTruncation e = new DataTruncation(negIndex, parameter, onRead,
+                dataSize, transferSize);
+        assertTrue(e.getMessage().equals(dtReason)
+                && e.getSQLState().equals(READ_TRUNCATION)
+                && e.getCause() == null
+                && e.getErrorCode() == dterrorCode
+                && e.getParameter() == parameter
+                && e.getRead() == onRead
+                && e.getDataSize() == dataSize
+                && e.getTransferSize() == transferSize
+                && e.getIndex() == negIndex);
+    }
+
+    /**
+     * Serialize a DataTruncation and make sure you can read it back properly
+     */
+    @Test
+    public void test5() throws Exception {
+        DataTruncation e = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize);
+        DataTruncation ex1 = createSerializedException(e);
+        assertTrue(e.getMessage().equals(dtReason)
+                && e.getSQLState().equals(READ_TRUNCATION)
+                && e.getCause() == null
+                && e.getErrorCode() == dterrorCode
+                && e.getParameter() == parameter
+                && e.getRead() == onRead
+                && e.getDataSize() == dataSize
+                && e.getTransferSize() == transferSize
+                && e.getIndex() == index);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct using
+     * for-each loop
+     */
+    @Test
+    public void test11() {
+        DataTruncation ex = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize, t1);
+        DataTruncation ex1 = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize);
+        DataTruncation ex2 = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize, t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(dtmsgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct using
+     * traditional while loop
+     */
+    @Test
+    public void test12() {
+        DataTruncation ex = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize, t1);
+        DataTruncation ex1 = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize);
+        DataTruncation ex2 = new DataTruncation(index, parameter, onRead,
+                dataSize, transferSize, t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(dtmsgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(dtmsgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/DateTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,373 @@
+/*
+ * 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 test.sql;
+
+import java.sql.Date;
+import java.time.Instant;
+import java.time.LocalDate;
+import static org.testng.Assert.*;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class DateTests extends BaseTest {
+
+    /*
+     * Validate an IllegalArgumentException is thrown for an invalid Date string
+     */
+    @Test(dataProvider = "invalidDateValues",
+            expectedExceptions = IllegalArgumentException.class)
+    public void test(String d) throws Exception {
+        Date.valueOf(d);
+    }
+
+    /*
+     * Test that a date created from a date string is equal to the value
+     * returned from toString()
+     */
+    @Test(dataProvider = "validDateValues")
+    public void test00(String d, String expectedD) {
+        Date d1 = Date.valueOf(d);
+        Date d2 = Date.valueOf(expectedD);
+        assertTrue(d1.equals(d2) && d2.equals(d1)
+                && d1.toString().equals(expectedD), "Error d1 != d2");
+    }
+
+    /*
+     * Validate that a Date.after() returns false when same date is compared
+     */
+    @Test
+    public void test01() {
+        Date d = Date.valueOf("1961-08-30");
+        assertFalse(d.after(d), "Error d.after(d) = true");
+    }
+
+    /*
+     * Validate that a Date.after() returns true when later date is compared to
+     * earlier date
+     */
+    @Test
+    public void test2() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(System.currentTimeMillis());
+        assertTrue(d2.after(d), "Error d2.after(d) = false");
+    }
+
+    /*
+     * Validate that a Date.after() returns false when earlier date is compared
+     * to later date
+     */
+    @Test
+    public void test3() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(d.getTime());
+        assertFalse(d.after(d2), "Error d.after(d2) = true");
+    }
+
+    /*
+     * Validate that a Date.after() returns false when date compared to another
+     * date created from the original date
+     */
+    @Test
+    public void test4() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(d.getTime());
+        assertFalse(d.after(d2), "Error d.after(d2) = true");
+        assertFalse(d2.after(d), "Error d2.after(d) = true");
+    }
+
+    /*
+     * Validate that a Date.before() returns false when same date is compared
+     */
+    @Test
+    public void test5() {
+        Date d = Date.valueOf("1961-08-30");
+        assertFalse(d.before(d), "Error d.before(d) = true");
+    }
+
+    /*
+     * Validate that a Date.before() returns true when earlier date is compared
+     * to later date
+     */
+    @Test
+    public void test6() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(System.currentTimeMillis());
+        assertTrue(d.before(d2), "Error d.before(d2) = false");
+    }
+
+    /*
+     * Validate that a Date.before() returns false when later date is compared
+     * to earlier date
+     */
+    @Test
+    public void test7() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(d.getTime());
+        assertFalse(d2.before(d), "Error d2.before(d) = true");
+    }
+
+    /*
+     * Validate that a Date.before() returns false when date compared to another
+     * date created from the original date
+     */
+    @Test
+    public void test8() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(d.getTime());
+        assertFalse(d.before(d2), "Error d.before(d2) = true");
+        assertFalse(d2.before(d), "Error d2.before(d) = true");
+    }
+
+    /*
+     * Validate that a Date.compareTo returns 0 when both Date objects are the
+     * same
+     */
+    @Test
+    public void test9() {
+        Date d = Date.valueOf("1961-08-30");
+        assertTrue(d.compareTo(d) == 0, "Error d.compareTo(d) !=0");
+    }
+
+    /*
+     * Validate that a Date.compareTo returns 0 when both Date objects represent
+     * the same date
+     */
+    @Test
+    public void test10() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(d.getTime());
+        assertTrue(d.compareTo(d2) == 0, "Error d.compareTo(d2) !=0");
+    }
+
+    /*
+     * Validate that a Date.compareTo returns -1 when comparing a date to a
+     * later date
+     */
+    @Test
+    public void test11() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(System.currentTimeMillis());
+        assertTrue(d.compareTo(d2) == -1, "Error d.compareTo(d2) != -1");
+    }
+
+    /*
+     * Validate that a Date.compareTo returns 1 when comparing a date to an
+     * earlier date
+     */
+    @Test
+    public void test12() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(System.currentTimeMillis());
+        assertTrue(d2.compareTo(d) == 1, "Error d.compareTo(d2) != 1");
+    }
+
+    /*
+     * Validate that a Date made from a LocalDate are equal
+     */
+    @Test
+    public void test13() {
+        Date d = Date.valueOf("1961-08-30");
+        LocalDate ldt = d.toLocalDate();
+        Date d2 = Date.valueOf(ldt);
+        assertTrue(d.equals(d2), "Error d != d2");
+    }
+
+    /*
+     * Validate that a Date LocalDate value, made from a LocalDate are equal
+     */
+    @Test
+    public void test14() {
+        LocalDate ldt = LocalDate.now();
+        Date d = Date.valueOf(ldt);
+        assertTrue(ldt.equals(d.toLocalDate()),
+                "Error LocalDate values are not equal");
+    }
+
+    /*
+     * Validate an NPE occurs when a null LocalDate is passed to valueOf
+     */
+    @Test(expectedExceptions = NullPointerException.class)
+    public void test15() throws Exception {
+        LocalDate ld = null;
+        Date.valueOf(ld);
+    }
+
+    /*
+     * Validate an UnsupportedOperationException occurs when toInstant() is
+     * called
+     */
+    @Test(expectedExceptions = UnsupportedOperationException.class)
+    public void test16() throws Exception {
+        Date d = Date.valueOf("1961-08-30");
+        Instant instant = d.toInstant();
+    }
+
+    /*
+     * Validate that two Date objects are equal when one is created from the
+     * toString() of the other
+     */
+    @Test
+    public void test17() {
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = Date.valueOf(d.toString());
+        assertTrue(d.equals(d2) && d2.equals(d), "Error d != d2");
+    }
+
+    /*
+     * Validate that two Date values one created using valueOf and another via a
+     * constructor are equal
+     */
+    @Test
+    public void test18() {
+
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(61, 7, 30);
+        assertTrue(d.equals(d2), "Error d != d2");
+    }
+
+    /*
+     * Validate that two Date values one created using getTime() of the other
+     * are equal
+     */
+    @Test
+    public void test19() {
+
+        Date d = Date.valueOf("1961-08-30");
+        Date d2 = new Date(d.getTime());
+        assertTrue(d.equals(d2), "Error d != d2");
+    }
+
+    /*
+     * Validate that a Date value is equal to itself
+     */
+    @Test
+    public void test20() {
+
+        Date d = Date.valueOf("1961-08-30");
+        assertTrue(d.equals(d), "Error d != d");
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling getHours
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test21() throws Exception {
+        Date d = Date.valueOf("1961-08-30");
+        d.getHours();
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling getMinutes
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test22() throws Exception {
+        Date d = Date.valueOf("1961-08-30");
+        d.getMinutes();
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling getSeconds
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test23() throws Exception {
+        Date d = Date.valueOf("1961-08-30");
+        d.getSeconds();
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling setHours
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test24() throws Exception {
+        Date d = Date.valueOf("1961-08-30");
+        d.setHours(8);
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling setMinutes
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test25() throws Exception {
+        Date d = Date.valueOf("1961-08-30");
+        d.setMinutes(0);
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling setSeconds
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test26() throws Exception {
+        Date d = Date.valueOf("1961-08-30");
+        d.setSeconds(0);
+    }
+
+    /*
+     * DataProvider used to provide Date which are not valid and are used
+     * to validate that an IllegalArgumentException will be thrown from the
+     * valueOf method
+     */
+    @DataProvider(name = "invalidDateValues")
+    private Object[][] invalidDateValues() {
+        return new Object[][]{
+            {"20009-11-01"},
+            {"09-11-01"},
+            {"-11-01"},
+            {"2009-111-01"},
+            {"2009--01"},
+            {"2009-13-01"},
+            {"2009-11-011"},
+            {"2009-11-"},
+            {"2009-11-00"},
+            {"2009-11-33"},
+            {"--"},
+            {""},
+            {null},
+            {"-"},
+            {"2009"},
+            {"2009-01"},
+            {"---"},
+            {"2009-13--1"},
+            {"1900-1-0"},
+            {"2009-01-01 10:50:01"},
+            {"1996-12-10 12:26:19.1"},
+            {"10:50:01"}
+        };
+    }
+
+    /*
+     * DataProvider used to provide Dates which are  valid and are used
+     * to validate that an IllegalArgumentException will not be thrown from the
+     * valueOf method and the corect value from toString() is returned
+     */
+    @DataProvider(name = "validDateValues")
+    private Object[][] validDateValues() {
+        return new Object[][]{
+            {"2009-08-30", "2009-08-30"},
+            {"2009-01-8", "2009-01-08"},
+            {"2009-1-01", "2009-01-01"},
+            {"2009-1-1", "2009-01-01"}
+
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/DriverManagerPermissionsTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,154 @@
+/*
+ * 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 test.sql;
+
+import java.security.AccessControlException;
+import java.security.Policy;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import util.BaseTest;
+import util.StubDriver;
+import util.TestPolicy;
+
+public class DriverManagerPermissionsTests extends BaseTest {
+
+    private  static Policy policy;
+    private static SecurityManager sm;
+
+    /*
+     * Install a SecurityManager along with a base Policy to allow testNG to run
+     */
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+        setPolicy(new TestPolicy());
+        System.setSecurityManager(new SecurityManager());
+    }
+
+    /*
+     * Install the original Policy and SecurityManager
+     */
+    @AfterClass
+    public static void tearDownClass() throws Exception {
+        System.setSecurityManager(sm);
+        setPolicy(policy);
+    }
+
+    /*
+     * Save off the original Policy and SecurityManager
+     */
+    public DriverManagerPermissionsTests() {
+        policy = Policy.getPolicy();
+        sm = System.getSecurityManager();
+    }
+
+    /*
+     * Validate that AccessControlException is thrown if SQLPermission("setLog")
+     * has not been granted
+     */
+    @Test(expectedExceptions = AccessControlException.class)
+    public void test() {
+        setPolicy(new TestPolicy());
+        DriverManager.setLogStream(null);
+    }
+
+    /*
+     * Validate that setLogStream succeeds if SQLPermission("setLog") has been
+     * granted
+     */
+    @Test
+    public void test1() {
+        Policy.setPolicy(new TestPolicy("setLog"));
+        DriverManager.setLogStream(null);
+    }
+
+    /*
+     * Validate that setLogStream succeeds if AllPermissions has been granted
+     */
+    @Test
+    public void test2() {
+        setPolicy(new TestPolicy("all"));
+        DriverManager.setLogStream(null);
+    }
+
+    /*
+     * Validate that AccessControlException is thrown if SQLPermission("setLog")
+     * has not been granted
+     */
+    @Test(expectedExceptions = AccessControlException.class)
+    public void test4() {
+        setPolicy(new TestPolicy());
+        DriverManager.setLogWriter(null);
+    }
+
+    /*
+     * Validate that setLogWriter succeeds if SQLPermission("setLog") has been
+     * granted
+     */
+    @Test
+    public void test5() {
+        setPolicy(new TestPolicy("setLog"));
+        DriverManager.setLogWriter(null);
+    }
+
+    /*
+     * Validate that setLogWriter succeeds if AllPermissions has been granted
+     */
+    @Test
+    public void test6() {
+        setPolicy(new TestPolicy("all"));
+        DriverManager.setLogWriter(null);
+    }
+
+    /*
+     * Validate that AccessControlException is thrown if
+     * SQLPermission("deregisterDriver") has not been granted
+     */
+    @Test(expectedExceptions = AccessControlException.class)
+    public void test7() throws SQLException {
+        setPolicy(new TestPolicy());
+        DriverManager.deregisterDriver(new StubDriver());
+    }
+
+    /*
+     * Validate that deregisterDriver succeeds if
+     * SQLPermission("deregisterDriver") has been granted
+     */
+    @Test
+    public void test8() throws SQLException {
+        setPolicy(new TestPolicy("deregisterDriver"));
+        DriverManager.deregisterDriver(new StubDriver());
+    }
+
+    /*
+     * Validate that deregisterDriver succeeds if AllPermissions has been
+     * granted
+     */
+    @Test
+    public void test9() throws SQLException {
+        setPolicy(new TestPolicy("all"));
+        DriverManager.deregisterDriver(new StubDriver());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/DriverManagerTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,354 @@
+/*
+ * 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 test.sql;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.CharArrayReader;
+import java.io.CharArrayWriter;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+import static org.testng.Assert.*;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import util.StubDriver;
+
+public class DriverManagerTests {
+
+    private final String StubDriverURL = "jdbc:tennis:boy";
+    private final String StubDriverDAURL = "jdbc:luckydog:tennis";
+    private final String InvalidURL = "jdbc:cardio:tennis";
+    private String[] results = {"output", "more output", "and more", "the end"};
+    private String noOutput = "should not find this";
+
+    public DriverManagerTests() {
+    }
+
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+    }
+
+    @AfterClass
+    public static void tearDownClass() throws Exception {
+    }
+
+    @BeforeMethod
+    public void setUpMethod() throws Exception {
+        removeAllDrivers();
+    }
+
+    @AfterMethod
+    public void tearDownMethod() throws Exception {
+    }
+
+    /**
+     * Utility method to remove all registered drivers
+     */
+    private static void removeAllDrivers() {
+        java.util.Enumeration e = DriverManager.getDrivers();
+        while (e.hasMoreElements()) {
+            try {
+                DriverManager.deregisterDriver((Driver) (e.nextElement()));
+            } catch (SQLException ex) {
+                System.out.print(ex.getMessage());
+            }
+        }
+    }
+
+    /**
+     * Utility method to see if a driver is registered
+     */
+    private boolean isDriverRegistered(Driver d) {
+        boolean foundDriver = false;
+        java.util.Enumeration e = DriverManager.getDrivers();
+        while (e.hasMoreElements()) {
+            if (d == (Driver) e.nextElement()) {
+                foundDriver = true;
+                break;
+            }
+        }
+        return foundDriver;
+    }
+
+    /**
+     * Validate that values set using setLoginTimeout will be returned by
+     * getLoginTimeout
+     */
+    @Test
+    public void test() {
+        int[] vals = {-1, 0, 5};
+        for (int val : vals) {
+            DriverManager.setLoginTimeout(val);
+            assertEquals(val, DriverManager.getLoginTimeout());
+        }
+    }
+
+    /**
+     * Validate that NullPointerException is thrown when null is passed to
+     * registerDriver
+     */
+    @Test(expectedExceptions = NullPointerException.class)
+    public void test1() throws Exception {
+        Driver d = null;
+        DriverManager.registerDriver(d);
+    }
+
+    /**
+     * Validate that NullPointerException is thrown when null is passed to
+     * registerDriver
+     */
+    @Test(expectedExceptions = NullPointerException.class)
+    public void test2() throws Exception {
+        Driver d = null;
+        DriverManager.registerDriver(d, null);
+    }
+
+    /**
+     * Validate that a null value allows for deRegisterDriver to return
+     */
+    @Test
+    public void test3() throws Exception {
+        DriverManager.deregisterDriver(null);
+
+    }
+
+    /**
+     * Validate that SQLException is thrown when there is no Driver to service
+     * the URL
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test4() throws Exception {
+        DriverManager.getConnection(InvalidURL);
+    }
+
+    /**
+     * Validate that SQLException is thrown when there is no Driver to service
+     * the URL
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test5() throws Exception {
+        DriverManager.getConnection(InvalidURL, new Properties());
+    }
+
+    /**
+     * Validate that SQLException is thrown when there is no Driver to service
+     * the URL
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test6() throws Exception {
+        DriverManager.getConnection(InvalidURL, "LuckyDog", "tennisanyone");
+    }
+
+    /**
+     * Validate that SQLException is thrown when null is passed for the URL
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test7() throws Exception {
+        DriverManager.getConnection(null);
+    }
+
+    /**
+     * Validate that SQLException is thrown when null is passed for the URL
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test8() throws Exception {
+        DriverManager.getConnection(null, new Properties());
+    }
+
+    /**
+     * Validate that SQLException is thrown when null is passed for the URL
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test9() throws Exception {
+        DriverManager.getConnection(null, "LuckyDog", "tennisanyone");
+    }
+
+    /**
+     * Validate that SQLException is thrown when there is no Driver to service
+     * the URL
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test10() throws Exception {
+        DriverManager.getDriver(InvalidURL);
+    }
+
+    /**
+     * Validate that SQLException is thrown when null is passed for the URL
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test11() throws Exception {
+        DriverManager.getDriver(null);
+    }
+
+    /**
+     * Validate that a non-null Driver is returned by getDriver when a valid URL
+     * is specified
+     */
+    @Test
+    public void test12() throws Exception {
+
+        DriverManager.registerDriver(new StubDriver());
+        assertTrue(DriverManager.getDriver(StubDriverURL) != null);
+    }
+
+    /**
+     * Validate that SQLException is thrown when the URL is not valid for any of
+     * the registered drivers
+     */
+    @Test(expectedExceptions = SQLException.class)
+    public void test13() throws Exception {
+        DriverManager.registerDriver(new StubDriver());
+        DriverManager.getDriver(InvalidURL);
+    }
+
+    /**
+     * Validate that a Connection object is returned when a valid URL is
+     * specified to getConnection
+     *
+     */
+    @Test
+    public void test14() throws Exception {
+
+        DriverManager.registerDriver(new StubDriver());
+        assertTrue(
+                DriverManager.getConnection(StubDriverURL) != null);
+        assertTrue(DriverManager.getConnection(StubDriverURL,
+                "LuckyDog", "tennisanyone") != null);
+        Properties props = new Properties();
+        props.put("user", "LuckyDog");
+        props.put("password", "tennisanyone");
+        assertTrue(
+                DriverManager.getConnection(StubDriverURL,
+                        props) != null);
+    }
+
+    /**
+     * Register a driver and make sure you find it via its URL. Deregister the
+     * driver and validate it is not longer registered
+     *
+     * @throws Exception
+     */
+    @Test()
+    public void test15() throws Exception {
+        DriverManager.registerDriver(new StubDriver());
+        Driver d = DriverManager.getDriver(StubDriverURL);
+        assertTrue(d != null);
+        assertTrue(isDriverRegistered(d));
+        DriverManager.deregisterDriver(d);
+        assertFalse(isDriverRegistered(d));
+    }
+
+    /**
+     * Validate that DriverAction.release is called when a driver is registered
+     * via registerDriver(Driver, DriverAction)
+     *
+     * @throws Exception
+     */
+    @Test
+    public void test16() throws Exception {
+        File file = new File(util.StubDriverDA.DriverActionCalled);
+        file.delete();
+        assertFalse(file.exists());
+        Driver d = null;
+        Class.forName("util.StubDriverDA");
+        d = DriverManager.getDriver(StubDriverDAURL);
+        DriverManager.deregisterDriver(d);
+        assertFalse(isDriverRegistered(d), "Driver is registered");
+        assertTrue(file.exists());
+    }
+
+    /**
+     * Create a PrintStream and use to send output via DriverManager.println
+     * Validate that if you disable the stream, the output sent is not present
+     */
+    @Test
+    public void tests17() throws Exception {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        PrintStream ps = new PrintStream(os);
+        DriverManager.setLogStream(ps);
+        assertTrue(DriverManager.getLogStream() == ps);
+
+        DriverManager.println(results[0]);
+        DriverManager.setLogStream((PrintStream) null);
+        assertTrue(DriverManager.getLogStream() == null);
+        DriverManager.println(noOutput);
+        DriverManager.setLogStream(ps);
+        DriverManager.println(results[1]);
+        DriverManager.println(results[2]);
+        DriverManager.println(results[3]);
+        DriverManager.setLogStream((PrintStream) null);
+        DriverManager.println(noOutput);
+
+        /*
+         * Check we do not get the output when the stream is disabled
+         */
+        InputStreamReader is
+                = new InputStreamReader(new ByteArrayInputStream(os.toByteArray()));
+        BufferedReader reader = new BufferedReader(is);
+        for (String result : results) {
+            assertTrue(result.equals(reader.readLine()));
+        }
+    }
+
+    /**
+     * Create a PrintWriter and use to to send output via DriverManager.println
+     * Validate that if you disable the writer, the output sent is not present
+     */
+    @Test
+    public void tests18() throws Exception {
+        CharArrayWriter cw = new CharArrayWriter();
+        PrintWriter pw = new PrintWriter(cw);
+        DriverManager.setLogWriter(pw);
+        assertTrue(DriverManager.getLogWriter() == pw);
+
+        DriverManager.println(results[0]);
+        DriverManager.setLogWriter(null);
+        assertTrue(DriverManager.getLogWriter() == null);
+        DriverManager.println(noOutput);
+        DriverManager.setLogWriter(pw);
+        DriverManager.println(results[1]);
+        DriverManager.println(results[2]);
+        DriverManager.println(results[3]);
+        DriverManager.setLogWriter(null);
+        DriverManager.println(noOutput);
+
+        /*
+         * Check we do not get the output when the stream is disabled
+         */
+        BufferedReader reader
+                = new BufferedReader(new CharArrayReader(cw.toCharArray()));
+        for (String result : results) {
+            assertTrue(result.equals(reader.readLine()));
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLClientInfoExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,227 @@
+/*
+ * 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 test.sql;
+
+import java.sql.ClientInfoStatus;
+import java.sql.SQLClientInfoException;
+import java.sql.SQLException;
+import java.util.HashMap;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLClientInfoExceptionTests extends BaseTest {
+
+    private final HashMap<String, ClientInfoStatus> map = new HashMap<>();
+
+    public SQLClientInfoExceptionTests() {
+        map.put("1", ClientInfoStatus.REASON_UNKNOWN_PROPERTY);
+        map.put("21", ClientInfoStatus.REASON_UNKNOWN_PROPERTY);
+    }
+
+    /**
+     * Create SQLClientInfoException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLClientInfoException e = new SQLClientInfoException(null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == 0
+                && e.getFailedProperties() == null);
+    }
+
+    /**
+     * Create SQLClientInfoException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLClientInfoException ex = new SQLClientInfoException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && ex.getFailedProperties() == null);
+    }
+
+    /**
+     * Create SQLClientInfoException with null Throwable
+     */
+    @Test
+    public void test2() {
+
+        SQLClientInfoException ex = new SQLClientInfoException(map, null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && ex.getFailedProperties().equals(map));
+    }
+
+    /**
+     * Create SQLClientInfoException with message
+     */
+    @Test
+    public void test3() {
+        SQLClientInfoException ex = new SQLClientInfoException(reason, map);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && ex.getFailedProperties().equals(map));
+    }
+
+    /**
+     * Create SQLClientInfoException with null Throwable
+     */
+    @Test
+    public void test4() {
+        SQLClientInfoException ex = new SQLClientInfoException(reason, map, null);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && ex.getFailedProperties().equals(map));
+    }
+
+    /**
+     * Create SQLClientInfoException with message, and SQLState
+     */
+    @Test
+    public void test5() {
+        SQLClientInfoException ex = new SQLClientInfoException(reason, state,
+                map);
+
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0
+                && ex.getFailedProperties().equals(map));
+    }
+
+    /**
+     * Create SQLClientInfoException with message, and SQLState
+     */
+    @Test
+    public void test6() {
+        SQLClientInfoException ex = new SQLClientInfoException(reason, state,
+                map, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0
+                && ex.getFailedProperties().equals(map));
+    }
+
+    /**
+     * Create SQLClientInfoException with message, SQLState, errorCode, and
+     * Throwable
+     */
+    @Test
+    public void test7() {
+        SQLClientInfoException ex = new SQLClientInfoException(reason, state,
+                errorCode, map);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode
+                && ex.getFailedProperties().equals(map));
+    }
+
+    /**
+     * Create SQLClientInfoException with message, SQLState, and error code
+     */
+    @Test
+    public void test8() {
+        SQLClientInfoException ex = new SQLClientInfoException(reason, state,
+                errorCode, map, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode
+                && ex.getFailedProperties().equals(map));
+    }
+
+    /**
+     * Serialize a SQLClientInfoException and make sure you can read it back
+     * properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLClientInfoException e = new SQLClientInfoException(reason, state,
+                errorCode, map, t);
+        SQLClientInfoException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode
+                && ex1.getFailedProperties().equals(map));
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct using
+     * for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLClientInfoException ex = new SQLClientInfoException("Exception 1",
+                map, t1);
+        SQLClientInfoException ex1 = new SQLClientInfoException("Exception 2",
+                map);
+        SQLClientInfoException ex2 = new SQLClientInfoException("Exception 3",
+                map, t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct using
+     * traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLClientInfoException ex = new SQLClientInfoException("Exception 1",
+                map, t1);
+        SQLClientInfoException ex1 = new SQLClientInfoException("Exception 2",
+                map);
+        SQLClientInfoException ex2 = new SQLClientInfoException("Exception 3",
+                map, t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLDataExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,215 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLDataException;
+import java.sql.SQLException;
+import java.sql.SQLNonTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLDataExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLDataException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLDataException e = new SQLDataException(null, null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLDataException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLDataException ex = new SQLDataException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLDataException with message
+     */
+    @Test
+    public void test2() {
+        SQLDataException ex = new SQLDataException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLDataException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLDataException ex = new SQLDataException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLDataException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLDataException ex = new SQLDataException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLDataException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLDataException ex = new SQLDataException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLDataException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLDataException ex = new SQLDataException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLDataException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLDataException ex = new SQLDataException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLDataException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLDataException ex = new SQLDataException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLDataException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLDataException ex = new SQLDataException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLDataException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLDataException e = new SQLDataException(reason, state, errorCode, t);
+        SQLDataException ex1 = createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLDataException ex = new SQLDataException("Exception 1", t1);
+        SQLDataException ex1 = new SQLDataException("Exception 2");
+        SQLDataException ex2 = new SQLDataException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLDataException ex = new SQLDataException("Exception 1", t1);
+        SQLDataException ex1 = new SQLDataException("Exception 2");
+        SQLDataException ex2 = new SQLDataException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLDataException and validate it is an instance of
+     * SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLDataException();
+        assertTrue(ex instanceof SQLNonTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,202 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLException e = new SQLException(null, null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLException ex = new SQLException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLException with message
+     */
+    @Test
+    public void test2() {
+        SQLException ex = new SQLException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLException ex = new SQLException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLException ex = new SQLException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLException ex = new SQLException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLException ex = new SQLException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLException ex = new SQLException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLException ex = new SQLException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLException ex = new SQLException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLException e = new SQLException(reason, state, errorCode, t);
+        SQLException ex1 = createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLException ex = new SQLException("Exception 1", t1);
+        SQLException ex1 = new SQLException("Exception 2");
+        SQLException ex2 = new SQLException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLException ex = new SQLException("Exception 1", t1);
+        SQLException ex1 = new SQLException("Exception 2");
+        SQLException ex2 = new SQLException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        while (ex != null) {
+            assertTrue(msgs[num++].equals(ex.getMessage()));
+            Throwable c = ex.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            ex = ex.getNextException();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLFeatureNotSupportedExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,232 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.SQLNonTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLFeatureNotSupportedExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLFeatureNotSupportedException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLFeatureNotSupportedException e =
+                new SQLFeatureNotSupportedException(null, null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLFeatureNotSupportedException ex = new SQLFeatureNotSupportedException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with message
+     */
+    @Test
+    public void test2() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException((Throwable) null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLFeatureNotSupportedException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLFeatureNotSupportedException e =
+                new SQLFeatureNotSupportedException(reason, state, errorCode, t);
+        SQLFeatureNotSupportedException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException("Exception 1", t1);
+        SQLFeatureNotSupportedException ex1 =
+                new SQLFeatureNotSupportedException("Exception 2");
+        SQLFeatureNotSupportedException ex2 =
+                new SQLFeatureNotSupportedException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLFeatureNotSupportedException ex =
+                new SQLFeatureNotSupportedException("Exception 1", t1);
+        SQLFeatureNotSupportedException ex1 =
+                new SQLFeatureNotSupportedException("Exception 2");
+        SQLFeatureNotSupportedException ex2 =
+                new SQLFeatureNotSupportedException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLFeatureNotSupportedException and validate it is an instance of
+     * SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLFeatureNotSupportedException();
+        assertTrue(ex instanceof SQLNonTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLIntegrityConstraintViolationExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,235 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLIntegrityConstraintViolationException;
+import java.sql.SQLNonTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLIntegrityConstraintViolationExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLIntegrityConstraintViolationException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLIntegrityConstraintViolationException e =
+                new SQLIntegrityConstraintViolationException(null,
+                null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with message
+     */
+    @Test
+    public void test2() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLIntegrityConstraintViolationException and make sure
+     * you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLIntegrityConstraintViolationException e =
+                new SQLIntegrityConstraintViolationException(reason, state, errorCode, t);
+        SQLIntegrityConstraintViolationException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException("Exception 1", t1);
+        SQLIntegrityConstraintViolationException ex1 =
+                new SQLIntegrityConstraintViolationException("Exception 2");
+        SQLIntegrityConstraintViolationException ex2 =
+                new SQLIntegrityConstraintViolationException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLIntegrityConstraintViolationException ex =
+                new SQLIntegrityConstraintViolationException("Exception 1", t1);
+        SQLIntegrityConstraintViolationException ex1 =
+                new SQLIntegrityConstraintViolationException("Exception 2");
+        SQLIntegrityConstraintViolationException ex2 =
+                new SQLIntegrityConstraintViolationException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLIntegrityConstraintViolationException and validate it is an instance of
+     * SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLIntegrityConstraintViolationException();
+        assertTrue(ex instanceof SQLNonTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLInvalidAuthorizationSpecExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,239 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLInvalidAuthorizationSpecException;
+import java.sql.SQLNonTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLInvalidAuthorizationSpecExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException and setting all objects to
+     * null
+     */
+    @Test
+    public void test() {
+        SQLInvalidAuthorizationSpecException e
+                = new SQLInvalidAuthorizationSpecException(null,
+                        null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with message
+     */
+    @Test
+    public void test2() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with message, SQLState, and
+     * error code
+     */
+    @Test
+    public void test4() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with message, SQLState,
+     * errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with message, SQLState, and
+     * Throwable
+     */
+    @Test
+    public void test6() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException((Throwable) null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLInvalidAuthorizationSpecException and make sure you can
+     * read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLInvalidAuthorizationSpecException e
+                = new SQLInvalidAuthorizationSpecException(reason, state, errorCode, t);
+        SQLInvalidAuthorizationSpecException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct using
+     * for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException("Exception 1", t1);
+        SQLInvalidAuthorizationSpecException ex1
+                = new SQLInvalidAuthorizationSpecException("Exception 2");
+        SQLInvalidAuthorizationSpecException ex2
+                = new SQLInvalidAuthorizationSpecException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct using
+     * traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLInvalidAuthorizationSpecException ex
+                = new SQLInvalidAuthorizationSpecException("Exception 1", t1);
+        SQLInvalidAuthorizationSpecException ex1
+                = new SQLInvalidAuthorizationSpecException("Exception 2");
+        SQLInvalidAuthorizationSpecException ex2
+                = new SQLInvalidAuthorizationSpecException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLInvalidAuthorizationSpecException and validate it is an
+     * instance of SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLInvalidAuthorizationSpecException();
+        assertTrue(ex instanceof SQLNonTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLNonTransientConnectionExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,235 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLNonTransientConnectionException;
+import java.sql.SQLNonTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLNonTransientConnectionExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLNonTransientConnectionException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLNonTransientConnectionException e =
+                new SQLNonTransientConnectionException(null,
+                null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with message
+     */
+    @Test
+    public void test2() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLNonTransientConnectionException and make sure you can
+     * read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLNonTransientConnectionException e =
+                new SQLNonTransientConnectionException(reason, state, errorCode, t);
+        SQLNonTransientConnectionException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException("Exception 1", t1);
+        SQLNonTransientConnectionException ex1 =
+                new SQLNonTransientConnectionException("Exception 2");
+        SQLNonTransientConnectionException ex2 =
+                new SQLNonTransientConnectionException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLNonTransientConnectionException ex =
+                new SQLNonTransientConnectionException("Exception 1", t1);
+        SQLNonTransientConnectionException ex1 =
+                new SQLNonTransientConnectionException("Exception 2");
+        SQLNonTransientConnectionException ex2 =
+                new SQLNonTransientConnectionException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLNonTransientConnectionException and validate it is an instance of
+     * SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLNonTransientConnectionException();
+        assertTrue(ex instanceof SQLNonTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLNonTransientExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,209 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLNonTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLNonTransientExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLNonTransientException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLNonTransientException e = new SQLNonTransientException(null,
+                null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLNonTransientException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLNonTransientException ex = new SQLNonTransientException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientException with message
+     */
+    @Test
+    public void test2() {
+        SQLNonTransientException ex = new SQLNonTransientException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLNonTransientException ex = new SQLNonTransientException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {;
+        SQLNonTransientException ex =
+                new SQLNonTransientException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLNonTransientException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLNonTransientException ex =
+                new SQLNonTransientException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLNonTransientException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLNonTransientException ex = new SQLNonTransientException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLNonTransientException ex = new SQLNonTransientException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLNonTransientException ex = new SQLNonTransientException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLNonTransientException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLNonTransientException ex = new SQLNonTransientException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLNonTransientException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLNonTransientException e =
+                new SQLNonTransientException(reason, state, errorCode, t);
+        SQLNonTransientException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLNonTransientException ex = new SQLNonTransientException("Exception 1", t1);
+        SQLNonTransientException ex1 = new SQLNonTransientException("Exception 2");
+        SQLNonTransientException ex2 = new SQLNonTransientException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLNonTransientException ex = new SQLNonTransientException("Exception 1", t1);
+        SQLNonTransientException ex1 = new SQLNonTransientException("Exception 2");
+        SQLNonTransientException ex2 = new SQLNonTransientException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLRecoverableExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,209 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLRecoverableException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLRecoverableExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLRecoverableException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLRecoverableException e = new SQLRecoverableException(null,
+               null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLRecoverableException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLRecoverableException ex = new SQLRecoverableException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLRecoverableException with message
+     */
+    @Test
+    public void test2() {
+        SQLRecoverableException ex = new SQLRecoverableException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLRecoverableException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLRecoverableException ex = new SQLRecoverableException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLRecoverableException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLRecoverableException ex =
+                new SQLRecoverableException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLRecoverableException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLRecoverableException ex =
+                new SQLRecoverableException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLRecoverableException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLRecoverableException ex = new SQLRecoverableException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLRecoverableException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLRecoverableException ex = new SQLRecoverableException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLRecoverableException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLRecoverableException ex = new SQLRecoverableException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLRecoverableException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLRecoverableException ex = new SQLRecoverableException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLRecoverableException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLRecoverableException e =
+                new SQLRecoverableException(reason, state, errorCode, t);
+        SQLRecoverableException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLRecoverableException ex = new SQLRecoverableException("Exception 1", t1);
+        SQLRecoverableException ex1 = new SQLRecoverableException("Exception 2");
+        SQLRecoverableException ex2 = new SQLRecoverableException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLRecoverableException ex = new SQLRecoverableException("Exception 1", t1);
+        SQLRecoverableException ex1 = new SQLRecoverableException("Exception 2");
+        SQLRecoverableException ex2 = new SQLRecoverableException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLSyntaxErrorExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,221 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLNonTransientException;
+import java.sql.SQLSyntaxErrorException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLSyntaxErrorExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLSyntaxErrorException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLSyntaxErrorException e = new SQLSyntaxErrorException(null,
+                null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with message
+     */
+    @Test
+    public void test2() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLSyntaxErrorException ex =
+                new SQLSyntaxErrorException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLSyntaxErrorException ex =
+                new SQLSyntaxErrorException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLSyntaxErrorException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLSyntaxErrorException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+
+        SQLSyntaxErrorException e =
+                new SQLSyntaxErrorException(reason, state, errorCode, t);
+        SQLSyntaxErrorException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException("Exception 1", t1);
+        SQLSyntaxErrorException ex1 = new SQLSyntaxErrorException("Exception 2");
+        SQLSyntaxErrorException ex2 = new SQLSyntaxErrorException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLSyntaxErrorException ex = new SQLSyntaxErrorException("Exception 1", t1);
+        SQLSyntaxErrorException ex1 = new SQLSyntaxErrorException("Exception 2");
+        SQLSyntaxErrorException ex2 = new SQLSyntaxErrorException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLSyntaxErrorException and validate it is an instance of
+     * SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLSyntaxErrorException();
+        assertTrue(ex instanceof SQLNonTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLTimeoutExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,218 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLTimeoutException;
+import java.sql.SQLTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLTimeoutExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLTimeoutException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLTimeoutException e = new SQLTimeoutException(null,
+                null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTimeoutException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLTimeoutException ex = new SQLTimeoutException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTimeoutException with message
+     */
+    @Test
+    public void test2() {
+        SQLTimeoutException ex = new SQLTimeoutException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTimeoutException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLTimeoutException ex = new SQLTimeoutException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTimeoutException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLTimeoutException ex = new SQLTimeoutException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTimeoutException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLTimeoutException ex = new SQLTimeoutException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTimeoutException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLTimeoutException ex = new SQLTimeoutException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTimeoutException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLTimeoutException ex = new SQLTimeoutException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTimeoutException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLTimeoutException ex = new SQLTimeoutException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTimeoutException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLTimeoutException ex = new SQLTimeoutException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLTimeoutException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLTimeoutException e =
+                new SQLTimeoutException(reason, state, errorCode, t);
+        SQLTimeoutException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLTimeoutException ex = new SQLTimeoutException("Exception 1", t1);
+        SQLTimeoutException ex1 = new SQLTimeoutException("Exception 2");
+        SQLTimeoutException ex2 = new SQLTimeoutException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLTimeoutException ex = new SQLTimeoutException("Exception 1", t1);
+        SQLTimeoutException ex1 = new SQLTimeoutException("Exception 2");
+        SQLTimeoutException ex2 = new SQLTimeoutException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLTimeoutException and validate it is an instance of
+     * SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLTimeoutException();
+        assertTrue(ex instanceof SQLTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLTransactionRollbackExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,233 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLTransactionRollbackException;
+import java.sql.SQLTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLTransactionRollbackExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLTransactionRollbackException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLTransactionRollbackException e =
+                new SQLTransactionRollbackException(null,
+                null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLTransactionRollbackException ex = new SQLTransactionRollbackException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with message
+     */
+    @Test
+    public void test2() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransactionRollbackException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLTransactionRollbackException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLTransactionRollbackException e =
+                new SQLTransactionRollbackException(reason, state, errorCode, t);
+        SQLTransactionRollbackException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException("Exception 1", t1);
+        SQLTransactionRollbackException ex1 =
+                new SQLTransactionRollbackException("Exception 2");
+        SQLTransactionRollbackException ex2 =
+                new SQLTransactionRollbackException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLTransactionRollbackException ex =
+                new SQLTransactionRollbackException("Exception 1", t1);
+        SQLTransactionRollbackException ex1 =
+                new SQLTransactionRollbackException("Exception 2");
+        SQLTransactionRollbackException ex2 =
+                new SQLTransactionRollbackException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLTransactionRollbackException and validate it is an instance of
+     * SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLTransactionRollbackException();
+        assertTrue(ex instanceof SQLTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLTransientConnectionExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,233 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLTransientConnectionException;
+import java.sql.SQLTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLTransientConnectionExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLTransientConnectionException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLTransientConnectionException e =
+                new SQLTransientConnectionException( null,
+                null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLTransientConnectionException ex = new SQLTransientConnectionException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with message
+     */
+    @Test
+    public void test2() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {;
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientConnectionException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLTransientConnectionException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLTransientConnectionException e =
+                new SQLTransientConnectionException(reason, state, errorCode, t);
+        SQLTransientConnectionException ex1 =
+                createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException("Exception 1", t1);
+        SQLTransientConnectionException ex1 =
+                new SQLTransientConnectionException("Exception 2");
+        SQLTransientConnectionException ex2 =
+                new SQLTransientConnectionException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLTransientConnectionException ex =
+                new SQLTransientConnectionException("Exception 1", t1);
+        SQLTransientConnectionException ex1 =
+                new SQLTransientConnectionException("Exception 2");
+        SQLTransientConnectionException ex2 =
+                new SQLTransientConnectionException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Create SQLTransientConnectionException and validate it is an instance of
+     * SQLNonTransientException
+     */
+    @Test
+    public void test13() {
+        Exception ex = new SQLTransientConnectionException();
+        assertTrue(ex instanceof SQLTransientException);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLTransientExceptionTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,207 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLTransientException;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLTransientExceptionTests extends BaseTest {
+
+    /**
+     * Create SQLTransientException and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLTransientException e = new SQLTransientException(null,
+                null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransientException with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLTransientException ex = new SQLTransientException();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientException with message
+     */
+    @Test
+    public void test2() {
+        SQLTransientException ex = new SQLTransientException(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientException with message, and SQLState
+     */
+    @Test
+    public void test3() {
+        SQLTransientException ex = new SQLTransientException(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientException with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLTransientException ex = new SQLTransientException(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransientException with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLTransientException ex =
+                new SQLTransientException(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLTransientException with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLTransientException ex = new SQLTransientException(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientException with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLTransientException ex = new SQLTransientException(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientException with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLTransientException ex = new SQLTransientException((Throwable)null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLTransientException with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLTransientException ex = new SQLTransientException(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLTransientException and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLTransientException e =
+                new SQLTransientException(reason, state, errorCode, t);
+        SQLTransientException ex1 = createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLTransientException ex = new SQLTransientException("Exception 1", t1);
+        SQLTransientException ex1 = new SQLTransientException("Exception 2");
+        SQLTransientException ex2 = new SQLTransientException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct
+     * using traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLTransientException ex = new SQLTransientException("Exception 1", t1);
+        SQLTransientException ex1 = new SQLTransientException("Exception 2");
+        SQLTransientException ex2 = new SQLTransientException("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/SQLWarningTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,249 @@
+/*
+ * 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 test.sql;
+
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class SQLWarningTests extends BaseTest {
+
+    private final String[] warnings = {"Warning 1", "cause 1", "Warning 2",
+            "Warning 3", "cause 2"};
+
+    /**
+     * Create SQLWarning and setting all objects to null
+     */
+    @Test
+    public void test() {
+        SQLWarning e = new SQLWarning(null, null, errorCode, null);
+        assertTrue(e.getMessage() == null && e.getSQLState() == null
+                && e.getCause() == null && e.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLWarning with no-arg constructor
+     */
+    @Test
+    public void test1() {
+        SQLWarning ex = new SQLWarning();
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLWarning with message
+     */
+    @Test
+    public void test2() {
+        SQLWarning ex = new SQLWarning(reason);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLWarning with message, and SQLState
+     */
+    @Test
+    public void test3() {
+
+        SQLWarning ex = new SQLWarning(reason, state);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLWarning with message, SQLState, and error code
+     */
+    @Test
+    public void test4() {
+        SQLWarning ex = new SQLWarning(reason, state, errorCode);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && ex.getCause() == null
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLWarning with message, SQLState, errorCode, and Throwable
+     */
+    @Test
+    public void test5() {
+        SQLWarning ex = new SQLWarning(reason, state, errorCode, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Create SQLWarning with message, SQLState, and Throwable
+     */
+    @Test
+    public void test6() {
+        SQLWarning ex = new SQLWarning(reason, state, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState().equals(state)
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLWarning with message, and Throwable
+     */
+    @Test
+    public void test7() {
+        SQLWarning ex = new SQLWarning(reason, t);
+        assertTrue(ex.getMessage().equals(reason)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLWarning with null Throwable
+     */
+    @Test
+    public void test8() {
+        SQLWarning ex = new SQLWarning((Throwable) null);
+        assertTrue(ex.getMessage() == null
+                && ex.getSQLState() == null
+                && ex.getCause() == null
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Create SQLWarning with Throwable
+     */
+    @Test
+    public void test9() {
+        SQLWarning ex = new SQLWarning(t);
+        assertTrue(ex.getMessage().equals(cause)
+                && ex.getSQLState() == null
+                && cause.equals(ex.getCause().toString())
+                && ex.getErrorCode() == 0);
+    }
+
+    /**
+     * Serialize a SQLWarning and make sure you can read it back properly
+     */
+    @Test
+    public void test10() throws Exception {
+        SQLWarning e = new SQLWarning(reason, state, errorCode, t);
+        SQLWarning ex1 = createSerializedException(e);
+        assertTrue(reason.equals(ex1.getMessage())
+                && ex1.getSQLState().equals(state)
+                && cause.equals(ex1.getCause().toString())
+                && ex1.getErrorCode() == errorCode);
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct using
+     * for-each loop
+     */
+    @Test
+    public void test11() {
+        SQLWarning ex = new SQLWarning("Exception 1", t1);
+        SQLWarning ex1 = new SQLWarning("Exception 2");
+        SQLWarning ex2 = new SQLWarning("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(msgs[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned Exceptions is correct using
+     * traditional while loop
+     */
+    @Test
+    public void test12() {
+        SQLWarning ex = new SQLWarning("Exception 1", t1);
+        SQLWarning ex1 = new SQLWarning("Exception 2");
+        SQLWarning ex2 = new SQLWarning("Exception 3", t2);
+        ex.setNextException(ex1);
+        ex.setNextException(ex2);
+        int num = 0;
+        SQLException sqe = ex;
+        while (sqe != null) {
+            assertTrue(msgs[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextException();
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned SQLWarning is correct using
+     * for-each loop
+     */
+    @Test
+    public void test13() {
+        SQLWarning ex = new SQLWarning("Warning 1", t1);
+        SQLWarning ex1 = new SQLWarning("Warning 2");
+        SQLWarning ex2 = new SQLWarning("Warning 3", t2);
+        ex.setNextWarning(ex1);
+        ex.setNextWarning(ex2);
+        int num = 0;
+        for (Throwable e : ex) {
+            assertTrue(warnings[num++].equals(e.getMessage()));
+        }
+    }
+
+    /**
+     * Validate that the ordering of the returned SQLWarning is correct using
+     * traditional while loop
+     */
+    @Test
+    public void test14() {
+        SQLWarning ex = new SQLWarning("Warning 1", t1);
+        SQLWarning ex1 = new SQLWarning("Warning 2");
+        SQLWarning ex2 = new SQLWarning("Warning 3", t2);
+        ex.setNextWarning(ex1);
+        ex.setNextWarning(ex2);
+        int num = 0;
+        SQLWarning sqe = ex;
+        while (sqe != null) {
+            assertTrue(warnings[num++].equals(sqe.getMessage()));
+            Throwable c = sqe.getCause();
+            while (c != null) {
+                assertTrue(msgs[num++].equals(c.getMessage()));
+                c = c.getCause();
+            }
+            sqe = sqe.getNextWarning();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/TimeTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,348 @@
+/*
+ * 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 test.sql;
+
+import java.sql.Time;
+import java.time.LocalTime;
+import static org.testng.Assert.*;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class TimeTests extends BaseTest {
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling getYear
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test01() {
+        Time t = Time.valueOf("08:30:59");
+        t.getYear();
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling getMonth
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test02() {
+        Time t = Time.valueOf("08:30:59");
+        t.getMonth();
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling getDay
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test03() {
+        Time t = Time.valueOf("08:30:59");
+        t.getDay();
+    }
+
+    /**
+     * Validate an IllegalArgumentException is thrown for calling getDate
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test04() {
+        Time t = Time.valueOf("08:30:59");
+        t.getDate();
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling setYear
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test05() {
+        Time t = Time.valueOf("08:30:59");
+        t.setYear(8);
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling setMonth
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test06() {
+        Time t = Time.valueOf("08:30:59");
+        t.setMonth(8);
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling setDate
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test07() {
+        Time t = Time.valueOf("08:30:59");
+        t.setDate(30);
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for calling getDate
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test08() {
+        Time t = Time.valueOf("08:30:59");
+        t.getDate();
+    }
+
+    /*
+     * Validate that a Time made from a toLocalTime() LocalTime are equal
+     */
+    @Test
+    public void test09() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = Time.valueOf(t.toLocalTime());
+        assertTrue(t.equals(t2), "Error t != t2");
+    }
+
+    /*
+     * Validate that a Time LocalTime value, made from a LocalTime are equal
+     */
+    @Test
+    public void test10() {
+        LocalTime lt = LocalTime.of(8, 30, 59);
+        Time t = Time.valueOf(lt);
+        System.out.println("lt=" + lt + ",t=" + t.toLocalTime());
+        assertTrue(lt.equals(t.toLocalTime()),
+                "Error LocalTime values are not equal");
+    }
+
+    /*
+     * Validate an NPE occurs when a null LocalDate is passed to valueOf
+     */
+    @Test(expectedExceptions = NullPointerException.class)
+    public void test11() throws Exception {
+        LocalTime ld = null;
+        Time.valueOf(ld);
+    }
+
+    /*
+     * Validate an UnsupportedOperationException occurs when toInstant() is
+     * called
+     */
+    @Test(expectedExceptions = UnsupportedOperationException.class)
+    public void test12() throws Exception {
+        Time t = new Time(System.currentTimeMillis());
+        t.toInstant();
+    }
+
+    /*
+     * Validate that two Time objects are equal when one is created from the
+     * toString() of the other and that the correct value is returned from
+     * toString()
+     */
+    @Test(dataProvider = "validTimeValues")
+    public void test13(String time, String expected) {
+        Time t1 = Time.valueOf(time);
+        Time t2 = Time.valueOf(t1.toString());
+        assertTrue(t1.equals(t2) && t2.equals(t1)
+                && t1.toString().equals(expected), "Error t1 != t2");
+    }
+
+    /*
+     * Validate that two Time values one created using valueOf and another via a
+     * constructor are equal
+     */
+    @Test
+    public void test14() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(8, 30, 59);
+        assertTrue(t.equals(t2) && t2.equals(t), "Error t != t2");
+    }
+
+    /*
+     * Validate that two Time values one created using valueOf and another via a
+     * constructor are equal
+     */
+    @Test
+    public void test15() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(t.getTime());
+        assertTrue(t.equals(t2) && t2.equals(t), "Error t != t2");
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for an invalid Time string
+     */
+    @Test(dataProvider = "invalidTimeValues",
+            expectedExceptions = IllegalArgumentException.class)
+    public void test16(String time) throws Exception {
+        Time.valueOf(time);
+    }
+
+    /*
+     * Validate that Time.after() returns false when same date is compared
+     */
+    @Test
+    public void test17() {
+        Time t = Time.valueOf("08:30:59");
+        assertFalse(t.after(t), "Error t.after(t) = true");
+    }
+
+    /*
+     * Validate that Time.after() returns true when later date is compared to
+     * earlier date
+     */
+    @Test
+    public void test18() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(System.currentTimeMillis());
+        assertTrue(t2.after(t), "Error t2.after(t) = false");
+    }
+
+    /*
+     * Validate that Time.after() returns false when earlier date is compared to
+     * itself
+     */
+    @Test
+    public void test19() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(t.getTime());
+        assertFalse(t.after(t2), "Error t.after(t2) = true");
+        assertFalse(t2.after(t), "Error t2.after(t) = true");
+    }
+
+    /*
+     * Validate that Time.before() returns false when same date is compared
+     */
+    @Test
+    public void test20() {
+        Time t = Time.valueOf("08:30:59");
+        assertFalse(t.before(t), "Error t.before(t) = true");
+    }
+
+    /*
+     * Validate that Time.before() returns true when earlier date is compared to
+     * later date
+     */
+    @Test
+    public void test21() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(System.currentTimeMillis());
+        assertTrue(t.before(t2), "Error t.before(t2) = false");
+    }
+
+    /*
+     * Validate that Time.before() returns false when earlier date is compared
+     * to itself
+     */
+    @Test
+    public void test22() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(t.getTime());
+        assertFalse(t.before(t2), "Error t.after(t2) = true");
+        assertFalse(t2.before(t), "Error t2.after(t) = true");
+    }
+
+    /*
+     * Validate that Time.compareTo returns 0 when both Date objects are the
+     * same
+     */
+    @Test
+    public void test23() {
+        Time t = Time.valueOf("08:30:59");
+        assertTrue(t.compareTo(t) == 0, "Error t.compareTo(t) !=0");
+    }
+
+    /*
+     * Validate thatTime.compareTo returns 0 when both Time objects are the same
+     */
+    @Test
+    public void test24() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(t.getTime());
+        assertTrue(t.compareTo(t2) == 0, "Error t.compareTo(t2) !=0");
+    }
+
+    /*
+     * Validate that Time.compareTo returns 1 when comparing a later Time to an
+     * earlier Time
+     */
+    @Test
+    public void test25() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(t.getTime() + 1);
+        assertTrue(t2.compareTo(t) == 1, "Error t2.compareTo(t) !=1");
+    }
+
+    /*
+     * Validate thatTime.compareTo returns 1 when comparing a later Time to an
+     * earlier Time
+     */
+    @Test
+    public void test26() {
+        Time t = Time.valueOf("08:30:59");
+        Time t2 = new Time(t.getTime() + 1);
+        assertTrue(t.compareTo(t2) == -1, "Error t.compareTo(t2) != -1");
+    }
+
+    /*
+     * DataProvider used to provide Time values which are not valid and are used
+     * to validate that an IllegalArgumentException will be thrown from the
+     * valueOf method
+     */
+    @DataProvider(name = "invalidTimeValues")
+    private Object[][] invalidTimeValues() {
+        return new Object[][]{
+            {"2009-11-01 10:50:01"},
+            {"1961-08-30 10:50:01.1"},
+            {"1961-08-30"},
+            {"00:00:00."},
+            {"10:50:0.1"},
+            {":00:00"},
+            {"00::00"},
+            {"00:00:"},
+            {"::"},
+            {" : : "},
+            {"0a:00:00"},
+            {"00:bb:00"},
+            {"00:01:cc"},
+            {"08:10:Batman"},
+            {"08:10:10:10"},
+            {"08:10"},
+            {"a:b:c"},
+            {null},
+            {"8:"}
+        };
+    }
+
+    /*
+     * DataProvider used to provide Time values which are  valid and are used
+     * to validate that an IllegalArgumentException will  not be thrown from the
+     * valueOf method.  It also contains the expected return value from
+     * toString()
+     */
+    @DataProvider(name = "validTimeValues")
+    private Object[][] validTimeValues() {
+        return new Object[][]{
+            {"10:50:01", "10:50:01"},
+            {"01:1:1", "01:01:01"},
+            {"01:01:1", "01:01:01"},
+            {"1:01:1", "01:01:01"},
+            {"2:02:02", "02:02:02"},
+            {"2:02:2", "02:02:02"},
+            {"10:50:1", "10:50:01"},
+            {"00:00:00", "00:00:00"},
+            {"08:30:59", "08:30:59"},
+            {"9:0:1", "09:00:01"}
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/test/sql/TimestampTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,777 @@
+/*
+ * 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 test.sql;
+
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Calendar;
+import java.util.TimeZone;
+import static org.testng.Assert.*;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class TimestampTests extends BaseTest {
+
+    private static TimeZone defaultTimeZone = null;
+
+    /*
+     * Need to set and use a custom TimeZone which does not
+     * observe daylight savings time for this test.
+     */
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+        defaultTimeZone = TimeZone.getDefault();
+        TimeZone tzone = TimeZone.getTimeZone("GMT+01");
+        assertFalse(tzone.observesDaylightTime());
+        TimeZone.setDefault(tzone);
+    }
+
+    /*
+     * Conservatively reset the default time zone after test.
+     */
+    @AfterClass
+    public static void tearDownClass() throws Exception {
+        TimeZone.setDefault(defaultTimeZone);
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for an invalid Timestamp
+     */
+    @Test(dataProvider = "invalidTimestampValues",
+            expectedExceptions = IllegalArgumentException.class)
+    public void test(String ts) throws Exception {
+        Timestamp.valueOf(ts);
+    }
+
+    /*
+     * Validate that two Timestamp are equal when the leading 0 in seconds is
+     * omitted
+     */
+    @Test
+    public void test01() throws Exception {
+        String testTS = "2009-01-01 10:50:00";
+        String ExpectedTS = "2009-01-01 10:50:0";
+        Timestamp ts = Timestamp.valueOf(testTS);
+        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
+        assertEquals(ts, ts2, "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate two Timestamps created from the same string are equal
+     */
+    @Test
+    public void test02() throws Exception {
+        String testTS = "2009-01-01 10:50:0";
+        Timestamp ts = Timestamp.valueOf(testTS);
+        Timestamp ts2 = Timestamp.valueOf(testTS);
+        assertEquals(ts, ts2, "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that two Timestamp values one with leading 0s for month and day
+     * equals same string without the leading 0s.
+     */
+    @Test
+    public void test03() throws Exception {
+        String testTS = "2009-1-1 10:50:0";
+        String ExpectedTS = "2009-01-01 10:50:0";
+        Timestamp ts = Timestamp.valueOf(testTS);
+        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
+        assertEquals(ts, ts2, "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that two Timestamp values one with leading 0s for day omitted
+     * are equal
+     */
+    @Test
+    public void test04() throws Exception {
+        String testTS = "2009-01-1 10:50:0";
+        String ExpectedTS = "2009-01-01 10:50:0";
+        Timestamp ts = Timestamp.valueOf(testTS);
+        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
+        assertEquals(ts, ts2, "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that two Timestamp values one with leading 0s for month omitted
+     * and both with leading 0s for seconds omitted are equal
+     */
+    @Test
+    public void test05() throws Exception {
+        String testTS = "2009-1-01 10:50:0";
+        String ExpectedTS = "2009-01-01 10:50:0";
+        Timestamp ts = Timestamp.valueOf(testTS);
+        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
+        assertEquals(ts, ts2, "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that two Timestamp values one with leading 0s for month omitted
+     */
+    @Test
+    public void test06() throws Exception {
+        String testTS = "2005-1-01 10:20:50.00";
+        String ExpectedTS = "2005-01-01 10:20:50.00";
+        Timestamp ts = Timestamp.valueOf(testTS);
+        Timestamp ts2 = Timestamp.valueOf(ExpectedTS);
+        assertEquals(ts, ts2, "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that two Timestamp values one created using valueOf and another
+     * via a constructor are equal
+     */
+    @Test
+    public void test07() {
+
+        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.001");
+        Timestamp ts2 = new Timestamp(96, 11, 13, 14, 15, 25, 1000000);
+        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that two Timestamp values one created using valueOf and another
+     * via a constructor are equal
+     */
+    @Test
+    public void test08() {
+        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.001");
+        Timestamp ts2 = new Timestamp(ts1.getTime());
+        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that two Timestamp values one created using valueOf and another
+     * via a constructor are equal
+     */
+    @Test
+    public void test09() {
+
+        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.0");
+        Timestamp ts2 = new Timestamp(96, 11, 13, 14, 15, 25, 0);
+        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that a Timestamp cannot be equal to null
+     */
+    @Test
+    public void test10() {
+
+        Timestamp ts1 = Timestamp.valueOf("1961-08-30 14:15:25.745634");
+        Timestamp ts2 = null;
+        assertFalse(ts1.equals(ts2), "Error ts1 == null");
+    }
+
+    /*
+     * Validate that a Timestamp is equal to another timestamp created with the
+     * using the same value but not equal to a Timestamp which is one day later
+     */
+    @Test
+    public void test11() {
+
+        Timestamp ts1 = Timestamp.valueOf("1996-12-10 12:26:19.12");
+        Timestamp ts2 = Timestamp.valueOf("1996-12-10 12:26:19.12");
+        Timestamp ts3 = Timestamp.valueOf("1996-12-11 12:24:19.12");
+        assertTrue(ts1.equals(ts2) && ts2.equals(ts1), "Error ts1 != ts2");
+        assertFalse(ts1.equals(ts3) && ts3.equals(ts1), "Error ts1 == ts3");
+
+    }
+
+    /*
+     * Validate that a Timestamp is equal to itself
+     */
+    @Test
+    public void test12() {
+        Timestamp ts1 = Timestamp.valueOf("1996-10-15 12:26:19.12");
+        assertTrue(ts1.equals(ts1), "Error ts1 != ts1");
+    }
+
+    /*
+     * Validate that two Timestamps are equal when one is created from the
+     * toString() of the other
+     */
+    @Test(dataProvider = "validTimestampValues")
+    public void test13(String ts, String expectedTS) {
+        Timestamp ts1 = Timestamp.valueOf(ts);
+        Timestamp ts2 = Timestamp.valueOf(ts1.toString());
+        assertTrue(ts1.equals(ts2) && ts2.equals(ts1)
+                && ts1.toString().equals(expectedTS), "Error ts1 != ts2");
+    }
+
+    // Before Tests
+    /*
+     * Validate that Timestamp ts1 is before Timestamp ts2
+     */
+    @Test
+    public void test14() {
+        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
+        Timestamp ts2 = Timestamp.valueOf("1996-12-13 15:15:25.645634");
+        assertTrue(ts1.before(ts2), "Error ts1 not before ts2");
+    }
+
+    /*
+     * Validate that Timestamp ts1 is before Timestamp ts2
+     */
+    @Test
+    public void test15() {
+        Timestamp ts1 = Timestamp.valueOf("1961-08-30 14:15:25");
+        Timestamp ts2 = Timestamp.valueOf("1999-12-13 15:15:25");
+        assertTrue(ts1.before(ts2), "Error ts1 not before ts2");
+    }
+
+    /*
+     * Validate that Timestamp ts1 is before Timestamp ts2
+     */
+    @Test
+    public void test16() {
+
+        Timestamp ts1 = Timestamp.valueOf("1999-12-13 14:15:25.745634");
+        Timestamp ts2 = Timestamp.valueOf("1999-11-13 15:15:25.645634");
+        assertFalse(ts1.before(ts2), "Error ts1 before ts2");
+    }
+
+    /*
+     * Validate that a NullPointerException is thrown if a null is passed to
+     * the before method
+     */
+    @Test(expectedExceptions = NullPointerException.class)
+    public void test17() throws Exception {
+        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
+        ts1.before(null);
+    }
+
+    /*
+     * Validate a Timestamp cannot be before itself
+     */
+    @Test
+    public void test18() {
+        Timestamp ts1 = Timestamp.valueOf("1999-11-10 12:26:19.3456543");
+        assertFalse(ts1.before(ts1), "Error ts1 before ts1!");
+    }
+
+    /*
+     * Create 3 Timestamps and make sure the 1st is before the other two
+     * Timestamps which are each greater than the one before it
+     */
+    @Test
+    public void test19() {
+
+        Timestamp ts1 = new Timestamp(1234560000);
+        Timestamp ts2 = new Timestamp(1234567000);
+        Timestamp ts3 = new Timestamp(1234569000);
+        assertTrue(ts1.before(ts2) && ts2.before(ts3) && ts1.before(ts3));
+    }
+
+    /*
+     * Validate that Timestamp ts1 is not after Timestamp ts2
+     */
+    @Test
+    public void test20() {
+        Timestamp ts1 = Timestamp.valueOf("1999-12-13 14:15:25.745634");
+        Timestamp ts2 = Timestamp.valueOf("1999-12-13 15:15:25.645634");
+        assertFalse(ts1.after(ts2), "Error ts1 is after ts2");
+
+    }
+
+    /*
+     * Validate that Timestamp ts1 is after Timestamp ts2
+     */
+    @Test
+    public void test21() {
+        Timestamp ts1 = Timestamp.valueOf("1996-12-13 14:15:25.745634");
+        Timestamp ts2 = Timestamp.valueOf("1996-11-13 15:15:25.645634");
+        assertTrue(ts1.after(ts2), "Error ts1 not after ts2");
+    }
+
+    /*
+     * Validate that a NullPointerException is thrown if a null is passed to the
+     * after method
+     */
+    @Test(expectedExceptions = NullPointerException.class)
+    public void test22() throws Exception {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        ts1.after(null);
+    }
+
+    /*
+     * Validate that a Timestamp cannot be after itself
+     */
+    @Test
+    public void test23() {
+        Timestamp ts1 = Timestamp.valueOf("1999-11-10 12:26:19.3456543");
+        assertFalse(ts1.after(ts1), "Error ts1 is after itself");
+    }
+
+    /*
+     * Validate that a Timestamp after() works correctly with Timestamp created
+     * using milliseconds
+     */
+    @Test
+    public void test24() {
+
+        Timestamp ts1 = new Timestamp(1234568000);
+        Timestamp ts2 = new Timestamp(1234565000);
+        Timestamp ts3 = new Timestamp(1234562000);
+        assertTrue(ts1.after(ts2) && ts2.after(ts3) && ts1.after(ts3));
+    }
+
+    /*
+     * Validate compareTo returns 0 for Timestamps that are the same
+     */
+    @Test
+    public void test25() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        Timestamp ts2 = new Timestamp(ts1.getTime());
+        assertTrue(ts1.compareTo(ts2) == 0, "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate compareTo returns -1 for when the 1st Timestamp is earlier than
+     * the 2nd Timestamp
+     */
+    @Test
+    public void test26() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        Timestamp ts2 = new Timestamp(ts1.getTime() + 1000);
+        assertTrue(ts1.compareTo(ts2) == -1, "Error ts1 not before ts2");
+        assertTrue(ts2.compareTo(ts1) == 1, "Error ts1 is not before ts2");
+    }
+
+    /*
+     * Validate compareTo returns 1 for when the 1st Timestamp is later than the
+     * 2nd Timestamp
+     */
+    @Test
+    public void test27() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        Timestamp ts2 = new Timestamp(ts1.getTime() - 1000);
+        assertTrue(ts1.compareTo(ts2) == 1, "Error ts1 not after ts2");
+        assertTrue(ts2.compareTo(ts1) == -1, "Error ts1 not after ts2");
+    }
+
+    /*
+     * Validate compareTo returns 0 for Timestamps that are the same
+     */
+    @Test
+    public void test28() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        java.util.Date ts2 = new java.util.Date(ts1.getTime());
+        assertTrue(ts1.compareTo(ts2) == 0, "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate compareTo returns 0 for Timestamps that are the same
+     */
+    @Test
+    public void test29() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        java.util.Date d = new java.util.Date(ts1.getTime());
+        assertFalse(ts1.equals(d), "Error ts1 == d");
+    }
+
+    /*
+     * Validate compareTo returns 0 for Timestamps that are the same
+     */
+    @Test
+    public void test30() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        java.util.Date d = new Timestamp(ts1.getTime());
+        assertTrue(ts1.equals(d), "Error ts1 != d");
+    }
+
+    /*
+     * Validate equals returns false when a Date object is passed to equals
+     */
+    @Test
+    public void test31() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        Date d = new Date(ts1.getTime());
+        assertFalse(ts1.equals(d), "Error ts1 != d");
+    }
+
+    /*
+     * Validate equals returns false when a Date object is passed to equals
+     */
+    @Test
+    public void test32() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        java.util.Date d = new Date(ts1.getTime());
+        assertFalse(ts1.equals(d), "Error ts1 != d");
+    }
+
+    /*
+     * Validate equals returns false when a Time object is passed to equals
+     */
+    @Test
+    public void test33() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        Time t1 = new Time(ts1.getTime());
+        assertFalse(ts1.equals(t1), "Error ts1 == t1");
+    }
+
+    /*
+     * Validate equals returns false when a String object is passed to equals
+     */
+    @Test
+    public void test34() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        assertFalse(ts1.equals("1966-08-30 08:08:08"), "Error ts1 == a String");
+    }
+
+    /*
+     * Validate getTime() returns the same value from 2 timeStamps created by
+     */
+    @Test
+    public void test35() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        Timestamp ts2 = Timestamp.valueOf("1966-08-30 08:08:08");
+        assertTrue(ts2.getTime() == ts1.getTime(),
+                "ts1.getTime() != ts2.getTime()");
+        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate getTime() returns the same value from 2 timeStamps when
+     * setTime() is used to specify the same value for both Timestamps
+     */
+    @Test
+    public void test36() {
+        Timestamp ts1 = Timestamp.valueOf("1966-08-30 08:08:08");
+        Timestamp ts2 = Timestamp.valueOf("1961-08-30 00:00:00");
+        ts2.setTime(ts1.getTime());
+        assertTrue(ts2.getTime() == ts1.getTime(),
+                "ts1.getTime() != ts2.getTime()");
+        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for an invalid nanos value
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test38() throws Exception {
+        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
+        ts1.setNanos(-1);
+
+    }
+
+    /*
+     * Validate an IllegalArgumentException is thrown for an invalid nanos value
+     */
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void test39() throws Exception {
+        int nanos = 999999999;
+        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
+        ts1.setNanos(nanos + 1);
+    }
+
+    /*
+     * Validate you can set nanos to 999999999
+     */
+    @Test
+    public void test40() throws Exception {
+        int nanos = 999999999;
+        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
+        ts1.setNanos(nanos);
+        assertTrue(ts1.getNanos() == nanos, "Error Invalid Nanos value");
+    }
+
+    /*
+     * Validate you can set nanos to 0
+     */
+    @Test
+    public void test41() throws Exception {
+        int nanos = 0;
+        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
+        ts1.setNanos(nanos);
+        assertTrue(ts1.getNanos() == nanos, "Error Invalid Nanos value");
+    }
+
+    /*
+     * Validate that a Timestamp made from a LocalDateTime are equal
+     */
+    @Test
+    public void test42() throws Exception {
+        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
+        LocalDateTime ldt = ts1.toLocalDateTime();
+        Timestamp ts2 = Timestamp.valueOf(ldt);
+        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that a Timestamp LocalDateTime value, made from a LocalDateTime
+     * are equal
+     */
+    @Test
+    public void test43() throws Exception {
+        LocalDateTime ldt = LocalDateTime.now();
+        Timestamp ts2 = Timestamp.valueOf(ldt);
+        assertTrue(ldt.equals(ts2.toLocalDateTime()),
+                "Error LocalDateTime values are not equal");
+    }
+
+    /*
+     * Validate an NPE occurs when a null LocalDateTime is passed to valueOF
+     */
+    @Test(expectedExceptions = NullPointerException.class)
+    public void test44() throws Exception {
+        LocalDateTime ldt = null;
+        Timestamp.valueOf(ldt);
+    }
+
+    /*
+     * Validate that a Timestamp made from a Instant are equal
+     */
+    @Test
+    public void test45() throws Exception {
+        Timestamp ts1 = Timestamp.valueOf("1961-08-30 00:00:00");
+        Instant instant = ts1.toInstant();
+        Timestamp ts2 = Timestamp.from(instant);
+        assertTrue(ts1.equals(ts2), "Error ts1 != ts2");
+    }
+
+    /*
+     * Validate that a Timestamp made from a Instant are equal
+     */
+    @Test
+    public void test46() throws Exception {
+        Instant instant = Instant.now();
+        Timestamp ts2 = Timestamp.from(instant);
+        assertTrue(instant.equals(ts2.toInstant()),
+                "Error Instant values do not match");
+    }
+
+    /*
+     * Validate an NPE occurs when a null instant is passed to from
+     */
+    @Test(expectedExceptions = NullPointerException.class)
+    public void test47() throws Exception {
+        Instant instant = null;
+        Timestamp.from(instant);
+    }
+
+    // Added SQE tests
+    /*
+     * Create a Timestamp and a 2nd Timestamp that is 1 month earlier and
+     * validate that it is not before or after the original Timestamp
+     */
+    @Test
+    public void test48() {
+        Calendar cal = Calendar.getInstance();
+        Timestamp ts1 = new Timestamp(System.currentTimeMillis());
+        cal.setTimeInMillis(ts1.getTime());
+        cal.add(Calendar.MONTH, -1);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
+        assertFalse(ts1.before(ts2) || ts2.after(ts1));
+    }
+
+    /*
+     * Create two Timestamps and validate that compareTo returns 1 to indicate
+     * the 1st Timestamp is greater than the 2nd Timestamp
+     */
+    @Test
+    public void test49() {
+        Calendar cal = Calendar.getInstance();
+        Timestamp ts1 = new Timestamp(System.currentTimeMillis());
+        cal.setTimeInMillis(ts1.getTime());
+        cal.add(Calendar.MONTH, -1);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
+        assertTrue(ts1.compareTo(ts2) == 1);
+    }
+
+    /*
+     * Create two Timestamps and validate that the 1st Timestamp is not equal to
+     * the 2nd Timestamp but equal to itself
+     */
+    @Test
+    public void test50() {
+        Calendar cal = Calendar.getInstance();
+        Timestamp ts1 = new Timestamp(System.currentTimeMillis());
+        cal.setTimeInMillis(ts1.getTime());
+        cal.add(Calendar.MONTH, -1);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        Timestamp ts2 = new Timestamp(cal.getTimeInMillis());
+        assertTrue(!ts1.equals(ts2) && ts1.equals(ts1));
+    }
+
+    /*
+     * Validate that two Timestamps are equal when one is created from the
+     * toString() of the other
+     */
+    @Test(dataProvider = "validateNanos")
+    public void test51(String ts, int nanos) {
+        Timestamp ts1 = Timestamp.valueOf(ts);
+        Timestamp ts2 = Timestamp.valueOf(ts1.toString());
+        assertTrue(ts1.getNanos() == nanos && ts1.equals(ts2),
+                "Error with Nanos");
+    }
+
+    @Test(dataProvider = "validTimestampLongValues")
+    public void test52(long value, String ts) {
+        Timestamp ts1 = new Timestamp(value);
+        assertEquals(ts1.toString(), ts, "ts1.toString() != ts");
+    }
+
+    /*
+     * DataProvider used to provide Timestamps which are not valid and are used
+     * to validate that an IllegalArgumentException will be thrown from the
+     * valueOf method
+     */
+    @DataProvider(name = "invalidTimestampValues")
+    private Object[][] invalidTimestampValues() {
+        return new Object[][]{
+            {"2009-11-01-01 10:50:01"},
+            {"aaaa-11-01-01 10:50"},
+            {"aaaa-11-01 10:50"},
+            {"1961--30 00:00:00"},
+            {"--30 00:00:00"},
+            {"-- 00:00:00"},
+            {"1961-1- 00:00:00"},
+            {"2009-11-01"},
+            {"10:50:01"},
+            {"1961-a-30 00:00:00"},
+            {"1961-01-bb 00:00:00"},
+            {"1961-08-30 00:00:00."},
+            {"1961-08-30 :00:00"},
+            {"1961-08-30 00::00"},
+            {"1961-08-30 00:00:"},
+            {"1961-08-30 ::"},
+            {"1961-08-30 0a:00:00"},
+            {"1961-08-30 00:bb:00"},
+            {"1961-08-30 00:01:cc"},
+            {"1961-08-30 00:00:00.01a"},
+            {"1961-08-30 00:00:00.a"},
+            {"1996-12-10 12:26:19.1234567890"},
+            {null}
+        };
+    }
+
+    /*
+     * DataProvider used to provide Timestamps which are  valid and are used
+     * to validate that an IllegalArgumentException will not be thrown from the
+     * valueOf method and the corect value from toString() is returned
+     */
+    @DataProvider(name = "validTimestampValues")
+    private Object[][] validTimestampValues() {
+        return new Object[][]{
+            {"1961-08-30 00:00:00", "1961-08-30 00:00:00.0"},
+            {"1961-08-30 11:22:33", "1961-08-30 11:22:33.0"},
+            {"1961-8-30 00:00:00", "1961-08-30 00:00:00.0"},
+            {"1966-08-1 00:00:00", "1966-08-01 00:00:00.0"},
+            {"1996-12-10 12:26:19.1", "1996-12-10 12:26:19.1"},
+            {"1996-12-10 12:26:19.12", "1996-12-10 12:26:19.12"},
+            {"1996-12-10 12:26:19.123", "1996-12-10 12:26:19.123"},
+            {"1996-12-10 12:26:19.1234", "1996-12-10 12:26:19.1234"},
+            {"1996-12-10 12:26:19.12345", "1996-12-10 12:26:19.12345"},
+            {"1996-12-10 12:26:19.123456", "1996-12-10 12:26:19.123456"},
+            {"1996-12-10 12:26:19.1234567", "1996-12-10 12:26:19.1234567"},
+            {"1996-12-10 12:26:19.12345678", "1996-12-10 12:26:19.12345678"},
+            {"1996-12-10 12:26:19.123456789", "1996-12-10 12:26:19.123456789"},
+            {"1996-12-10 12:26:19.000000001", "1996-12-10 12:26:19.000000001"},
+            {"1996-12-10 12:26:19.000000012", "1996-12-10 12:26:19.000000012"},
+            {"1996-12-10 12:26:19.000000123", "1996-12-10 12:26:19.000000123"},
+            {"1996-12-10 12:26:19.000001234", "1996-12-10 12:26:19.000001234"},
+            {"1996-12-10 12:26:19.000012345", "1996-12-10 12:26:19.000012345"},
+            {"1996-12-10 12:26:19.000123456", "1996-12-10 12:26:19.000123456"},
+            {"1996-12-10 12:26:19.001234567", "1996-12-10 12:26:19.001234567"},
+            {"1996-12-10 12:26:19.12345678", "1996-12-10 12:26:19.12345678"},
+            {"1996-12-10 12:26:19.0", "1996-12-10 12:26:19.0"},
+            {"1996-12-10 12:26:19.01230", "1996-12-10 12:26:19.0123"}
+        };
+    }
+
+    @DataProvider(name = "validTimestampLongValues")
+    private Object[][] validTimestampLongValues() {
+        return new Object[][]{
+            {1L, "1970-01-01 01:00:00.001"},
+            {-3600*1000L - 1, "1969-12-31 23:59:59.999"},
+            {-(20000L*365*24*60*60*1000), "18018-08-28 01:00:00.0"},
+            {Timestamp.valueOf("1961-08-30 11:22:33").getTime(), "1961-08-30 11:22:33.0"},
+            {Timestamp.valueOf("1961-08-30 11:22:33.54321000").getTime(), "1961-08-30 11:22:33.543"}, // nanoprecision lost
+            {new Timestamp(114, 10, 10, 10, 10, 10, 100000000).getTime(), "2014-11-10 10:10:10.1"},
+            {new Timestamp(0, 10, 10, 10, 10, 10, 100000).getTime(), "1900-11-10 10:10:10.0"}, // nanoprecision lost
+            {new Date(114, 10, 10).getTime(), "2014-11-10 00:00:00.0"},
+            {new Date(0, 10, 10).getTime(), "1900-11-10 00:00:00.0"},
+            {LocalDateTime.of(1960, 10, 10, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
+                .toInstant().toEpochMilli(), "1960-10-10 19:10:10.0"},
+
+            // millisecond timestamps wraps around at year 1, so Long.MIN_VALUE looks similar
+            // Long.MAX_VALUE, while actually representing 292278994 BCE
+            {Long.MIN_VALUE, "292278994-08-17 08:12:55.192"},
+            {Long.MAX_VALUE + 1, "292278994-08-17 08:12:55.192"},
+            {Long.MAX_VALUE, "292278994-08-17 08:12:55.807"},
+            {Long.MIN_VALUE - 1, "292278994-08-17 08:12:55.807"},
+
+            // wrap around point near 0001-01-01, test that we never get a negative year:
+            {-(1970L*365*24*60*60*1000), "0001-04-25 01:00:00.0"},
+            {-(1970L*365*24*60*60*1000 + 115*24*60*60*1000L), "0001-12-31 01:00:00.0"},
+            {-(1970L*365*24*60*60*1000 + 115*24*60*60*1000L - 23*60*60*1000L), "0001-01-01 00:00:00.0"},
+
+            {LocalDateTime.of(0, 1, 1, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
+                .toInstant().toEpochMilli() - 2*24*60*60*1000L, "0001-01-01 19:03:08.0"}, // 1 BCE
+            {LocalDateTime.of(0, 1, 1, 10, 10, 10, 50000).atZone(ZoneId.of("America/Los_Angeles"))
+                .toInstant().toEpochMilli() - 3*24*60*60*1000L, "0002-12-31 19:03:08.0"} // 2 BCE
+        };
+    }
+
+    /*
+     * DataProvider used to provide Timestamp and Nanos values in order to
+     * validate that the correct Nanos value is generated from the specified
+     * Timestamp
+     */
+    @DataProvider(name = "validateNanos")
+    private Object[][] validateNanos() {
+        return new Object[][]{
+            {"1961-08-30 00:00:00", 0},
+            {"1996-12-10 12:26:19.1", 100000000},
+            {"1996-12-10 12:26:19.12", 120000000},
+            {"1996-12-10 12:26:19.123", 123000000},
+            {"1996-12-10 12:26:19.1234", 123400000},
+            {"1996-12-10 12:26:19.12345", 123450000},
+            {"1996-12-10 12:26:19.123456", 123456000},
+            {"1996-12-10 12:26:19.1234567", 123456700},
+            {"1996-12-10 12:26:19.12345678", 123456780},
+            {"1996-12-10 12:26:19.123456789", 123456789},
+            {"1996-12-10 12:26:19.000000001", 1},
+            {"1996-12-10 12:26:19.000000012", 12},
+            {"1996-12-10 12:26:19.000000123", 123},
+            {"1996-12-10 12:26:19.000001234", 1234},
+            {"1996-12-10 12:26:19.000012345", 12345},
+            {"1996-12-10 12:26:19.000123456", 123456},
+            {"1996-12-10 12:26:19.001234567", 1234567},
+            {"1996-12-10 12:26:19.012345678", 12345678},
+            {"1996-12-10 12:26:19.0", 0},
+            {"1996-12-10 12:26:19.01230", 12300000}
+        };
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/util/BaseTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,126 @@
+/*
+ * 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 util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.security.Policy;
+import java.sql.JDBCType;
+import java.sql.SQLException;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+
+public class BaseTest {
+
+    protected final String reason = "reason";
+    protected final String state = "SQLState";
+    protected final String cause = "java.lang.Throwable: cause";
+    protected final Throwable t = new Throwable("cause");
+    protected final Throwable t1 = new Throwable("cause 1");
+    protected final Throwable t2 = new Throwable("cause 2");
+    protected final int errorCode = 21;
+    protected final String[] msgs = {"Exception 1", "cause 1", "Exception 2",
+        "Exception 3", "cause 2"};
+
+    @BeforeClass
+    public static void setUpClass() throws Exception {
+    }
+
+    @AfterClass
+    public static void tearDownClass() throws Exception {
+    }
+
+    @BeforeMethod
+    public void setUpMethod() throws Exception {
+    }
+
+    @AfterMethod
+    public void tearDownMethod() throws Exception {
+    }
+
+    /*
+     * Take some form of SQLException, serialize and deserialize it
+     */
+    @SuppressWarnings("unchecked")
+    protected <T extends SQLException> T
+            createSerializedException(T ex)
+            throws IOException, ClassNotFoundException {
+        return (T) serializeDeserializeObject(ex);
+    }
+
+    /*
+     * Utility method to serialize and deserialize an object
+     */
+    @SuppressWarnings("unchecked")
+    protected <T> T serializeDeserializeObject(T o)
+            throws IOException, ClassNotFoundException {
+        T o1;
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
+            oos.writeObject(o);
+        }
+        try (ObjectInputStream ois
+                = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
+            o1 = (T) ois.readObject();
+        }
+        return o1;
+    }
+
+    /*
+     * Utility Method used to set the current Policy
+     */
+    protected static void setPolicy(Policy p) {
+        Policy.setPolicy(p);
+    }
+
+    /*
+     * DataProvider used to specify the value to set and check for
+     * methods using boolean values
+     */
+    @DataProvider(name = "trueFalse")
+    protected Object[][] trueFalse() {
+        return new Object[][]{
+            {true},
+            {false}
+        };
+    }
+
+    /*
+     * DataProvider used to specify the standard JDBC Types
+     */
+    @DataProvider(name = "jdbcTypes")
+    protected Object[][] jdbcTypes() {
+        Object[][] o = new Object[JDBCType.values().length][1];
+        int pos = 0;
+        for (JDBCType c : JDBCType.values()) {
+            o[pos++][0] = c.getVendorTypeNumber();
+        }
+        return o;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/util/DriverActionImpl.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * 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 util;
+
+import java.sql.DriverAction;
+
+/**
+ * Simple implementation of DriverAction which calls back into the Driver when
+ * release is called.
+ */
+class DriverActionImpl implements DriverAction {
+
+    public DriverActionImpl(StubDriverDA d) {
+        driver = d;
+    }
+
+    private final StubDriverDA driver;
+
+    @Override
+    public void deregister() {
+        driver.release();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/util/SerializedBatchUpdateException.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * 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 util;
+
+public class SerializedBatchUpdateException {
+    /**
+     * Serialized BatchUpdateException from JDBC 4.0 with the following values
+     *  reason = "This was the error msg"
+     *  SQLState   = "user defined sqlState"
+     *  vendor Code = 99999
+     *  Update Counts = {1, 2, 21}
+     *  cause = = "java.lang.Throwable: throw 1"
+     */
+    public static byte[] DATA = {
+        (byte) 0xac, (byte) 0xed, (byte) 0x0, (byte) 0x5, (byte) 0x73, (byte) 0x72, (byte) 0x0, (byte) 0x1d, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x73, (byte) 0x71, (byte) 0x6c, (byte) 0x2e, (byte) 0x42, (byte) 0x61, (byte) 0x74, (byte) 0x63, (byte) 0x68, (byte) 0x55, (byte) 0x70, (byte) 0x64, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65,
+        (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x52, (byte) 0xf4, (byte) 0x73, (byte) 0xc0, (byte) 0xc1, (byte) 0x8b, (byte) 0xe, (byte) 0x5d, (byte) 0x3, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x0, (byte) 0x10, (byte) 0x6c, (byte) 0x6f, (byte) 0x6e, (byte) 0x67, (byte) 0x55, (byte) 0x70, (byte) 0x64, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x43, (byte) 0x6f, (byte) 0x75,
+        (byte) 0x6e, (byte) 0x74, (byte) 0x73, (byte) 0x74, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x4a, (byte) 0x5b, (byte) 0x0, (byte) 0xc, (byte) 0x75, (byte) 0x70, (byte) 0x64, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x43, (byte) 0x6f, (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x73, (byte) 0x74, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x49, (byte) 0x78, (byte) 0x72, (byte) 0x0, (byte) 0x15,
+        (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x73, (byte) 0x71, (byte) 0x6c, (byte) 0x2e, (byte) 0x53, (byte) 0x51, (byte) 0x4c, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x1d, (byte) 0xa1, (byte) 0xe9, (byte) 0x30, (byte) 0xdb, (byte) 0x3e, (byte) 0x75, (byte) 0xdc, (byte) 0x2, (byte) 0x0, (byte) 0x3,
+        (byte) 0x49, (byte) 0x0, (byte) 0xa, (byte) 0x76, (byte) 0x65, (byte) 0x6e, (byte) 0x64, (byte) 0x6f, (byte) 0x72, (byte) 0x43, (byte) 0x6f, (byte) 0x64, (byte) 0x65, (byte) 0x4c, (byte) 0x0, (byte) 0x8, (byte) 0x53, (byte) 0x51, (byte) 0x4c, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x74, (byte) 0x0, (byte) 0x12, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61,
+        (byte) 0x2f, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2f, (byte) 0x53, (byte) 0x74, (byte) 0x72, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x3b, (byte) 0x4c, (byte) 0x0, (byte) 0x4, (byte) 0x6e, (byte) 0x65, (byte) 0x78, (byte) 0x74, (byte) 0x74, (byte) 0x0, (byte) 0x17, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2f, (byte) 0x73, (byte) 0x71, (byte) 0x6c,
+        (byte) 0x2f, (byte) 0x53, (byte) 0x51, (byte) 0x4c, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x3b, (byte) 0x78, (byte) 0x72, (byte) 0x0, (byte) 0x13, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2e, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65,
+        (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0xd0, (byte) 0xfd, (byte) 0x1f, (byte) 0x3e, (byte) 0x1a, (byte) 0x3b, (byte) 0x1c, (byte) 0xc4, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x78, (byte) 0x72, (byte) 0x0, (byte) 0x13, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2e, (byte) 0x54, (byte) 0x68,
+        (byte) 0x72, (byte) 0x6f, (byte) 0x77, (byte) 0x61, (byte) 0x62, (byte) 0x6c, (byte) 0x65, (byte) 0xd5, (byte) 0xc6, (byte) 0x35, (byte) 0x27, (byte) 0x39, (byte) 0x77, (byte) 0xb8, (byte) 0xcb, (byte) 0x3, (byte) 0x0, (byte) 0x4, (byte) 0x4c, (byte) 0x0, (byte) 0x5, (byte) 0x63, (byte) 0x61, (byte) 0x75, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x0, (byte) 0x15, (byte) 0x4c, (byte) 0x6a, (byte) 0x61,
+        (byte) 0x76, (byte) 0x61, (byte) 0x2f, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2f, (byte) 0x54, (byte) 0x68, (byte) 0x72, (byte) 0x6f, (byte) 0x77, (byte) 0x61, (byte) 0x62, (byte) 0x6c, (byte) 0x65, (byte) 0x3b, (byte) 0x4c, (byte) 0x0, (byte) 0xd, (byte) 0x64, (byte) 0x65, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6c, (byte) 0x4d, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x61,
+        (byte) 0x67, (byte) 0x65, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x4, (byte) 0x5b, (byte) 0x0, (byte) 0xa, (byte) 0x73, (byte) 0x74, (byte) 0x61, (byte) 0x63, (byte) 0x6b, (byte) 0x54, (byte) 0x72, (byte) 0x61, (byte) 0x63, (byte) 0x65, (byte) 0x74, (byte) 0x0, (byte) 0x1e, (byte) 0x5b, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2f, (byte) 0x6c, (byte) 0x61,
+        (byte) 0x6e, (byte) 0x67, (byte) 0x2f, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x63, (byte) 0x6b, (byte) 0x54, (byte) 0x72, (byte) 0x61, (byte) 0x63, (byte) 0x65, (byte) 0x45, (byte) 0x6c, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x3b, (byte) 0x4c, (byte) 0x0, (byte) 0x14, (byte) 0x73, (byte) 0x75, (byte) 0x70, (byte) 0x70, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
+        (byte) 0x65, (byte) 0x64, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x73, (byte) 0x74, (byte) 0x0, (byte) 0x10, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2f, (byte) 0x75, (byte) 0x74, (byte) 0x69, (byte) 0x6c, (byte) 0x2f, (byte) 0x4c, (byte) 0x69, (byte) 0x73, (byte) 0x74, (byte) 0x3b, (byte) 0x78,
+        (byte) 0x70, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x7, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0xc, (byte) 0x74, (byte) 0x0, (byte) 0x7, (byte) 0x74, (byte) 0x68, (byte) 0x72, (byte) 0x6f, (byte) 0x77, (byte) 0x20, (byte) 0x31, (byte) 0x75, (byte) 0x72, (byte) 0x0, (byte) 0x1e, (byte) 0x5b, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61,
+        (byte) 0x2e, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2e, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x63, (byte) 0x6b, (byte) 0x54, (byte) 0x72, (byte) 0x61, (byte) 0x63, (byte) 0x65, (byte) 0x45, (byte) 0x6c, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x3b, (byte) 0x2, (byte) 0x46, (byte) 0x2a, (byte) 0x3c, (byte) 0x3c, (byte) 0xfd, (byte) 0x22, (byte) 0x39,
+        (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x78, (byte) 0x70, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x2, (byte) 0x73, (byte) 0x72, (byte) 0x0, (byte) 0x1b, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2e, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x63, (byte) 0x6b, (byte) 0x54, (byte) 0x72, (byte) 0x61, (byte) 0x63,
+        (byte) 0x65, (byte) 0x45, (byte) 0x6c, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x9, (byte) 0xc5, (byte) 0x9a, (byte) 0x26, (byte) 0x36, (byte) 0xdd, (byte) 0x85, (byte) 0x2, (byte) 0x0, (byte) 0x4, (byte) 0x49, (byte) 0x0, (byte) 0xa, (byte) 0x6c, (byte) 0x69, (byte) 0x6e, (byte) 0x65, (byte) 0x4e, (byte) 0x75, (byte) 0x6d, (byte) 0x62, (byte) 0x65, (byte) 0x72,
+        (byte) 0x4c, (byte) 0x0, (byte) 0xe, (byte) 0x64, (byte) 0x65, (byte) 0x63, (byte) 0x6c, (byte) 0x61, (byte) 0x72, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x43, (byte) 0x6c, (byte) 0x61, (byte) 0x73, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x4, (byte) 0x4c, (byte) 0x0, (byte) 0x8, (byte) 0x66, (byte) 0x69, (byte) 0x6c, (byte) 0x65, (byte) 0x4e, (byte) 0x61, (byte) 0x6d,
+        (byte) 0x65, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x4, (byte) 0x4c, (byte) 0x0, (byte) 0xa, (byte) 0x6d, (byte) 0x65, (byte) 0x74, (byte) 0x68, (byte) 0x6f, (byte) 0x64, (byte) 0x4e, (byte) 0x61, (byte) 0x6d, (byte) 0x65, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x4, (byte) 0x78, (byte) 0x70, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x23, (byte) 0x74, (byte) 0x0,
+        (byte) 0x17, (byte) 0x43, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x42, (byte) 0x61, (byte) 0x74, (byte) 0x63, (byte) 0x68, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x53, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x0, (byte) 0x1c, (byte) 0x43, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74,
+        (byte) 0x65, (byte) 0x42, (byte) 0x61, (byte) 0x74, (byte) 0x63, (byte) 0x68, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x53, (byte) 0x65, (byte) 0x72, (byte) 0x2e, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x74, (byte) 0x0, (byte) 0x9, (byte) 0x77, (byte) 0x72, (byte) 0x69, (byte) 0x74, (byte) 0x65, (byte) 0x54,
+        (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x10, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1a, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x12, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x13, (byte) 0x74, (byte) 0x0, (byte) 0x4, (byte) 0x6d, (byte) 0x61, (byte) 0x69, (byte) 0x6e, (byte) 0x70, (byte) 0x78,
+        (byte) 0x74, (byte) 0x0, (byte) 0x16, (byte) 0x54, (byte) 0x68, (byte) 0x69, (byte) 0x73, (byte) 0x20, (byte) 0x77, (byte) 0x61, (byte) 0x73, (byte) 0x20, (byte) 0x74, (byte) 0x68, (byte) 0x65, (byte) 0x20, (byte) 0x65, (byte) 0x72, (byte) 0x72, (byte) 0x6f, (byte) 0x72, (byte) 0x20, (byte) 0x6d, (byte) 0x73, (byte) 0x67, (byte) 0x75, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0xe, (byte) 0x0,
+        (byte) 0x0, (byte) 0x0, (byte) 0x2, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x10, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x28, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x12, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x13, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x14, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e,
+        (byte) 0x0, (byte) 0x10, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1a, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x12, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x13, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x16, (byte) 0x70, (byte) 0x78, (byte) 0x0, (byte) 0x1, (byte) 0x86, (byte) 0x9f, (byte) 0x74, (byte) 0x0, (byte) 0x15, (byte) 0x75, (byte) 0x73,
+        (byte) 0x65, (byte) 0x72, (byte) 0x20, (byte) 0x64, (byte) 0x65, (byte) 0x66, (byte) 0x69, (byte) 0x6e, (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x73, (byte) 0x71, (byte) 0x6c, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x70, (byte) 0x75, (byte) 0x72, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x4a, (byte) 0x78, (byte) 0x20, (byte) 0x4, (byte) 0xb5, (byte) 0x12, (byte) 0xb1,
+        (byte) 0x75, (byte) 0x93, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x78, (byte) 0x70, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x3, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0,
+        (byte) 0x0, (byte) 0x0, (byte) 0x15, (byte) 0x75, (byte) 0x72, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x49, (byte) 0x4d, (byte) 0xba, (byte) 0x60, (byte) 0x26, (byte) 0x76, (byte) 0xea, (byte) 0xb2, (byte) 0xa5, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x78, (byte) 0x70, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x3, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1, (byte) 0x0, (byte) 0x0,
+        (byte) 0x0, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x15, (byte) 0x78
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/util/StubConnection.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,315 @@
+/*
+ * 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 util;
+
+import java.sql.Array;
+import java.sql.Blob;
+import java.sql.CallableStatement;
+import java.sql.Clob;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.NClob;
+import java.sql.PreparedStatement;
+import java.sql.SQLClientInfoException;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import java.sql.SQLXML;
+import java.sql.Savepoint;
+import java.sql.Statement;
+import java.sql.Struct;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.Executor;
+
+public class StubConnection implements Connection {
+
+    @Override
+    public Statement createStatement() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public CallableStatement prepareCall(String sql) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public String nativeSQL(String sql) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setAutoCommit(boolean autoCommit) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public boolean getAutoCommit() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void commit() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void rollback() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void close() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public boolean isClosed() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public DatabaseMetaData getMetaData() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setReadOnly(boolean readOnly) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public boolean isReadOnly() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setCatalog(String catalog) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public String getCatalog() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setTransactionIsolation(int level) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public int getTransactionIsolation() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public SQLWarning getWarnings() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void clearWarnings() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Map<String, Class<?>> getTypeMap() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setHoldability(int holdability) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public int getHoldability() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Savepoint setSavepoint() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Savepoint setSavepoint(String name) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void rollback(Savepoint savepoint) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void releaseSavepoint(Savepoint savepoint) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Clob createClob() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Blob createBlob() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public NClob createNClob() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public SQLXML createSQLXML() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public boolean isValid(int timeout) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setClientInfo(String name, String value) throws SQLClientInfoException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setClientInfo(Properties properties) throws SQLClientInfoException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public String getClientInfo(String name) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Properties getClientInfo() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Array createArrayOf(String typeName, Object[] elements) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setSchema(String schema) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public String getSchema() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void abort(Executor executor) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public int getNetworkTimeout() throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public <T> T unwrap(Class<T> iface) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public boolean isWrapperFor(Class<?> iface) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/util/StubDriver.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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 util;
+
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.DriverPropertyInfo;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.Properties;
+import java.util.logging.Logger;
+
+public class StubDriver implements Driver {
+
+    public StubDriver() {
+    }
+
+    @Override
+    public Connection connect(String url, Properties info) throws SQLException {
+        if (acceptsURL(url)) {
+            return new StubConnection();
+        }
+        return null;
+    }
+
+    @Override
+    public boolean acceptsURL(String url) throws SQLException {
+        return url.matches("^jdbc:tennis:.*");
+    }
+
+    @Override
+    public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public int getMajorVersion() {
+        return 1;
+    }
+
+    @Override
+    public int getMinorVersion() {
+        return 0;
+    }
+
+    @Override
+    public boolean jdbcCompliant() {
+        return true;
+    }
+
+    @Override
+    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/util/StubDriverDA.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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 util;
+
+import java.io.File;
+import java.io.IOException;
+import java.sql.DriverAction;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Simple java.sql.Driver stub class that registers the driver via a static
+ * block with a DriverAction Implementation
+ * @author ljanders
+ */
+public class StubDriverDA extends StubDriver {
+
+    public static final String DriverActionCalled = "DriverActionCalled.txt";
+
+    static DriverAction da;
+
+    static {
+        try {
+            DriverManager.registerDriver(new StubDriverDA(), da);
+        } catch (SQLException ex) {
+            Logger.getLogger(StubDriverDA.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
+    public StubDriverDA() {
+        da = new DriverActionImpl(this);
+    }
+
+    @Override
+    public boolean acceptsURL(String url) throws SQLException {
+        return url.matches("^jdbc:luckydog:.*");
+    }
+
+    /**
+     * This method will write out a text file when called by the
+     * DriverActionImpl.release method when DriverManager.deregisterDriver
+     * is called. This is used by DriverManagerTests to validate that
+     * DriverAction.release was called
+     */
+    protected void release() {
+        File file = new File(DriverActionCalled);
+        try {
+            file.createNewFile();
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/sql/testng/util/TestPolicy.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,135 @@
+/*
+ * 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 util;
+
+import java.io.FilePermission;
+import java.security.AllPermission;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.security.SecurityPermission;
+import java.sql.SQLPermission;
+import java.util.Enumeration;
+import java.util.PropertyPermission;
+import java.util.StringJoiner;
+
+/*
+ * Simple Policy class that supports the required Permissions to validate the
+ * JDBC concrete classes
+ */
+public class TestPolicy extends Policy {
+
+    final PermissionCollection permissions = new Permissions();
+
+    /**
+     * Constructor which sets the minimum permissions allowing testNG to work
+     * with a SecurityManager
+     */
+    public TestPolicy() {
+        setMinimalPermissions();
+    }
+
+    /*
+     * Constructor which determines which permissions are defined for this
+     * Policy used by the JDBC tests Possible values are: all (ALLPermissions),
+     * setLog (SQLPemission("setLog"), deregisterDriver
+     * (SQLPermission("deregisterDriver") (SQLPermission("deregisterDriver"),
+     * and setSyncFactory(SQLPermission(setSyncFactory),
+     *
+     * @param policy Permissions to set
+     */
+    public TestPolicy(String policy) {
+
+        switch (policy) {
+            case "all":
+                permissions.add(new AllPermission());
+                break;
+            case "setLog":
+                setMinimalPermissions();
+                permissions.add(new SQLPermission("setLog"));
+                break;
+            case "deregisterDriver":
+                setMinimalPermissions();
+                permissions.add(new SQLPermission("deregisterDriver"));
+                break;
+            case "setSyncFactory":
+                setMinimalPermissions();
+                permissions.add(new SQLPermission("setSyncFactory"));
+                break;
+            default:
+                setMinimalPermissions();
+        }
+    }
+
+    /*
+     * Defines the minimal permissions required by testNG when running these
+     * tests
+     */
+    private void setMinimalPermissions() {
+        permissions.add(new SecurityPermission("getPolicy"));
+        permissions.add(new SecurityPermission("setPolicy"));
+        permissions.add(new RuntimePermission("getClassLoader"));
+        permissions.add(new RuntimePermission("setSecurityManager"));
+        permissions.add(new RuntimePermission("createSecurityManager"));
+        permissions.add(new PropertyPermission("testng.show.stack.frames",
+                "read"));
+        permissions.add(new PropertyPermission("line.separator", "read"));
+        permissions.add(new PropertyPermission("fileStringBuffer", "read"));
+        permissions.add(new PropertyPermission("dataproviderthreadcount", "read"));
+        permissions.add(new PropertyPermission("java.io.tmpdir", "read"));
+        permissions.add(new FilePermission("<<ALL FILES>>",
+                "read, write, delete"));
+    }
+
+    /*
+     * Overloaded methods from the Policy class
+     */
+    @Override
+    public String toString() {
+        StringJoiner sj = new StringJoiner("\n", "policy: ", "");
+        Enumeration<Permission> perms = permissions.elements();
+        while (perms.hasMoreElements()) {
+            sj.add(perms.nextElement().toString());
+        }
+        return sj.toString();
+
+    }
+
+    @Override
+    public PermissionCollection getPermissions(ProtectionDomain domain) {
+        return permissions;
+    }
+
+    @Override
+    public PermissionCollection getPermissions(CodeSource codesource) {
+        return permissions;
+    }
+
+    @Override
+    public boolean implies(ProtectionDomain domain, Permission perm) {
+        return permissions.implies(perm);
+    }
+}
--- a/jdk/test/java/sql/util/BaseTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +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 util;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.security.Policy;
-import java.sql.SQLException;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-
-public class BaseTest {
-
-    protected final String reason = "reason";
-    protected final String state = "SQLState";
-    protected final String cause = "java.lang.Throwable: cause";
-    protected final Throwable t = new Throwable("cause");
-    protected final Throwable t1 = new Throwable("cause 1");
-    protected final Throwable t2 = new Throwable("cause 2");
-    protected final int errorCode = 21;
-    protected final String[] msgs = {"Exception 1", "cause 1", "Exception 2",
-        "Exception 3", "cause 2"};
-
-    @BeforeClass
-    public static void setUpClass() throws Exception {
-    }
-
-    @AfterClass
-    public static void tearDownClass() throws Exception {
-    }
-
-    @BeforeMethod
-    public void setUpMethod() throws Exception {
-    }
-
-    @AfterMethod
-    public void tearDownMethod() throws Exception {
-    }
-
-    /*
-     * Take some form of SQLException, serialize and deserialize it
-     */
-    @SuppressWarnings("unchecked")
-    protected <T extends SQLException> T
-            createSerializedException(T ex)
-            throws IOException, ClassNotFoundException {
-        return (T) serializeDeserializeObject(ex);
-    }
-
-    /*
-     * Utility method to serialize and deserialize an object
-     */
-    @SuppressWarnings("unchecked")
-    protected <T> T serializeDeserializeObject(T o)
-            throws IOException, ClassNotFoundException {
-        T o1;
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
-            oos.writeObject(o);
-        }
-        try (ObjectInputStream ois
-                = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
-            o1 = (T) ois.readObject();
-        }
-        return o1;
-    }
-
-    /*
-     * Utility Method used to set the current Policy
-     */
-    protected static void setPolicy(Policy p) {
-        Policy.setPolicy(p);
-    }
-}
--- a/jdk/test/java/sql/util/DriverActionImpl.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +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 util;
-
-import java.sql.DriverAction;
-
-/**
- * Simple implementation of DriverAction which calls back into the Driver when
- * release is called.
- */
-class DriverActionImpl implements DriverAction {
-
-    public DriverActionImpl(StubDriverDA d) {
-        driver = d;
-    }
-
-    private final StubDriverDA driver;
-
-    @Override
-    public void deregister() {
-        driver.release();
-    }
-}
--- a/jdk/test/java/sql/util/SerializedBatchUpdateException.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +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 util;
-
-public class SerializedBatchUpdateException {
-    /**
-     * Serialized BatchUpdateException from JDBC 4.0 with the following values
-     *  reason = "This was the error msg"
-     *  SQLState   = "user defined sqlState"
-     *  vendor Code = 99999
-     *  Update Counts = {1, 2, 21}
-     *  cause = = "java.lang.Throwable: throw 1"
-     */
-    public static byte[] DATA = {
-        (byte) 0xac, (byte) 0xed, (byte) 0x0, (byte) 0x5, (byte) 0x73, (byte) 0x72, (byte) 0x0, (byte) 0x1d, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x73, (byte) 0x71, (byte) 0x6c, (byte) 0x2e, (byte) 0x42, (byte) 0x61, (byte) 0x74, (byte) 0x63, (byte) 0x68, (byte) 0x55, (byte) 0x70, (byte) 0x64, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65,
-        (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x52, (byte) 0xf4, (byte) 0x73, (byte) 0xc0, (byte) 0xc1, (byte) 0x8b, (byte) 0xe, (byte) 0x5d, (byte) 0x3, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x0, (byte) 0x10, (byte) 0x6c, (byte) 0x6f, (byte) 0x6e, (byte) 0x67, (byte) 0x55, (byte) 0x70, (byte) 0x64, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x43, (byte) 0x6f, (byte) 0x75,
-        (byte) 0x6e, (byte) 0x74, (byte) 0x73, (byte) 0x74, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x4a, (byte) 0x5b, (byte) 0x0, (byte) 0xc, (byte) 0x75, (byte) 0x70, (byte) 0x64, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x43, (byte) 0x6f, (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x73, (byte) 0x74, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x49, (byte) 0x78, (byte) 0x72, (byte) 0x0, (byte) 0x15,
-        (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x73, (byte) 0x71, (byte) 0x6c, (byte) 0x2e, (byte) 0x53, (byte) 0x51, (byte) 0x4c, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x1d, (byte) 0xa1, (byte) 0xe9, (byte) 0x30, (byte) 0xdb, (byte) 0x3e, (byte) 0x75, (byte) 0xdc, (byte) 0x2, (byte) 0x0, (byte) 0x3,
-        (byte) 0x49, (byte) 0x0, (byte) 0xa, (byte) 0x76, (byte) 0x65, (byte) 0x6e, (byte) 0x64, (byte) 0x6f, (byte) 0x72, (byte) 0x43, (byte) 0x6f, (byte) 0x64, (byte) 0x65, (byte) 0x4c, (byte) 0x0, (byte) 0x8, (byte) 0x53, (byte) 0x51, (byte) 0x4c, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x74, (byte) 0x0, (byte) 0x12, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61,
-        (byte) 0x2f, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2f, (byte) 0x53, (byte) 0x74, (byte) 0x72, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x3b, (byte) 0x4c, (byte) 0x0, (byte) 0x4, (byte) 0x6e, (byte) 0x65, (byte) 0x78, (byte) 0x74, (byte) 0x74, (byte) 0x0, (byte) 0x17, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2f, (byte) 0x73, (byte) 0x71, (byte) 0x6c,
-        (byte) 0x2f, (byte) 0x53, (byte) 0x51, (byte) 0x4c, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x3b, (byte) 0x78, (byte) 0x72, (byte) 0x0, (byte) 0x13, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2e, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65,
-        (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0xd0, (byte) 0xfd, (byte) 0x1f, (byte) 0x3e, (byte) 0x1a, (byte) 0x3b, (byte) 0x1c, (byte) 0xc4, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x78, (byte) 0x72, (byte) 0x0, (byte) 0x13, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2e, (byte) 0x54, (byte) 0x68,
-        (byte) 0x72, (byte) 0x6f, (byte) 0x77, (byte) 0x61, (byte) 0x62, (byte) 0x6c, (byte) 0x65, (byte) 0xd5, (byte) 0xc6, (byte) 0x35, (byte) 0x27, (byte) 0x39, (byte) 0x77, (byte) 0xb8, (byte) 0xcb, (byte) 0x3, (byte) 0x0, (byte) 0x4, (byte) 0x4c, (byte) 0x0, (byte) 0x5, (byte) 0x63, (byte) 0x61, (byte) 0x75, (byte) 0x73, (byte) 0x65, (byte) 0x74, (byte) 0x0, (byte) 0x15, (byte) 0x4c, (byte) 0x6a, (byte) 0x61,
-        (byte) 0x76, (byte) 0x61, (byte) 0x2f, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2f, (byte) 0x54, (byte) 0x68, (byte) 0x72, (byte) 0x6f, (byte) 0x77, (byte) 0x61, (byte) 0x62, (byte) 0x6c, (byte) 0x65, (byte) 0x3b, (byte) 0x4c, (byte) 0x0, (byte) 0xd, (byte) 0x64, (byte) 0x65, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6c, (byte) 0x4d, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x61,
-        (byte) 0x67, (byte) 0x65, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x4, (byte) 0x5b, (byte) 0x0, (byte) 0xa, (byte) 0x73, (byte) 0x74, (byte) 0x61, (byte) 0x63, (byte) 0x6b, (byte) 0x54, (byte) 0x72, (byte) 0x61, (byte) 0x63, (byte) 0x65, (byte) 0x74, (byte) 0x0, (byte) 0x1e, (byte) 0x5b, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2f, (byte) 0x6c, (byte) 0x61,
-        (byte) 0x6e, (byte) 0x67, (byte) 0x2f, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x63, (byte) 0x6b, (byte) 0x54, (byte) 0x72, (byte) 0x61, (byte) 0x63, (byte) 0x65, (byte) 0x45, (byte) 0x6c, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x3b, (byte) 0x4c, (byte) 0x0, (byte) 0x14, (byte) 0x73, (byte) 0x75, (byte) 0x70, (byte) 0x70, (byte) 0x72, (byte) 0x65, (byte) 0x73, (byte) 0x73,
-        (byte) 0x65, (byte) 0x64, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x73, (byte) 0x74, (byte) 0x0, (byte) 0x10, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2f, (byte) 0x75, (byte) 0x74, (byte) 0x69, (byte) 0x6c, (byte) 0x2f, (byte) 0x4c, (byte) 0x69, (byte) 0x73, (byte) 0x74, (byte) 0x3b, (byte) 0x78,
-        (byte) 0x70, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x7, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0xc, (byte) 0x74, (byte) 0x0, (byte) 0x7, (byte) 0x74, (byte) 0x68, (byte) 0x72, (byte) 0x6f, (byte) 0x77, (byte) 0x20, (byte) 0x31, (byte) 0x75, (byte) 0x72, (byte) 0x0, (byte) 0x1e, (byte) 0x5b, (byte) 0x4c, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61,
-        (byte) 0x2e, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2e, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x63, (byte) 0x6b, (byte) 0x54, (byte) 0x72, (byte) 0x61, (byte) 0x63, (byte) 0x65, (byte) 0x45, (byte) 0x6c, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x3b, (byte) 0x2, (byte) 0x46, (byte) 0x2a, (byte) 0x3c, (byte) 0x3c, (byte) 0xfd, (byte) 0x22, (byte) 0x39,
-        (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x78, (byte) 0x70, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x2, (byte) 0x73, (byte) 0x72, (byte) 0x0, (byte) 0x1b, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x2e, (byte) 0x6c, (byte) 0x61, (byte) 0x6e, (byte) 0x67, (byte) 0x2e, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x63, (byte) 0x6b, (byte) 0x54, (byte) 0x72, (byte) 0x61, (byte) 0x63,
-        (byte) 0x65, (byte) 0x45, (byte) 0x6c, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x9, (byte) 0xc5, (byte) 0x9a, (byte) 0x26, (byte) 0x36, (byte) 0xdd, (byte) 0x85, (byte) 0x2, (byte) 0x0, (byte) 0x4, (byte) 0x49, (byte) 0x0, (byte) 0xa, (byte) 0x6c, (byte) 0x69, (byte) 0x6e, (byte) 0x65, (byte) 0x4e, (byte) 0x75, (byte) 0x6d, (byte) 0x62, (byte) 0x65, (byte) 0x72,
-        (byte) 0x4c, (byte) 0x0, (byte) 0xe, (byte) 0x64, (byte) 0x65, (byte) 0x63, (byte) 0x6c, (byte) 0x61, (byte) 0x72, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x43, (byte) 0x6c, (byte) 0x61, (byte) 0x73, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x4, (byte) 0x4c, (byte) 0x0, (byte) 0x8, (byte) 0x66, (byte) 0x69, (byte) 0x6c, (byte) 0x65, (byte) 0x4e, (byte) 0x61, (byte) 0x6d,
-        (byte) 0x65, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x4, (byte) 0x4c, (byte) 0x0, (byte) 0xa, (byte) 0x6d, (byte) 0x65, (byte) 0x74, (byte) 0x68, (byte) 0x6f, (byte) 0x64, (byte) 0x4e, (byte) 0x61, (byte) 0x6d, (byte) 0x65, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x4, (byte) 0x78, (byte) 0x70, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x23, (byte) 0x74, (byte) 0x0,
-        (byte) 0x17, (byte) 0x43, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x42, (byte) 0x61, (byte) 0x74, (byte) 0x63, (byte) 0x68, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x53, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x0, (byte) 0x1c, (byte) 0x43, (byte) 0x72, (byte) 0x65, (byte) 0x61, (byte) 0x74,
-        (byte) 0x65, (byte) 0x42, (byte) 0x61, (byte) 0x74, (byte) 0x63, (byte) 0x68, (byte) 0x45, (byte) 0x78, (byte) 0x63, (byte) 0x65, (byte) 0x70, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x53, (byte) 0x65, (byte) 0x72, (byte) 0x2e, (byte) 0x6a, (byte) 0x61, (byte) 0x76, (byte) 0x61, (byte) 0x74, (byte) 0x0, (byte) 0x9, (byte) 0x77, (byte) 0x72, (byte) 0x69, (byte) 0x74, (byte) 0x65, (byte) 0x54,
-        (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x10, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1a, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x12, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x13, (byte) 0x74, (byte) 0x0, (byte) 0x4, (byte) 0x6d, (byte) 0x61, (byte) 0x69, (byte) 0x6e, (byte) 0x70, (byte) 0x78,
-        (byte) 0x74, (byte) 0x0, (byte) 0x16, (byte) 0x54, (byte) 0x68, (byte) 0x69, (byte) 0x73, (byte) 0x20, (byte) 0x77, (byte) 0x61, (byte) 0x73, (byte) 0x20, (byte) 0x74, (byte) 0x68, (byte) 0x65, (byte) 0x20, (byte) 0x65, (byte) 0x72, (byte) 0x72, (byte) 0x6f, (byte) 0x72, (byte) 0x20, (byte) 0x6d, (byte) 0x73, (byte) 0x67, (byte) 0x75, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0xe, (byte) 0x0,
-        (byte) 0x0, (byte) 0x0, (byte) 0x2, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x10, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x28, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x12, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x13, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x14, (byte) 0x73, (byte) 0x71, (byte) 0x0, (byte) 0x7e,
-        (byte) 0x0, (byte) 0x10, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1a, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x12, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x13, (byte) 0x71, (byte) 0x0, (byte) 0x7e, (byte) 0x0, (byte) 0x16, (byte) 0x70, (byte) 0x78, (byte) 0x0, (byte) 0x1, (byte) 0x86, (byte) 0x9f, (byte) 0x74, (byte) 0x0, (byte) 0x15, (byte) 0x75, (byte) 0x73,
-        (byte) 0x65, (byte) 0x72, (byte) 0x20, (byte) 0x64, (byte) 0x65, (byte) 0x66, (byte) 0x69, (byte) 0x6e, (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x73, (byte) 0x71, (byte) 0x6c, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x70, (byte) 0x75, (byte) 0x72, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x4a, (byte) 0x78, (byte) 0x20, (byte) 0x4, (byte) 0xb5, (byte) 0x12, (byte) 0xb1,
-        (byte) 0x75, (byte) 0x93, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x78, (byte) 0x70, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x3, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0,
-        (byte) 0x0, (byte) 0x0, (byte) 0x15, (byte) 0x75, (byte) 0x72, (byte) 0x0, (byte) 0x2, (byte) 0x5b, (byte) 0x49, (byte) 0x4d, (byte) 0xba, (byte) 0x60, (byte) 0x26, (byte) 0x76, (byte) 0xea, (byte) 0xb2, (byte) 0xa5, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x78, (byte) 0x70, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x3, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1, (byte) 0x0, (byte) 0x0,
-        (byte) 0x0, (byte) 0x2, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x15, (byte) 0x78
-    };
-}
--- a/jdk/test/java/sql/util/StubBlob.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +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 util;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.sql.Blob;
-import java.sql.SQLException;
-
-
-public class StubBlob implements Blob {
-    public long length() throws SQLException {
-        return 0;
-    }
-    public byte[] getBytes(long pos, int length)
-        throws SQLException {
-        return null;
-    }
-    public InputStream getBinaryStream()
-        throws SQLException {
-        return null;
-    }
-    public long position(byte[] pattern, long start)
-        throws SQLException {
-        return 0;
-    }
-    public long position(Blob pattern, long start)
-        throws SQLException {
-        return 0;
-    }
-    public int setBytes(long pos, byte[] bytes)
-        throws SQLException {
-        return 0;
-    }
-    public int setBytes(long pos, byte[] bytes, int offset, int len)
-        throws SQLException {
-        return 0;
-    }
-    public OutputStream setBinaryStream(long pos)
-        throws SQLException {
-        return null;
-    }
-    public void truncate(long len)
-        throws SQLException {
-    }
-    /* 6.0 implementation */
-
-    public void free() throws SQLException {}
-
-    public InputStream getBinaryStream(long pos, long length) throws SQLException {
-       return null;
-    }
-}
--- a/jdk/test/java/sql/util/StubConnection.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,315 +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 util;
-
-import java.sql.Array;
-import java.sql.Blob;
-import java.sql.CallableStatement;
-import java.sql.Clob;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.NClob;
-import java.sql.PreparedStatement;
-import java.sql.SQLClientInfoException;
-import java.sql.SQLException;
-import java.sql.SQLWarning;
-import java.sql.SQLXML;
-import java.sql.Savepoint;
-import java.sql.Statement;
-import java.sql.Struct;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.Executor;
-
-public class StubConnection implements Connection {
-
-    @Override
-    public Statement createStatement() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public PreparedStatement prepareStatement(String sql) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public CallableStatement prepareCall(String sql) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public String nativeSQL(String sql) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setAutoCommit(boolean autoCommit) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public boolean getAutoCommit() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void commit() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void rollback() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void close() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public boolean isClosed() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public DatabaseMetaData getMetaData() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setReadOnly(boolean readOnly) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public boolean isReadOnly() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setCatalog(String catalog) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public String getCatalog() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setTransactionIsolation(int level) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public int getTransactionIsolation() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public SQLWarning getWarnings() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void clearWarnings() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Map<String, Class<?>> getTypeMap() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setHoldability(int holdability) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public int getHoldability() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Savepoint setSavepoint() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Savepoint setSavepoint(String name) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void rollback(Savepoint savepoint) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void releaseSavepoint(Savepoint savepoint) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Clob createClob() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Blob createBlob() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public NClob createNClob() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public SQLXML createSQLXML() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public boolean isValid(int timeout) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setClientInfo(String name, String value) throws SQLClientInfoException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setClientInfo(Properties properties) throws SQLClientInfoException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public String getClientInfo(String name) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Properties getClientInfo() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Array createArrayOf(String typeName, Object[] elements) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setSchema(String schema) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public String getSchema() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void abort(Executor executor) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public int getNetworkTimeout() throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public <T> T unwrap(Class<T> iface) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public boolean isWrapperFor(Class<?> iface) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-}
--- a/jdk/test/java/sql/util/StubDriver.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +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 util;
-
-import java.sql.Connection;
-import java.sql.Driver;
-import java.sql.DriverPropertyInfo;
-import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
-import java.util.Properties;
-import java.util.logging.Logger;
-
-public class StubDriver implements Driver {
-
-    public StubDriver() {
-    }
-
-    @Override
-    public Connection connect(String url, Properties info) throws SQLException {
-        if (acceptsURL(url)) {
-            return new StubConnection();
-        }
-        return null;
-    }
-
-    @Override
-    public boolean acceptsURL(String url) throws SQLException {
-        return url.matches("^jdbc:tennis:.*");
-    }
-
-    @Override
-    public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) throws SQLException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public int getMajorVersion() {
-        return 1;
-    }
-
-    @Override
-    public int getMinorVersion() {
-        return 0;
-    }
-
-    @Override
-    public boolean jdbcCompliant() {
-        return true;
-    }
-
-    @Override
-    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-}
--- a/jdk/test/java/sql/util/StubDriverDA.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +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 util;
-
-import java.io.File;
-import java.io.IOException;
-import java.sql.DriverAction;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Simple java.sql.Driver stub class that registers the driver via a static
- * block with a DriverAction Implementation
- * @author ljanders
- */
-public class StubDriverDA extends StubDriver {
-
-    public static final String DriverActionCalled = "DriverActionCalled.txt";
-
-    static DriverAction da;
-
-    static {
-        try {
-            DriverManager.registerDriver(new StubDriverDA(), da);
-        } catch (SQLException ex) {
-            Logger.getLogger(StubDriverDA.class.getName()).log(Level.SEVERE, null, ex);
-        }
-    }
-
-    public StubDriverDA() {
-        da = new DriverActionImpl(this);
-    }
-
-    @Override
-    public boolean acceptsURL(String url) throws SQLException {
-        return url.matches("^jdbc:luckydog:.*");
-    }
-
-    /**
-     * This method will write out a text file when called by the
-     * DriverActionImpl.release method when DriverManager.deregisterDriver
-     * is called. This is used by DriverManagerTests to validate that
-     * DriverAction.release was called
-     */
-    protected void release() {
-        File file = new File(DriverActionCalled);
-        try {
-            file.createNewFile();
-        } catch (IOException ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-}
--- a/jdk/test/java/sql/util/TestPolicy.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +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 util;
-
-import java.io.FilePermission;
-import java.security.AllPermission;
-import java.security.CodeSource;
-import java.security.Permission;
-import java.security.PermissionCollection;
-import java.security.Permissions;
-import java.security.Policy;
-import java.security.ProtectionDomain;
-import java.security.SecurityPermission;
-import java.sql.SQLPermission;
-import java.util.Enumeration;
-import java.util.PropertyPermission;
-import java.util.StringJoiner;
-
-/*
- * Simple Policy class that supports the required Permissions to validate the
- * JDBC concrete classes
- */
-public class TestPolicy extends Policy {
-
-    final PermissionCollection permissions = new Permissions();
-
-    /**
-     * Constructor which sets the minimum permissions allowing testNG to work
-     * with a SecurityManager
-     */
-    public TestPolicy() {
-        setMinimalPermissions();
-    }
-
-    /*
-     * Constructor which determines which permissions are defined for this
-     * Policy used by the JDBC tests Possible values are: all (ALLPermissions),
-     * setLog (SQLPemission("setLog"), deregisterDriver
-     * (SQLPermission("deregisterDriver") (SQLPermission("deregisterDriver"),
-     * and setSyncFactory(SQLPermission(setSyncFactory),
-     *
-     * @param policy Permissions to set
-     */
-    public TestPolicy(String policy) {
-
-        switch (policy) {
-            case "all":
-                permissions.add(new AllPermission());
-                break;
-            case "setLog":
-                setMinimalPermissions();
-                permissions.add(new SQLPermission("setLog"));
-                break;
-            case "deregisterDriver":
-                setMinimalPermissions();
-                permissions.add(new SQLPermission("deregisterDriver"));
-                break;
-            case "setSyncFactory":
-                setMinimalPermissions();
-                permissions.add(new SQLPermission("setSyncFactory"));
-                break;
-            default:
-                setMinimalPermissions();
-        }
-    }
-
-    /*
-     * Defines the minimal permissions required by testNG when running these
-     * tests
-     */
-    private void setMinimalPermissions() {
-        permissions.add(new SecurityPermission("getPolicy"));
-        permissions.add(new SecurityPermission("setPolicy"));
-        permissions.add(new RuntimePermission("getClassLoader"));
-        permissions.add(new RuntimePermission("setSecurityManager"));
-        permissions.add(new RuntimePermission("createSecurityManager"));
-        permissions.add(new PropertyPermission("testng.show.stack.frames",
-                "read"));
-        permissions.add(new PropertyPermission("line.separator", "read"));
-        permissions.add(new PropertyPermission("fileStringBuffer", "read"));
-        permissions.add(new PropertyPermission("dataproviderthreadcount", "read"));
-        permissions.add(new PropertyPermission("java.io.tmpdir", "read"));
-        permissions.add(new FilePermission("<<ALL FILES>>",
-                "read, write, delete"));
-    }
-
-    /*
-     * Overloaded methods from the Policy class
-     */
-    @Override
-    public String toString() {
-        StringJoiner sj = new StringJoiner("\n", "policy: ", "");
-        Enumeration<Permission> perms = permissions.elements();
-        while (perms.hasMoreElements()) {
-            sj.add(perms.nextElement().toString());
-        }
-        return sj.toString();
-
-    }
-
-    @Override
-    public PermissionCollection getPermissions(ProtectionDomain domain) {
-        return permissions;
-    }
-
-    @Override
-    public PermissionCollection getPermissions(CodeSource codesource) {
-        return permissions;
-    }
-
-    @Override
-    public boolean implies(ProtectionDomain domain, Permission perm) {
-        return permissions.implies(perm);
-    }
-}
--- a/jdk/test/javax/sql/testng/TEST.properties	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/javax/sql/testng/TEST.properties	Wed Jul 05 20:06:12 2017 +0200
@@ -1,3 +1,4 @@
 # JDBC unit tests uses TestNG
 TestNG.dirs= .
 othervm.dirs= .
+lib.dirs = /java/sql/testng
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/RowSetMetaDataTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,555 @@
+/*
+ * 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 test.rowset;
+
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Types;
+import javax.sql.RowSetMetaData;
+import javax.sql.rowset.RowSetMetaDataImpl;
+import static org.testng.Assert.*;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import util.BaseTest;
+
+public class RowSetMetaDataTests extends BaseTest {
+
+    // Max columns used in the tests
+    private final int MAX_COLUMNS = 5;
+    // Instance to be used within the tests
+    private RowSetMetaDataImpl rsmd;
+
+    @BeforeMethod
+    public void setUpMethod() throws Exception {
+        rsmd = new RowSetMetaDataImpl();
+        rsmd.setColumnCount(MAX_COLUMNS);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test(Integer col) throws Exception {
+        rsmd.getCatalogName(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test01(Integer col) throws Exception {
+        rsmd.getColumnClassName(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test02(Integer col) throws Exception {
+        rsmd.getColumnDisplaySize(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test03(Integer col) throws Exception {
+        rsmd.getColumnLabel(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test04(Integer col) throws Exception {
+        rsmd.getColumnName(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test05(Integer col) throws Exception {
+        rsmd.getColumnType(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test06(Integer col) throws Exception {
+        rsmd.getColumnTypeName(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test07(Integer col) throws Exception {
+        rsmd.getPrecision(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test08(Integer col) throws Exception {
+        rsmd.getScale(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test09(Integer col) throws Exception {
+        rsmd.getSchemaName(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test10(Integer col) throws Exception {
+        rsmd.getTableName(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test11(Integer col) throws Exception {
+        rsmd.isAutoIncrement(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test12(Integer col) throws Exception {
+        rsmd.isCaseSensitive(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test13(Integer col) throws Exception {
+        rsmd.isCurrency(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test14(Integer col) throws Exception {
+        rsmd.isDefinitelyWritable(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test15(Integer col) throws Exception {
+        rsmd.isNullable(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test16(Integer col) throws Exception {
+        rsmd.isReadOnly(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test17(Integer col) throws Exception {
+        rsmd.isSearchable(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test18(Integer col) throws Exception {
+        rsmd.isSigned(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test19(Integer col) throws Exception {
+        rsmd.isWritable(col);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test20(Integer col) throws Exception {
+        rsmd.setAutoIncrement(col, true);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test21(Integer col) throws Exception {
+        rsmd.setCaseSensitive(col, true);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test22(Integer col) throws Exception {
+        rsmd.setCatalogName(col, null);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test23(Integer col) throws Exception {
+        rsmd.setColumnDisplaySize(col, 5);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test24(Integer col) throws Exception {
+        rsmd.setColumnLabel(col, "label");
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test25(Integer col) throws Exception {
+        rsmd.setColumnName(col, "F1");
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test26(Integer col) throws Exception {
+        rsmd.setColumnType(col, Types.CHAR);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test27(Integer col) throws Exception {
+        rsmd.setColumnTypeName(col, "F1");
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test28(Integer col) throws Exception {
+        rsmd.setCurrency(col, true);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test29(Integer col) throws Exception {
+        rsmd.setNullable(col, ResultSetMetaData.columnNoNulls);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test30(Integer col) throws Exception {
+        rsmd.setPrecision(col, 2);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test31(Integer col) throws Exception {
+        rsmd.setScale(col, 2);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test32(Integer col) throws Exception {
+        rsmd.setSchemaName(col, "Gotham");
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test33(Integer col) throws Exception {
+        rsmd.setSearchable(col, false);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test34(Integer col) throws Exception {
+        rsmd.setSigned(col, false);
+    }
+
+    /*
+     * Validate a SQLException is thrown for an invalid column index
+     */
+    @Test(dataProvider = "invalidColumnRanges",
+            expectedExceptions = SQLException.class)
+    public void test35(Integer col) throws Exception {
+        rsmd.setTableName(col, "SUPERHEROS");
+    }
+
+    /*
+     * Validate that the correct class name is returned for the column
+     * Note:  Once setColumnClassName is added to RowSetMetaData, this
+     * method will need to change.
+     */
+    @Test(dataProvider = "columnClassNames")
+    public void test36(Integer type, String name) throws Exception {
+        rsmd.setColumnType(1, type);
+        assertTrue(rsmd.getColumnClassName(1).equals(name));
+    }
+
+    /*
+     * Validate that all of the methods are accessible and the correct value
+     * is returned for each column
+     */
+    @Test(dataProvider = "columnRanges")
+    public void test37(Integer col) throws Exception {
+        rsmd.setAutoIncrement(col, true);
+        assertTrue(rsmd.isAutoIncrement(col));
+        rsmd.setCaseSensitive(col, true);
+        assertTrue(rsmd.isCaseSensitive(col));
+        rsmd.setCatalogName(col, "Gotham");
+        assertTrue(rsmd.getCatalogName(col).equals("Gotham"));
+        rsmd.setColumnDisplaySize(col, 20);
+        assertTrue(rsmd.getColumnDisplaySize(col) == 20);
+        rsmd.setColumnLabel(col, "F1");
+        assertTrue(rsmd.getColumnLabel(col).equals("F1"));
+        rsmd.setColumnName(col, "F1");
+        assertTrue(rsmd.getColumnName(col).equals("F1"));
+        rsmd.setColumnType(col, Types.INTEGER);
+        assertTrue(rsmd.getColumnType(col) == Types.INTEGER);
+        assertTrue(rsmd.getColumnClassName(col).equals(Integer.class.getName()));
+        rsmd.setColumnTypeName(col, "INTEGER");
+        assertTrue(rsmd.getColumnTypeName(col).equals("INTEGER"));
+        rsmd.setCurrency(col, true);
+        assertTrue(rsmd.isCurrency(col));
+        rsmd.setNullable(col, ResultSetMetaData.columnNoNulls);
+        assertTrue(rsmd.isNullable(col) == ResultSetMetaData.columnNoNulls);
+        rsmd.setPrecision(col, 2);
+        assertTrue(rsmd.getPrecision(col) == 2);
+        rsmd.setScale(col, 2);
+        assertTrue(rsmd.getScale(col) == 2);
+        rsmd.setSchemaName(col, "GOTHAM");
+        assertTrue(rsmd.getSchemaName(col).equals("GOTHAM"));
+        rsmd.setSearchable(col, false);
+        assertFalse(rsmd.isSearchable(col));
+        rsmd.setSigned(col, false);
+        assertFalse(rsmd.isSigned(col));
+        rsmd.setTableName(col, "SUPERHEROS");
+        assertTrue(rsmd.getTableName(col).equals("SUPERHEROS"));
+        rsmd.isReadOnly(col);
+        rsmd.isDefinitelyWritable(col);
+        rsmd.isWritable(col);
+
+    }
+
+    /*
+     * Validate that the proper values are accepted by setNullable
+     */
+    @Test(dataProvider = "validSetNullableValues")
+    public void test38(Integer val) throws Exception {
+        rsmd.setNullable(1, val);
+    }
+
+    /*
+     * Validate that the correct type is returned for the column
+     */
+    @Test(dataProvider = "jdbcTypes")
+    public void test39(Integer type) throws Exception {
+        rsmd.setColumnType(1, type);
+        assertTrue(type == rsmd.getColumnType(1));
+    }
+
+    /*
+     * Validate that the correct value is returned from the isXXX methods
+     */
+    @Test(dataProvider = "trueFalse")
+    public void test40(Boolean b) throws Exception {
+        rsmd.setAutoIncrement(1, b);
+        rsmd.setCaseSensitive(1, b);
+        rsmd.setCurrency(1, b);
+        rsmd.setSearchable(1, b);
+        rsmd.setSigned(1, b);
+        assertTrue(rsmd.isAutoIncrement(1) == b);
+        assertTrue(rsmd.isCaseSensitive(1) == b);
+        assertTrue(rsmd.isCurrency(1) == b);
+        assertTrue(rsmd.isSearchable(1) == b);
+        assertTrue(rsmd.isSigned(1) == b);
+    }
+
+    /*
+     * Validate isWrapperFor and unwrap work correctly
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void test99() throws Exception {
+        RowSetMetaData rsmd1 = rsmd;
+        ResultSetMetaData rsmd2 = rsmd;
+        Class clzz = rsmd.getClass();
+        assertTrue(rsmd1.isWrapperFor(clzz));
+        assertTrue(rsmd2.isWrapperFor(clzz));
+        RowSetMetaDataImpl rsmdi = (RowSetMetaDataImpl) rsmd2.unwrap(clzz);
+
+        // False should be returned
+        assertFalse(rsmd1.isWrapperFor(this.getClass()));
+        assertFalse(rsmd2.isWrapperFor(this.getClass()));
+    }
+
+    /*
+     * DataProvider used to provide Date which are not valid and are used
+     * to validate that an IllegalArgumentException will be thrown from the
+     * valueOf method
+     */
+    @DataProvider(name = "validSetNullableValues")
+    private Object[][] validSetNullableValues() {
+        return new Object[][]{
+            {ResultSetMetaData.columnNoNulls},
+            {ResultSetMetaData.columnNullable},
+            {ResultSetMetaData.columnNullableUnknown}
+        };
+    }
+
+    /*
+     * DataProvider used to provide column indexes that are out of range so that
+     * SQLException is thrown
+     */
+    @DataProvider(name = "invalidColumnRanges")
+    private Object[][] invalidColumnRanges() {
+        return new Object[][]{
+            {-1},
+            {0},
+            {MAX_COLUMNS + 1}
+        };
+    }
+
+    /*
+     * DataProvider used to provide the valid column ranges for the
+     * RowSetMetaDataImpl object
+     */
+    @DataProvider(name = "columnRanges")
+    private Object[][] columnRanges() {
+        Object[][] o = new Object[MAX_COLUMNS][1];
+        for (int i = 1; i <= MAX_COLUMNS; i++) {
+            o[i - 1][0] = i;
+        }
+        return o;
+    }
+
+    /*
+     * DataProvider used to specify the value to set via setColumnType and
+     * the expected value to be returned from getColumnClassName
+     */
+    @DataProvider(name = "columnClassNames")
+    private Object[][] columnClassNames() {
+        return new Object[][]{
+            {Types.CHAR, "java.lang.String"},
+            {Types.NCHAR, "java.lang.String"},
+            {Types.VARCHAR, "java.lang.String"},
+            {Types.NVARCHAR, "java.lang.String"},
+            {Types.LONGVARCHAR, "java.lang.String"},
+            {Types.LONGNVARCHAR, "java.lang.String"},
+            {Types.NUMERIC, "java.math.BigDecimal"},
+            {Types.DECIMAL, "java.math.BigDecimal"},
+            {Types.BIT, "java.lang.Boolean"},
+            {Types.TINYINT, "java.lang.Byte"},
+            {Types.SMALLINT, "java.lang.Short"},
+            {Types.INTEGER, "java.lang.Integer"},
+            {Types.FLOAT, "java.lang.Double"},
+            {Types.DOUBLE, "java.lang.Double"},
+            {Types.BINARY, "byte[]"},
+            {Types.VARBINARY, "byte[]"},
+            {Types.LONGVARBINARY, "byte[]"},
+            {Types.DATE, "java.sql.Date"},
+            {Types.TIME, "java.sql.Time"},
+            {Types.TIMESTAMP, "java.sql.Timestamp"},
+            {Types.CLOB, "java.sql.Clob"},
+            {Types.BLOB, "java.sql.Blob"}
+
+        };
+
+    }
+
+}
--- a/jdk/test/javax/sql/testng/util/BaseTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +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 util;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.security.Policy;
-import java.sql.SQLException;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-
-public class BaseTest {
-
-    protected final String reason = "reason";
-    protected final String state = "SQLState";
-    protected final String cause = "java.lang.Throwable: cause";
-    protected final Throwable t = new Throwable("cause");
-    protected final Throwable t1 = new Throwable("cause 1");
-    protected final Throwable t2 = new Throwable("cause 2");
-    protected final int errorCode = 21;
-    protected final String[] msgs = {"Exception 1", "cause 1", "Exception 2",
-        "Exception 3", "cause 2"};
-
-    @BeforeClass
-    public static void setUpClass() throws Exception {
-    }
-
-    @AfterClass
-    public static void tearDownClass() throws Exception {
-    }
-
-    @BeforeMethod
-    public void setUpMethod() throws Exception {
-    }
-
-    @AfterMethod
-    public void tearDownMethod() throws Exception {
-    }
-
-    /*
-     * Take some form of SQLException, serialize and deserialize it
-     */
-    @SuppressWarnings("unchecked")
-    protected <T extends SQLException> T
-            createSerializedException(T ex)
-            throws IOException, ClassNotFoundException {
-        return (T) serializeDeserializeObject(ex);
-    }
-
-    /*
-     * Utility method to serialize and deserialize an object
-     */
-    @SuppressWarnings("unchecked")
-    protected <T> T serializeDeserializeObject(T o)
-            throws IOException, ClassNotFoundException {
-        T o1;
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
-            oos.writeObject(o);
-        }
-        try (ObjectInputStream ois
-                = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
-            o1 = (T) ois.readObject();
-        }
-        return o1;
-    }
-
-    /*
-     * Utility Method used to set the current Policy
-     */
-    protected static void setPolicy(Policy p) {
-        Policy.setPolicy(p);
-    }
-}
--- a/jdk/test/javax/sql/testng/util/TestPolicy.java	Wed Jul 05 20:05:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +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 util;
-
-import java.io.FilePermission;
-import java.security.AllPermission;
-import java.security.CodeSource;
-import java.security.Permission;
-import java.security.PermissionCollection;
-import java.security.Permissions;
-import java.security.Policy;
-import java.security.ProtectionDomain;
-import java.security.SecurityPermission;
-import java.sql.SQLPermission;
-import java.util.Enumeration;
-import java.util.PropertyPermission;
-import java.util.StringJoiner;
-
-/*
- * Simple Policy class that supports the required Permissions to validate the
- * JDBC concrete classes
- */
-public class TestPolicy extends Policy {
-
-    final PermissionCollection permissions = new Permissions();
-
-    /**
-     * Constructor which sets the minimum permissions allowing testNG to work
-     * with a SecurityManager
-     */
-    public TestPolicy() {
-        setMinimalPermissions();
-    }
-
-    /*
-     * Constructor which determines which permissions are defined for this
-     * Policy used by the JDBC tests Possible values are: all (ALLPermissions),
-     * setLog (SQLPemission("setLog"), deregisterDriver
-     * (SQLPermission("deregisterDriver") (SQLPermission("deregisterDriver"),
-     * and setSyncFactory(SQLPermission(setSyncFactory),
-     *
-     * @param policy Permissions to set
-     */
-    public TestPolicy(String policy) {
-
-        switch (policy) {
-            case "all":
-                permissions.add(new AllPermission());
-                break;
-            case "setLog":
-                setMinimalPermissions();
-                permissions.add(new SQLPermission("setLog"));
-                break;
-            case "deregisterDriver":
-                setMinimalPermissions();
-                permissions.add(new SQLPermission("deregisterDriver"));
-                break;
-            case "setSyncFactory":
-                setMinimalPermissions();
-                permissions.add(new SQLPermission("setSyncFactory"));
-                break;
-            default:
-                setMinimalPermissions();
-        }
-    }
-
-    /*
-     * Defines the minimal permissions required by testNG when running these
-     * tests
-     */
-    private void setMinimalPermissions() {
-        permissions.add(new SecurityPermission("getPolicy"));
-        permissions.add(new SecurityPermission("setPolicy"));
-        permissions.add(new RuntimePermission("getClassLoader"));
-        permissions.add(new RuntimePermission("setSecurityManager"));
-        permissions.add(new RuntimePermission("createSecurityManager"));
-        permissions.add(new PropertyPermission("testng.show.stack.frames",
-                "read"));
-        permissions.add(new PropertyPermission("line.separator", "read"));
-        permissions.add(new PropertyPermission("fileStringBuffer", "read"));
-        permissions.add(new PropertyPermission("dataproviderthreadcount", "read"));
-        permissions.add(new PropertyPermission("java.io.tmpdir", "read"));
-        permissions.add(new FilePermission("<<ALL FILES>>",
-                "read, write, delete"));
-    }
-
-    /*
-     * Overloaded methods from the Policy class
-     */
-    @Override
-    public String toString() {
-        StringJoiner sj = new StringJoiner("\n", "policy: ", "");
-        Enumeration<Permission> perms = permissions.elements();
-        while (perms.hasMoreElements()) {
-            sj.add(perms.nextElement().toString());
-        }
-        return sj.toString();
-
-    }
-
-    @Override
-    public PermissionCollection getPermissions(ProtectionDomain domain) {
-        return permissions;
-    }
-
-    @Override
-    public PermissionCollection getPermissions(CodeSource codesource) {
-        return permissions;
-    }
-
-    @Override
-    public boolean implies(ProtectionDomain domain, Permission perm) {
-        return permissions.implies(perm);
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JLayer/8054543/bug8054543.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+ /*
+ * @test
+ * @summary Setting a border on a JLayer causes an Exceptions
+ * @author Alexander Potochkin
+ * @run main bug8054543
+ */
+
+import javax.swing.*;
+import javax.swing.border.Border;
+import java.awt.*;
+
+public class bug8054543 {
+
+    public bug8054543() {
+        JLayer<JComponent> layer = new JLayer<>();
+        Border border = BorderFactory.createLineBorder(Color.GREEN);
+        JButton view = new JButton("JButton");
+
+        layer.setBorder(border);
+        check(layer.getBorder(), null);
+
+        layer.setBorder(null);
+        check(layer.getBorder(), null);
+
+        layer.setView(view);
+        check(layer.getBorder(), view.getBorder());
+
+        layer.setBorder(border);
+        check(border, view.getBorder());
+
+        layer.setBorder(null);
+        check(layer.getBorder(), view.getBorder());
+    }
+
+    private void check(Object o1, Object o2) {
+        if (o1 != o2) {
+            throw new RuntimeException("Test failed");
+        }
+    }
+
+    public static void main(String... args) throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                new bug8054543();
+            }
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JRadioButton/8033699/bug8033699.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,255 @@
+/*
+ * 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.
+ */
+
+ /*
+ * @test
+ * @library ../../regtesthelpers
+ * @build Util
+ * @bug 8033699
+ * @summary  Incorrect radio button behavior when pressing tab key
+ * @author Vivi An
+ * @run main bug8033699
+ */
+
+import javax.swing.*;
+import javax.swing.event.*;
+import java.awt.event.*;
+import java.awt.*;
+import sun.awt.SunToolkit;
+
+public class bug8033699 {
+    private static Robot robot;
+    private static SunToolkit toolkit;
+
+    private static JButton btnStart;
+    private static ButtonGroup btnGrp;
+    private static JButton btnEnd;
+    private static JButton btnMiddle;
+    private static JRadioButton radioBtn1;
+    private static JRadioButton radioBtn2;
+    private static JRadioButton radioBtn3;
+    private static JRadioButton radioBtnSingle;
+
+    public static void main(String args[]) throws Throwable {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+
+        robot = new Robot();
+        Thread.sleep(100);
+
+        robot.setAutoDelay(100);
+        toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+
+        // tab key test grouped radio button
+        runTest1();
+
+        // tab key test non-grouped radio button
+        runTest2();
+
+        // shift tab key test grouped and non grouped radio button
+        runTest3();
+
+        // left/up key test in grouped radio button
+        runTest4();
+
+        // down/right key test in grouped radio button
+        runTest5();
+
+        // tab from radio button in group to next component in the middle of button group layout
+        runTest6();
+
+        // tab to radio button in group from component in the middle of button group layout
+        runTest7();
+
+        // down key circle back to first button in grouped radio button
+        runTest8();
+    }
+
+    private static void createAndShowGUI() {
+        JFrame mainFrame = new JFrame("Bug 8033699 - 8 Tests for Grouped/Non Group Radio Buttons");
+
+        btnStart = new JButton("Start");
+        btnEnd = new JButton("End");
+        btnMiddle = new JButton("Middle");
+
+        JPanel box = new JPanel();
+        box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
+        box.setBorder(BorderFactory.createTitledBorder("Grouped Radio Buttons"));
+        radioBtn1 = new JRadioButton("A");
+        radioBtn2 = new JRadioButton("B");
+        radioBtn3 = new JRadioButton("C");
+
+        ButtonGroup btnGrp = new ButtonGroup();
+        btnGrp.add(radioBtn1);
+        btnGrp.add(radioBtn2);
+        btnGrp.add(radioBtn3);
+        radioBtn1.setSelected(true);
+
+        box.add(radioBtn1);
+        box.add(radioBtn2);
+        box.add(btnMiddle);
+        box.add(radioBtn3);
+
+        radioBtnSingle = new JRadioButton("Not Grouped");
+        radioBtnSingle.setSelected(true);
+
+        mainFrame.getContentPane().add(btnStart);
+        mainFrame.getContentPane().add(box);
+        mainFrame.getContentPane().add(radioBtnSingle);
+        mainFrame.getContentPane().add(btnEnd);
+
+        mainFrame.getRootPane().setDefaultButton(btnStart);
+        btnStart.requestFocus();
+
+        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        mainFrame.setLayout(new BoxLayout(mainFrame.getContentPane(), BoxLayout.Y_AXIS));
+
+        mainFrame.setSize(300, 300);
+        mainFrame.setLocation(200, 200);
+        mainFrame.setVisible(true);
+        mainFrame.toFront();
+    }
+
+    // Radio button Group as a single component when traversing through tab key
+    private static void runTest1() throws Exception{
+        hitKey(robot, KeyEvent.VK_TAB);
+        hitKey(robot, KeyEvent.VK_TAB);
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != radioBtnSingle) {
+                    System.out.println("Radio Button Group Go To Next Component through Tab Key failed");
+                    throw new RuntimeException("Focus is not on Radio Button Single as Expected");
+                }
+            }
+        });
+    }
+
+    // Non-Grouped Radio button as a single component when traversing through tab key
+    private static void runTest2() throws Exception{
+        hitKey(robot, KeyEvent.VK_TAB);
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != btnEnd) {
+                    System.out.println("Non Grouped Radio Button Go To Next Component through Tab Key failed");
+                    throw new RuntimeException("Focus is not on Button End as Expected");
+                }
+            }
+        });
+    }
+
+    // Non-Grouped Radio button and Group Radio button as a single component when traversing through shift-tab key
+    private static void runTest3() throws Exception{
+        hitKey(robot, KeyEvent.VK_SHIFT, KeyEvent.VK_TAB);
+        hitKey(robot, KeyEvent.VK_SHIFT, KeyEvent.VK_TAB);
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != radioBtn3) {
+                    System.out.println("Radio button Group/Non Grouped Radio Button SHIFT-Tab Key Test failed");
+                    throw new RuntimeException("Focus is not on Radio Button C as Expected");
+                }
+            }
+        });
+    }
+
+    // Using arrow key to move focus in radio button group
+    private static void runTest4() throws Exception{
+        hitKey(robot, KeyEvent.VK_UP);
+        hitKey(robot, KeyEvent.VK_LEFT);
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != radioBtn1) {
+                    System.out.println("Radio button Group UP/LEFT Arrow Key Move Focus Failed");
+                    throw new RuntimeException("Focus is not on Radio Button A as Expected");
+                }
+            }
+        });
+    }
+
+    private static void runTest5() throws Exception{
+        hitKey(robot, KeyEvent.VK_DOWN);
+        hitKey(robot, KeyEvent.VK_RIGHT);
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != radioBtn3) {
+                    System.out.println("Radio button Group Left/Up Arrow Key Move Focus Failed");
+                    throw new RuntimeException("Focus is not on Radio Button C as Expected");
+                }
+            }
+        });
+    }
+
+    private static void runTest6() throws Exception{
+        hitKey(robot, KeyEvent.VK_DOWN);
+        hitKey(robot, KeyEvent.VK_DOWN);
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != radioBtn2) {
+                    System.out.println("Radio button Group Circle Back To First Button Test");
+                    throw new RuntimeException("Focus is not on Radio Button A as Expected");
+                }
+            }
+        });
+    }
+
+    private static void runTest7() throws Exception{
+        hitKey(robot, KeyEvent.VK_TAB);
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != btnMiddle) {
+                    System.out.println("Separate Component added in button group layout");
+                    throw new RuntimeException("Focus is not on Middle Button as Expected");
+                }
+            }
+        });
+    }
+
+    private static void runTest8() throws Exception{
+        hitKey(robot, KeyEvent.VK_TAB);
+        SwingUtilities.invokeAndWait(new Runnable() {
+            public void run() {
+                if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() != radioBtn3) {
+                    System.out.println("Separate Component added in button group layout");
+                    throw new RuntimeException("Focus is not on Radio Button C as Expected");
+                }
+            }
+        });
+    }
+
+    private static void hitKey(Robot robot, int keycode) {
+        robot.keyPress(keycode);
+        robot.keyRelease(keycode);
+        toolkit.realSync();
+    }
+
+    private static void hitKey(Robot robot, int mode, int keycode) {
+        robot.keyPress(mode);
+        robot.keyPress(keycode);
+        robot.keyRelease(mode);
+        robot.keyRelease(keycode);
+        toolkit.realSync();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTabbedPane/7170310/bug7170310.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,124 @@
+/*
+ * 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.
+ */
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.JViewport;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+import sun.awt.SunToolkit;
+
+/**
+ * @test
+ * @bug 7170310
+ * @author Alexey Ivanov
+ * @summary Selected tab should be scrolled into view.
+ * @run main bug7170310
+ */
+public class bug7170310 {
+    private static final int TABS_NUMBER = 3;
+
+    private static volatile JTabbedPane tabbedPane;
+    private static volatile int count = 1;
+
+    private static volatile JFrame frame;
+
+    private static volatile Exception exception = null;
+
+    public static void main(String[] args) throws Exception {
+        try {
+            UIManager.setLookAndFeel(new MetalLookAndFeel());
+            SwingUtilities.invokeAndWait(bug7170310::createAndShowUI);
+
+            SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+            toolkit.realSync();
+
+            for (int i = 0; i < TABS_NUMBER; i++) {
+                SwingUtilities.invokeAndWait(bug7170310::addTab);
+                toolkit.realSync();
+            }
+
+            SwingUtilities.invokeAndWait(bug7170310::check);
+
+            if (exception != null) {
+                System.out.println("Test failed: " + exception.getMessage());
+                throw exception;
+            } else {
+                System.out.printf("Test passed");
+            }
+        } finally {
+            frame.dispose();
+        }
+    }
+
+    private static void createAndShowUI() {
+        frame = new JFrame("bug7170310");
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+        frame.setSize(200, 100);
+
+        tabbedPane = new JTabbedPane();
+        tabbedPane.addTab("Main Tab", new JPanel());
+
+        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
+
+        frame.getContentPane().add(tabbedPane);
+        frame.setVisible(true);
+    }
+
+    private static void addTab() {
+        tabbedPane.addTab("Added Tab " + count++, new JPanel());
+        tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
+    }
+
+    private static void check() {
+        try {
+            JViewport vp = null;
+            for (Component c : tabbedPane.getComponents()) {
+                if (c instanceof JViewport) {
+                    vp = (JViewport) c;
+                    break;
+                }
+            }
+
+            JComponent v = (JComponent) vp.getView();
+            Rectangle vr = vp.getViewRect();
+            Dimension vs = v.getSize();
+
+            // The tab view must be scrolled to the end so that the last tab is visible
+            if (vs.width != (vr.x + vr.width)) {
+                throw new RuntimeException("tabScroller.tabPanel view is positioned incorrectly: "
+                        + vs.width + " vs " + (vr.x + vr.width));
+            }
+        } catch (Exception e) {
+            exception = e;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/html/HTMLDocument/8058120/bug8058120.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,109 @@
+/*
+ * 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.
+ */
+
+/* @test
+ * @bug 8058120
+ * @summary Rendering / caret errors with HTMLDocument
+ * @author Dmitry Markov
+ * @run main bug8058120
+ */
+
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import javax.swing.text.Element;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+import java.awt.*;
+
+public class bug8058120 {
+    private static SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+    private static HTMLDocument document = null;
+    private static final String text = "<p id = 'ab'>ab</p>";
+    private static final String textToInsert = "c";
+
+    public static void main(String[] args) {
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+
+        toolkit.realSync();
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    document.insertAfterEnd(document.getElement("ab"), textToInsert);
+                } catch (Exception ex) {
+                    throw new RuntimeException(ex);
+                }
+            }
+        });
+
+        toolkit.realSync();
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                Element parent = document.getElement("ab").getParentElement();
+                int count = parent.getElementCount();
+                if (count != 2) {
+                    throw new RuntimeException("Test Failed! Unexpected Element count = "+count);
+                }
+                Element insertedElement = parent.getElement(count - 1);
+                if (!HTML.Tag.IMPLIED.toString().equals(insertedElement.getName())) {
+                    throw new RuntimeException("Test Failed! Inserted text is not wrapped by " + HTML.Tag.IMPLIED + " tag");
+                }
+            }
+        });
+    }
+
+    private static void createAndShowGUI() {
+        try {
+            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
+        } catch (Exception ex) {
+            throw new RuntimeException(ex);
+        }
+
+        JFrame frame = new JFrame("bug8058120");
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        JEditorPane editorPane = new JEditorPane();
+        editorPane.setContentType("text/html");
+        editorPane.setEditorKit(new HTMLEditorKit());
+
+        document = (HTMLDocument) editorPane.getDocument();
+
+        editorPane.setText(text);
+
+        frame.add(editorPane);
+        frame.setSize(200, 200);
+        frame.setVisible(true);
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/jaxp/testng/parse/jdk7156085/UTF8ReaderBug.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2014 Google, Inc.  All Rights Reserved.
+ * 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 parse.jdk7156085;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.InputSource;
+import org.xml.sax.helpers.DefaultHandler;
+import org.testng.annotations.Test;
+
+/**
+ * JDK-7156085: ArrayIndexOutOfBoundsException throws in UTF8Reader of SAXParser
+ * https://bugs.openjdk.java.net/browse/JDK-7156085
+ *
+ * XERCESJ-1257: buffer overflow in UTF8Reader for characters out of BMP
+ * https://issues.apache.org/jira/browse/XERCESJ-1257
+ */
+public class UTF8ReaderBug {
+    @Test
+    public void shouldAcceptSupplementaryCharacters() throws Throwable {
+        StringBuilder b = new StringBuilder("<xml>");
+        for(int i = 5; i < 8223; i++) {
+            b.append(' ');
+        }
+        // Add surrogate characters which overflow the buffer. This shows the need to place an
+        // overflow check at --
+        // com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:544)
+        b.append("\uD835\uDC37");
+        b.append("</xml>");
+        sendToParser(b.toString());
+    }
+
+    private static void sendToParser(String b) throws Throwable {
+        byte[] input = b.getBytes("UTF-8");
+        ByteArrayInputStream in = new ByteArrayInputStream(input);
+
+        SAXParserFactory  spf = SAXParserFactory.newInstance();
+        SAXParser p = spf.newSAXParser();
+        p.parse(new InputSource(in), new DefaultHandler());
+    }
+}
--- a/jdk/test/jdk/nio/zipfs/Basic.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/jdk/nio/zipfs/Basic.java	Wed Jul 05 20:06:12 2017 +0200
@@ -35,7 +35,7 @@
  * @summary Basic test for zip provider
  *
  * @run main Basic
- * @run main/othervm/policy=test.policy Basic
+ * @run main/othervm/java.security.policy=test.policy Basic
  */
 
 public class Basic {
--- a/jdk/test/jdk/nio/zipfs/PathOps.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/jdk/nio/zipfs/PathOps.java	Wed Jul 05 20:06:12 2017 +0200
@@ -33,7 +33,7 @@
  * @summary Tests path operations for zip provider.
  *
  * @run main PathOps
- * @run main/othervm/policy=test.policy.readonly PathOps
+ * @run main/othervm/java.security.policy=test.policy.readonly PathOps
  */
 
 public class PathOps {
--- a/jdk/test/jdk/nio/zipfs/ZFSTests.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/jdk/nio/zipfs/ZFSTests.java	Wed Jul 05 20:06:12 2017 +0200
@@ -26,7 +26,7 @@
  * @summary ZipFileSystem regression tests
  *
  * @run main ZFSTests
- * @run main/othervm/policy=test.policy ZFSTests
+ * @run main/othervm/java.security.policy=test.policy ZFSTests
  */
 
 
--- a/jdk/test/jdk/nio/zipfs/ZipFSTester.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/jdk/nio/zipfs/ZipFSTester.java	Wed Jul 05 20:06:12 2017 +0200
@@ -43,7 +43,7 @@
  *      7157656 8002390 7012868 7012856 8015728 8038500 8040059
  * @summary Test Zip filesystem provider
  * @run main ZipFSTester
- * @run main/othervm/policy=test.policy ZipFSTester
+ * @run main/othervm/java.security.policy=test.policy ZipFSTester
  */
 
 public class ZipFSTester {
--- a/jdk/test/jdk/nio/zipfs/test.policy	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/jdk/nio/zipfs/test.policy	Wed Jul 05 20:06:12 2017 +0200
@@ -1,9 +1,3 @@
-grant codeBase "file:${java.home}/lib/ext/zipfs.jar" {
-    permission java.io.FilePermission "<<ALL FILES>>", "read,write";
-    permission java.lang.RuntimePermission "fileSystemProvider";
-    permission java.util.PropertyPermission "*", "read";
-};
-
 grant {
     permission java.io.FilePermission "<<ALL FILES>>","read,write,delete";
     permission java.util.PropertyPermission "test.jdk","read";
--- a/jdk/test/jdk/nio/zipfs/test.policy.readonly	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/jdk/nio/zipfs/test.policy.readonly	Wed Jul 05 20:06:12 2017 +0200
@@ -1,9 +1,3 @@
-grant codeBase "file:${java.home}/lib/ext/zipfs.jar" {
-    permission java.io.FilePermission "<<ALL FILES>>", "read,write";
-    permission java.lang.RuntimePermission "fileSystemProvider";
-    permission java.util.PropertyPermission "*", "read";
-};
-
 grant {
     permission java.io.FilePermission "<<ALL FILES>>","read";
     permission java.util.PropertyPermission "test.jdk","read";
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java	Wed Jul 05 20:06:12 2017 +0200
@@ -319,13 +319,14 @@
 
             return output;
         } catch (Throwable t) {
+            if (p != null) {
+                p.destroyForcibly().waitFor();
+            }
+
             failed = true;
             System.out.println("executeProcess() failed: " + t);
             throw t;
         } finally {
-            if (p != null) {
-                p.destroyForcibly().waitFor();
-            }
             if (failed) {
                 System.err.println(getProcessLog(pb, output));
             }
--- a/jdk/test/sun/java2d/DirectX/OnScreenRenderingResizeTest/OnScreenRenderingResizeTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/sun/java2d/DirectX/OnScreenRenderingResizeTest/OnScreenRenderingResizeTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -89,8 +89,13 @@
             public void update(Graphics g) {}
         };
         frame.setBackground(bgColor);
+        frame.setUndecorated(true);
         frame.pack();
-        frame.setSize(FRAME_W, FRAME_H);
+
+        GraphicsConfiguration gc = frame.getGraphicsConfiguration();
+        Rectangle gcBounds = gc.getBounds();
+        frame.setBounds(gcBounds.width / 4, gcBounds.height / 4, FRAME_W, FRAME_H);
+
         frame.addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
                 done = true;
@@ -108,9 +113,8 @@
             ex.printStackTrace();
         }
 
-        GraphicsConfiguration gc = frame.getGraphicsConfiguration();
-        int maxW = gc.getBounds().width /2;
-        int maxH = gc.getBounds().height/2;
+        int maxW = gcBounds.width /2;
+        int maxH = gcBounds.height/2;
         int minW = frame.getWidth();
         int minH = frame.getHeight();
         int incW = 10, incH = 10, cnt = 0;
@@ -155,6 +159,7 @@
             Insets in = frame.getInsets();
             frame.getGraphics().drawImage(output, in.left, in.top, null);
             if (cnt == 90 && robot != null) {
+                robot.waitForIdle();
                 // area where we blitted to should be either white or green
                 Point p = frame.getLocationOnScreen();
                 p.translate(in.left+10, in.top+10);
@@ -172,7 +177,7 @@
                                   frame.getWidth()-in.left-in.right,
                                   frame.getHeight()-in.top-in.bottom-5-IMAGE_H));
                 int accepted2[] = { Color.white.getRGB() };
-                checkBI(bi, accepted1);
+                checkBI(bi, accepted2);
             }
 
             Thread.yield();
--- a/jdk/test/sun/nio/cs/TestUTF_16.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/sun/nio/cs/TestUTF_16.java	Wed Jul 05 20:06:12 2017 +0200
@@ -150,7 +150,7 @@
             if (CoderResult.OVERFLOW !=
                 Charset.forName("UTF_16")
                 .newDecoder()
-                .decode((ByteBuffer)(ByteBuffer.allocate(4)
+                .decode((ByteBuffer.allocate(4)
                                      .put(new byte[]
                                           {(byte)0xd8,(byte)0x00,
                                            (byte)0xdc,(byte)0x01})
--- a/jdk/test/sun/nio/cs/TestUTF_32.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/sun/nio/cs/TestUTF_32.java	Wed Jul 05 20:06:12 2017 +0200
@@ -184,7 +184,7 @@
         if (CoderResult.OVERFLOW !=
             Charset.forName("UTF_32")
             .newDecoder()
-            .decode((ByteBuffer)(ByteBuffer.allocate(4)
+            .decode((ByteBuffer.allocate(4)
                                  .put(new byte[]
                                       {(byte)0,(byte)1, (byte)0,(byte)01})
                                  .flip()),
--- a/jdk/test/sun/security/pkcs11/KeyStore/Basic.policy	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/sun/security/pkcs11/KeyStore/Basic.policy	Wed Jul 05 20:06:12 2017 +0200
@@ -1,17 +1,3 @@
-grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2pkcs11";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.*";
-        permission java.security.SecurityPermission "clearProviderProperties.*";
-        permission java.security.SecurityPermission "removeProviderProperty.*";
-        permission java.security.SecurityPermission "getProperty.auth.login.defaultCallbackHandler";
-        permission java.security.SecurityPermission "authProvider.*";
-        // Needed for reading PKCS11 config file and NSS library check
-        permission java.io.FilePermission "<<ALL FILES>>", "read";
-};
-
 grant codebase "file:${user.dir}${/}loader.jar" {
     permission java.security.AllPermission;
 };
--- a/jdk/test/sun/security/pkcs11/Provider/Login.policy	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/sun/security/pkcs11/Provider/Login.policy	Wed Jul 05 20:06:12 2017 +0200
@@ -1,18 +1,3 @@
-grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" {
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*";
-        permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
-        permission java.lang.RuntimePermission "loadLibrary.j2pkcs11";
-        permission java.util.PropertyPermission "*", "read";
-        permission java.security.SecurityPermission "putProviderProperty.*";
-        permission java.security.SecurityPermission "clearProviderProperties.*";
-        permission java.security.SecurityPermission "removeProviderProperty.*";
-        permission java.security.SecurityPermission "getProperty.auth.login.defaultCallbackHandler";
-
-        permission java.security.SecurityPermission "authProvider.*";
-        // Needed for reading PKCS11 config file and NSS library check
-        permission java.io.FilePermission "<<ALL FILES>>", "read";
-};
-
 grant {
     permission java.util.PropertyPermission "*", "read, write";
     permission java.lang.RuntimePermission "loadLibrary.*";
@@ -23,6 +8,5 @@
 
     permission java.io.FilePermission "<<ALL FILES>>", "read";
     permission java.security.SecurityPermission "setProperty.auth.login.defaultCallbackHandler";
-    permission java.security.SecurityPermission "authProvider.SunPKCS11-NSS"
-;
+    permission java.security.SecurityPermission "authProvider.SunPKCS11-NSS";
 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/tools/keytool/ExportPrivateKeyNoPwd.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+import java.security.*;
+
+/*
+ * Export a private key from the named keychain entry without supplying a
+ * password. See JDK-8062264.
+ *
+ * NOTE: Keychain access controls must already have been lowered to permit
+ *       the target entry to be accessed.
+ */
+public class ExportPrivateKeyNoPwd {
+
+    public static final void main(String[] args) throws Exception {
+
+        if (args.length != 1) {
+            throw new Exception(
+                "ExportPrivateKeyNoPwd: must supply name of a keystore entry");
+        }
+        String alias = args[0];
+
+        KeyStore ks = KeyStore.getInstance("KeychainStore");
+        System.out.println("ExportPrivateKeyNoPwd: loading keychains...");
+        ks.load(null, null);
+
+        System.out.println("ExportPrivateKeyNoPwd: exporting key...");
+        Key key = ks.getKey(alias, null);
+        if (key instanceof PrivateKey) {
+            System.out.println("ExportPrivateKeyNoPwd: exported " +
+                key.getAlgorithm() + " private key from '" + alias + "'");
+        } else {
+            throw new Exception("Error exporting private key from keychain");
+        }
+    }
+}
+
--- a/jdk/test/sun/security/tools/keytool/ListKeychainStore.sh	Wed Jul 05 20:05:31 2017 +0200
+++ b/jdk/test/sun/security/tools/keytool/ListKeychainStore.sh	Wed Jul 05 20:06:12 2017 +0200
@@ -22,7 +22,7 @@
 #
 
 # @test
-# @bug 7133495 8041740
+# @bug 7133495 8041740 8062264
 # @summary [macosx] KeyChain KeyStore implementation retrieves only one private key entry
 
 if [ "${TESTJAVA}" = "" ] ; then
@@ -30,6 +30,9 @@
     TESTJAVA=`dirname $JAVAC_CMD`/..
 fi
 
+if [ "${TESTSRC}" = "" ] ; then
+    TESTSRC="."
+fi
 if [ "${TESTCLASSES}" = "" ] ; then
     TESTCLASSES=`pwd`
 fi
@@ -59,10 +62,6 @@
 COUNT=`$KEYTOOL -list | grep PrivateKeyEntry | wc -l`
 echo "Found $COUNT private key entries in the Keychain keystores"
 
-if [ $COUNT -gt 1 ]; then
-    exit 0
-fi
-
 # Create a temporary PKCS12 keystore containing 3 public/private keypairs
 
 RESULT=`$CLEANUP_P12`
@@ -107,8 +106,9 @@
 echo "Unlocked the temporary keychain"
 
 # Import the keypairs from the PKCS12 keystore into the keychain
+# (The '-A' option is used to lower the temporary keychain's access controls)
 
-security import $TEMPORARY_P12 -k $TEMPORARY_KC -f pkcs12 -P $PWD
+security import $TEMPORARY_P12 -k $TEMPORARY_KC -f pkcs12 -P $PWD -A
 if [ $? -ne 0 ]; then
     echo "Error: cannot import keypairs from PKCS12 keystore into the keychain"
     RESULT=`$CLEANUP_P12`
@@ -128,26 +128,39 @@
 
 # Recount the number of private key entries in the Keychain keystores
 
-COUNT=`$KEYTOOL -list | grep PrivateKeyEntry | wc -l`
-echo "Found $COUNT private key entries in the Keychain keystore"
-if [ $COUNT -lt 3 ]; then
-    echo "Error: expected >2 private key entries in the Keychain keystores"
+RECOUNT=`$KEYTOOL -list | grep PrivateKeyEntry | wc -l`
+echo "Found $RECOUNT private key entries in the Keychain keystore"
+if [ $RECOUNT -lt `expr $COUNT + 3` ]; then
+    echo "Error: expected >$COUNT private key entries in the Keychain keystores"
     RESULT=`$CLEANUP_P12`
     RESULT=`$CLEANUP_KC`
     exit 5
 fi
 
+# Export a private key from the keychain (without supplying a password)
+# Access controls have already been lowered (see 'security import ... -A' above)
+
+${TESTJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d . ${TESTSRC}/ExportPrivateKeyNoPwd.java || exit 6
+echo | ${TESTJAVA}/bin/java ${TESTVMOPTS} ExportPrivateKeyNoPwd x
+if [ $? -ne 0 ]; then
+    echo "Error exporting private key from the temporary keychain"
+    RESULT=`$CLEANUP_P12`
+    RESULT=`$CLEANUP_KC`
+    exit 6
+fi
+echo "Exported a private key from the temporary keychain"
+
 RESULT=`$CLEANUP_P12`
 if [ $? -ne 0 ]; then
     echo "Error: cannot remove the temporary PKCS12 keystore"
-    exit 6
+    exit 7
 fi
 echo "Removed the temporary PKCS12 keystore"
 
 RESULT=`$CLEANUP_KC`
 if [ $? -ne 0 ]; then
     echo "Error: cannot remove the temporary keychain"
-    exit 7
+    exit 8
 fi
 echo "Removed the temporary keychain"
 
--- a/langtools/.hgtags	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/.hgtags	Wed Jul 05 20:06:12 2017 +0200
@@ -279,3 +279,4 @@
 e18407fcede818b30709913784cb6b904030531d jdk9-b34
 b8e7bbdd806465a916e64413c283075ceb0a782c jdk9-b35
 c536541235e566701ff772700c15de14b75e2979 jdk9-b36
+478972d90f7bf5002615c5b2fb1ec3e0338fcadd jdk9-b37
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/JavacFileManager.java	Wed Jul 05 20:06:12 2017 +0200
@@ -76,6 +76,7 @@
  */
 public class JavacFileManager extends BaseFileManager implements StandardJavaFileManager {
 
+    @SuppressWarnings("cast")
     public static char[] toArray(CharBuffer buffer) {
         if (buffer.hasArray())
             return ((CharBuffer)buffer.compact().flip()).array();
@@ -129,6 +130,8 @@
         if (register)
             context.put(JavaFileManager.class, this);
         setContext(context);
+        if (System.getProperty("show.fm.open.close") != null)
+            System.err.println("JavacFileManager.open " + this.hashCode());
     }
 
     /**
@@ -570,6 +573,8 @@
      */
     @DefinedBy(Api.COMPILER)
     public void close() {
+        if (System.getProperty("show.fm.open.close") != null)
+            System.err.println("JavacFileManager.close " + this.hashCode());
         for (Iterator<Archive> i = archives.values().iterator(); i.hasNext(); ) {
             Archive a = i.next();
             i.remove();
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/CRTable.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/CRTable.java	Wed Jul 05 20:06:12 2017 +0200
@@ -517,6 +517,13 @@
             result = sr;
         }
 
+        @Override
+        public void visitTypeUnion(JCTypeUnion tree) {
+            SourceRange sr = new SourceRange(startPos(tree), endPos(tree));
+            sr.mergeWith(csp(tree.alternatives));
+            result = sr;
+        }
+
         public void visitWildcard(JCWildcard tree) {
             result = null;
         }
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/BaseFileManager.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/BaseFileManager.java	Wed Jul 05 20:06:12 2017 +0200
@@ -235,6 +235,7 @@
             return encName;
     }
 
+    @SuppressWarnings("cast")
     public CharBuffer decode(ByteBuffer inbuf, boolean ignoreEncodingErrors) {
         String encodingName = getEncodingName();
         CharsetDecoder decoder;
@@ -315,6 +316,7 @@
      * @return a byte buffer containing the contents of the stream
      * @throws IOException if an error occurred while reading the stream
      */
+    @SuppressWarnings("cast")
     public ByteBuffer makeByteBuffer(InputStream in)
         throws IOException {
         int limit = in.available();
@@ -343,6 +345,7 @@
     /**
      * A single-element cache of direct byte buffers.
      */
+    @SuppressWarnings("cast")
     private static class ByteBufferCache {
         private ByteBuffer cached;
         ByteBuffer get(int capacity) {
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Start.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Start.java	Wed Jul 05 20:06:12 2017 +0200
@@ -88,6 +88,9 @@
      */
     private boolean apiMode;
 
+    private JavaFileManager fileManager;
+    private boolean closeFileManagerOnExit;
+
     Start(String programName,
           PrintWriter errWriter,
           PrintWriter warnWriter,
@@ -239,6 +242,12 @@
             messager.error(Messager.NOPOS, "main.fatal.exception");
             failed = true;
         } finally {
+            if (fileManager != null && closeFileManagerOnExit) {
+                try {
+                    fileManager.close();
+                } catch (IOException ignore) {
+                }
+            }
             messager.exitNotice();
             messager.flush();
         }
@@ -270,7 +279,8 @@
         }
 
 
-        JavaFileManager fileManager = context.get(JavaFileManager.class);
+        fileManager = context.get(JavaFileManager.class);
+
         setDocletInvoker(docletClass, fileManager, argv);
 
         compOpts = Options.instance(context);
@@ -333,6 +343,7 @@
         if (fileManager == null) {
             JavacFileManager.preRegister(context);
             fileManager = context.get(JavaFileManager.class);
+            closeFileManagerOnExit = true;
         }
         if (fileManager instanceof BaseFileManager) {
             ((BaseFileManager) fileManager).handleOptions(fileManagerOpts);
--- a/langtools/test/tools/all/RunCodingRules.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/all/RunCodingRules.java	Wed Jul 05 20:06:12 2017 +0200
@@ -77,41 +77,42 @@
         }
 
         JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = javaCompiler.getStandardFileManager(null, null, null);
-        DiagnosticListener<JavaFileObject> noErrors = diagnostic -> {
-            Assert.check(diagnostic.getKind() != Diagnostic.Kind.ERROR, diagnostic.toString());
-        };
+        try (StandardJavaFileManager fm = javaCompiler.getStandardFileManager(null, null, null)) {
+            DiagnosticListener<JavaFileObject> noErrors = diagnostic -> {
+                Assert.check(diagnostic.getKind() != Diagnostic.Kind.ERROR, diagnostic.toString());
+            };
 
-        List<File> crulesFiles = Files.walk(crulesDir)
-                                      .filter(entry -> entry.getFileName().toString().endsWith(".java"))
-                                      .filter(entry -> entry.getParent().endsWith("crules"))
-                                      .map(entry -> entry.toFile())
-                                      .collect(Collectors.toList());
+            List<File> crulesFiles = Files.walk(crulesDir)
+                                          .filter(entry -> entry.getFileName().toString().endsWith(".java"))
+                                          .filter(entry -> entry.getParent().endsWith("crules"))
+                                          .map(entry -> entry.toFile())
+                                          .collect(Collectors.toList());
 
-        Path crulesTarget = targetDir.resolve("crules");
-        Files.createDirectories(crulesTarget);
-        List<String> crulesOptions = Arrays.asList("-d", crulesTarget.toString());
-        javaCompiler.getTask(null, fm, noErrors, crulesOptions, null,
-                fm.getJavaFileObjectsFromFiles(crulesFiles)).call();
-        Path registration = crulesTarget.resolve("META-INF/services/com.sun.source.util.Plugin");
-        Files.createDirectories(registration.getParent());
-        try (Writer metaInfServices = Files.newBufferedWriter(registration, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
-            metaInfServices.write("crules.CodingRulesAnalyzerPlugin\n");
-        }
+            Path crulesTarget = targetDir.resolve("crules");
+            Files.createDirectories(crulesTarget);
+            List<String> crulesOptions = Arrays.asList("-d", crulesTarget.toString());
+            javaCompiler.getTask(null, fm, noErrors, crulesOptions, null,
+                    fm.getJavaFileObjectsFromFiles(crulesFiles)).call();
+            Path registration = crulesTarget.resolve("META-INF/services/com.sun.source.util.Plugin");
+            Files.createDirectories(registration.getParent());
+            try (Writer metaInfServices = Files.newBufferedWriter(registration, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
+                metaInfServices.write("crules.CodingRulesAnalyzerPlugin\n");
+            }
 
-        List<File> sources = sourceDirs.stream()
-                                       .flatMap(dir -> silentFilesWalk(dir))
-                                       .filter(entry -> entry.getFileName().toString().endsWith(".java"))
-                                       .map(p -> p.toFile())
-                                       .collect(Collectors.toList());
+            List<File> sources = sourceDirs.stream()
+                                           .flatMap(dir -> silentFilesWalk(dir))
+                                           .filter(entry -> entry.getFileName().toString().endsWith(".java"))
+                                           .map(p -> p.toFile())
+                                           .collect(Collectors.toList());
 
-        Path sourceTarget = targetDir.resolve("classes");
-        Files.createDirectories(sourceTarget);
-        String processorPath = crulesTarget.toString() + File.pathSeparator + crulesDir.toString();
-        List<String> options = Arrays.asList("-d", sourceTarget.toString(),
-                "-processorpath", processorPath, "-Xplugin:coding_rules");
-        javaCompiler.getTask(null, fm, noErrors, options, null,
-                fm.getJavaFileObjectsFromFiles(sources)).call();
+            Path sourceTarget = targetDir.resolve("classes");
+            Files.createDirectories(sourceTarget);
+            String processorPath = crulesTarget.toString() + File.pathSeparator + crulesDir.toString();
+            List<String> options = Arrays.asList("-d", sourceTarget.toString(),
+                    "-processorpath", processorPath, "-Xplugin:coding_rules");
+            javaCompiler.getTask(null, fm, noErrors, options, null,
+                    fm.getJavaFileObjectsFromFiles(sources)).call();
+        }
     }
 
     Stream<Path> silentFilesWalk(Path dir) throws IllegalStateException {
--- a/langtools/test/tools/javac/6341866/T6341866.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/6341866/T6341866.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -113,58 +113,59 @@
 
         JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
         MyDiagListener dl = new MyDiagListener();
-        StandardJavaFileManager fm = javac.getStandardFileManager(dl, null, null);
+        try (StandardJavaFileManager fm = javac.getStandardFileManager(dl, null, null)) {
 
-        // Note: class A references class B, so compile A if we want implicit compilation
-        File file =  (implicitType != ImplicitType.NONE) ? a_java : b_java;
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(file);
-
-        //System.err.println("compile: " + opts + " " + files);
+            // Note: class A references class B, so compile A if we want implicit compilation
+            File file =  (implicitType != ImplicitType.NONE) ? a_java : b_java;
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(file);
 
-        boolean ok = javac.getTask(null, fm, dl, opts, null, files).call();
-        if (!ok) {
-            error("compilation failed");
-            return false;
-        }
+            //System.err.println("compile: " + opts + " " + files);
 
-        // check implicit compilation results if necessary
-        if (implicitType != ImplicitType.NONE) {
-            boolean expectClass = (implicitType != ImplicitType.OPT_NONE);
-            if (b_class.exists() != expectClass) {
-                if (b_class.exists())
-                    error("B implicitly compiled unexpectedly");
-                else
-                    error("B not impliictly compiled");
+            boolean ok = javac.getTask(null, fm, dl, opts, null, files).call();
+            if (!ok) {
+                error("compilation failed");
                 return false;
             }
-        }
+
+            // check implicit compilation results if necessary
+            if (implicitType != ImplicitType.NONE) {
+                boolean expectClass = (implicitType != ImplicitType.OPT_NONE);
+                if (b_class.exists() != expectClass) {
+                    if (b_class.exists())
+                        error("B implicitly compiled unexpectedly");
+                    else
+                        error("B not impliictly compiled");
+                    return false;
+                }
+            }
 
-        // check message key results
-        String expectKey = null;
-        if (implicitType == ImplicitType.OPT_UNSET) {
-            switch (annoType) {
-            case SERVICE:
-                expectKey = "compiler.warn.proc.use.proc.or.implicit";
-                break;
-            case SPECIFY:
-                expectKey = "compiler.warn.proc.use.implicit";
-                break;
+            // check message key results
+            String expectKey = null;
+            if (implicitType == ImplicitType.OPT_UNSET) {
+                switch (annoType) {
+                case SERVICE:
+                    expectKey = "compiler.warn.proc.use.proc.or.implicit";
+                    break;
+                case SPECIFY:
+                    expectKey = "compiler.warn.proc.use.implicit";
+                    break;
+                }
             }
+
+            if (expectKey == null) {
+                if (dl.diagCodes.size() != 0) {
+                    error("no diagnostics expected");
+                    return false;
+                }
+            } else {
+                if (!(dl.diagCodes.size() == 1 && dl.diagCodes.get(0).equals(expectKey))) {
+                    error("unexpected diagnostics generated");
+                    return false;
+                }
+            }
+
+            return true;
         }
-
-        if (expectKey == null) {
-            if (dl.diagCodes.size() != 0) {
-                error("no diagnostics expected");
-                return false;
-            }
-        } else {
-            if (!(dl.diagCodes.size() == 1 && dl.diagCodes.get(0).equals(expectKey))) {
-                error("unexpected diagnostics generated");
-                return false;
-            }
-        }
-
-        return true;
     }
 
     static void createProcessorServices(String name) throws IOException {
--- a/langtools/test/tools/javac/6400872/T6400872.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/6400872/T6400872.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -58,8 +58,7 @@
                 throws IOException {
         System.err.println("compile...");
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
-        try {
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
             Iterable<? extends JavaFileObject> fileObjects =
                 fm.getJavaFileObjectsFromFiles(Arrays.asList(files));
 
@@ -78,8 +77,6 @@
                 compiler.getTask(null, fm, null, options, null, fileObjects);
             if (!task.call())
                 throw new AssertionError("compilation failed");
-        } finally {
-            fm.close();
         }
     }
 
--- a/langtools/test/tools/javac/6402516/Checker.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/6402516/Checker.java	Wed Jul 05 20:06:12 2017 +0200
@@ -54,25 +54,26 @@
         };
 
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(getFiles(testSrc, fileNames));
-        task = tool.getTask(null, fm, dl, null, null, files);
-        Iterable<? extends CompilationUnitTree> units = task.parse();
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(getFiles(testSrc, fileNames));
+            task = tool.getTask(null, fm, dl, null, null, files);
+            Iterable<? extends CompilationUnitTree> units = task.parse();
 
-        if (errors)
-            throw new AssertionError("errors occurred creating trees");
+            if (errors)
+                throw new AssertionError("errors occurred creating trees");
 
-        ScopeScanner s = new ScopeScanner();
-        for (CompilationUnitTree unit: units) {
-            TreePath p = new TreePath(unit);
-            s.scan(p, getTrees());
-            additionalChecks(getTrees(), unit);
+            ScopeScanner s = new ScopeScanner();
+            for (CompilationUnitTree unit: units) {
+                TreePath p = new TreePath(unit);
+                s.scan(p, getTrees());
+                additionalChecks(getTrees(), unit);
+            }
+            task = null;
+
+            if (errors)
+                throw new AssertionError("errors occurred checking scopes");
         }
-        task = null;
-
-        if (errors)
-            throw new AssertionError("errors occurred checking scopes");
     }
 
     // default impl: split ref at ";" and call checkLocal(scope, ref_segment) on scope and its enclosing scopes
--- a/langtools/test/tools/javac/6440583/T6440583.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/6440583/T6440583.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -40,30 +40,31 @@
         String testSrc = System.getProperty("test.src", ".");
         String testClasses = System.getProperty("test.classes", ".");
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "A.java")));
-        JavacTask task = tool.getTask(null, fm, null, null, null, files);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "A.java")));
+            JavacTask task = tool.getTask(null, fm, null, null, null, files);
 
-        Iterable<? extends Tree> trees = task.parse();
+            Iterable<? extends Tree> trees = task.parse();
 
-        TreeScanner<Boolean,Void> checker = new TreeScanner<Boolean,Void>() {
-            public Boolean visitErroneous(ErroneousTree tree, Void ignore) {
-                JCErroneous etree = (JCErroneous) tree;
-                List<? extends Tree> errs = etree.getErrorTrees();
-                System.err.println("errs: " + errs);
-                if (errs == null || errs.size() == 0)
-                    throw new AssertionError("no error trees found");
-                found = true;
-                return true;
-            }
-        };
+            TreeScanner<Boolean,Void> checker = new TreeScanner<Boolean,Void>() {
+                public Boolean visitErroneous(ErroneousTree tree, Void ignore) {
+                    JCErroneous etree = (JCErroneous) tree;
+                    List<? extends Tree> errs = etree.getErrorTrees();
+                    System.err.println("errs: " + errs);
+                    if (errs == null || errs.size() == 0)
+                        throw new AssertionError("no error trees found");
+                    found = true;
+                    return true;
+                }
+            };
 
-        for (Tree tree: trees)
-            checker.scan(tree, null);
+            for (Tree tree: trees)
+                checker.scan(tree, null);
 
-        if (!found)
-            throw new AssertionError("no ErroneousTree nodes found");
+            if (!found)
+                throw new AssertionError("no ErroneousTree nodes found");
+        }
     }
 
     private static boolean found;
--- a/langtools/test/tools/javac/6902720/Test.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/6902720/Test.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -54,38 +54,39 @@
 
     void test(File test) throws Exception {
         JavacTool tool1 = JavacTool.create();
-        StandardJavaFileManager fm = tool1.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(test);
+        try (StandardJavaFileManager fm = tool1.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(test);
 
-        // parse test file into a tree, and write it out to a stringbuffer using Pretty
-        JavacTask t1 = tool1.getTask(null, fm, null, null, null, files);
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        Iterable<? extends CompilationUnitTree> trees = t1.parse();
-        for (CompilationUnitTree tree: trees) {
-            new Pretty(pw, true).printExpr((JCTree) tree);
-        }
-        pw.close();
+            // parse test file into a tree, and write it out to a stringbuffer using Pretty
+            JavacTask t1 = tool1.getTask(null, fm, null, null, null, files);
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            Iterable<? extends CompilationUnitTree> trees = t1.parse();
+            for (CompilationUnitTree tree: trees) {
+                new Pretty(pw, true).printExpr((JCTree) tree);
+            }
+            pw.close();
 
-        final String out = sw.toString();
-        System.err.println("generated code:\n" + out + "\n");
+            final String out = sw.toString();
+            System.err.println("generated code:\n" + out + "\n");
 
-        // verify the generated code is valid Java by compiling it
-        JavacTool tool2 = JavacTool.create();
-        JavaFileObject fo = new SimpleJavaFileObject(URI.create("output"), JavaFileObject.Kind.SOURCE) {
-            @Override
-            public CharSequence getCharContent(boolean ignoreEncodingErrors) {
-                return out;
-            }
-        };
-        JavacTask t2 = tool2.getTask(null, fm, null, null, null, Collections.singleton(fo));
-        boolean ok = t2.call();
-        if (!ok)
-            throw new Exception("compilation of generated code failed");
+            // verify the generated code is valid Java by compiling it
+            JavacTool tool2 = JavacTool.create();
+            JavaFileObject fo = new SimpleJavaFileObject(URI.create("output"), JavaFileObject.Kind.SOURCE) {
+                @Override
+                public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+                    return out;
+                }
+            };
+            JavacTask t2 = tool2.getTask(null, fm, null, null, null, Collections.singleton(fo));
+            boolean ok = t2.call();
+            if (!ok)
+                throw new Exception("compilation of generated code failed");
 
-        File expectedClass = new File(test.getName().replace(".java", ".class"));
-        if (!expectedClass.exists())
-            throw new Exception(expectedClass + " not found");
+            File expectedClass = new File(test.getName().replace(".java", ".class"));
+            if (!expectedClass.exists())
+                throw new Exception(expectedClass + " not found");
+        }
     }
 }
 
--- a/langtools/test/tools/javac/7003595/T7003595.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/7003595/T7003595.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -49,9 +49,6 @@
 
     /** global decls ***/
 
-    // Create a single file manager and reuse it for each compile to save time.
-    static StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
-
     //statistics
     static int checkCount = 0;
 
@@ -112,15 +109,18 @@
     }
 
     public static void main(String... args) throws Exception {
-        for (ClassKind ck1 : ClassKind.values()) {
-            String cname1 = "C1";
-            for (ClassKind ck2 : ClassKind.values()) {
-                if (!ck1.isAllowed(ck2)) continue;
-                String cname2 = "C2";
-                for (ClassKind ck3 : ClassKind.values()) {
-                    if (!ck2.isAllowed(ck3)) continue;
-                    String cname3 = "C3";
-                    new T7003595(new ClassKind[] {ck1, ck2, ck3}, new String[] { cname1, cname2, cname3 }).compileAndCheck();
+        // Create a single file manager and reuse it for each compile to save time.
+        try (StandardJavaFileManager fm = JavacTool.create().getStandardFileManager(null, null, null)) {
+            for (ClassKind ck1 : ClassKind.values()) {
+                String cname1 = "C1";
+                for (ClassKind ck2 : ClassKind.values()) {
+                    if (!ck1.isAllowed(ck2)) continue;
+                    String cname2 = "C2";
+                    for (ClassKind ck3 : ClassKind.values()) {
+                        if (!ck2.isAllowed(ck3)) continue;
+                        String cname3 = "C3";
+                        new T7003595(fm, new ClassKind[] {ck1, ck2, ck3}, new String[] { cname1, cname2, cname3 }).compileAndCheck();
+                    }
                 }
             }
         }
@@ -132,8 +132,10 @@
 
     ClassKind[] cks;
     String[] cnames;
+    StandardJavaFileManager fm;
 
-    T7003595(ClassKind[] cks, String[] cnames) {
+    T7003595(StandardJavaFileManager fm, ClassKind[] cks, String[] cnames) {
+        this.fm = fm;
         this.cks = cks;
         this.cnames = cnames;
     }
--- a/langtools/test/tools/javac/7079713/TestCircularClassfile.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/7079713/TestCircularClassfile.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -100,13 +100,14 @@
 
     public static void main(String... args) throws Exception {
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
-        int count = 0;
-        for (SourceKind sk1 : SourceKind.values()) {
-            for (SourceKind sk2 : SourceKind.values()) {
-                for (TestKind tk : TestKind.values()) {
-                    for (ClientKind ck : ClientKind.values()) {
-                        new TestCircularClassfile("sub_"+count++, sk1, sk2, tk, ck).check(comp, fm);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
+            int count = 0;
+            for (SourceKind sk1 : SourceKind.values()) {
+                for (SourceKind sk2 : SourceKind.values()) {
+                    for (TestKind tk : TestKind.values()) {
+                        for (ClientKind ck : ClientKind.values()) {
+                            new TestCircularClassfile("sub_"+count++, sk1, sk2, tk, ck).check(comp, fm);
+                        }
                     }
                 }
             }
--- a/langtools/test/tools/javac/7142086/T7142086.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/7142086/T7142086.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -96,10 +96,11 @@
     void run(List<JavaFileObject> sources) throws Exception {
         DiagnosticChecker dc = new DiagnosticChecker();
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
-        JavacTask ct = (JavacTask)comp.getTask(null, fm, dc,
-                null, null, sources);
-        ct.analyze();
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
+            JavacTask ct = (JavacTask)comp.getTask(null, fm, dc,
+                    null, null, sources);
+            ct.analyze();
+        }
     }
 
     static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
--- a/langtools/test/tools/javac/NoStringToLower.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/NoStringToLower.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -54,31 +54,32 @@
      */
     boolean run(String... args) throws Exception {
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        JavaFileManager fm = c.getStandardFileManager(null, null, null);
-        JavaFileManager.Location javacLoc = findJavacLocation(fm);
-        String[] pkgs = {
-            "javax.annotation.processing",
-            "javax.lang.model",
-            "javax.tools",
-            "com.sun.source",
-            "com.sun.tools.classfile",
-            "com.sun.tools.doclet",
-            "com.sun.tools.doclint",
-            "com.sun.tools.javac",
-            "com.sun.tools.javadoc",
-            "com.sun.tools.javah",
-            "com.sun.tools.javap",
-            "com.sun.tools.jdeps",
-            "com.sun.tools.sjavac"
-        };
-        for (String pkg: pkgs) {
-            for (JavaFileObject fo: fm.list(javacLoc,
-                    pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) {
-                scan(fo);
+        try (JavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            JavaFileManager.Location javacLoc = findJavacLocation(fm);
+            String[] pkgs = {
+                "javax.annotation.processing",
+                "javax.lang.model",
+                "javax.tools",
+                "com.sun.source",
+                "com.sun.tools.classfile",
+                "com.sun.tools.doclet",
+                "com.sun.tools.doclint",
+                "com.sun.tools.javac",
+                "com.sun.tools.javadoc",
+                "com.sun.tools.javah",
+                "com.sun.tools.javap",
+                "com.sun.tools.jdeps",
+                "com.sun.tools.sjavac"
+            };
+            for (String pkg: pkgs) {
+                for (JavaFileObject fo: fm.list(javacLoc,
+                        pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) {
+                    scan(fo);
+                }
             }
+
+            return (errors == 0);
         }
-
-        return (errors == 0);
     }
 
     // depending on how the test is run, javac may be on bootclasspath or classpath
--- a/langtools/test/tools/javac/Paths/6638501/JarFromManifestFailure.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/Paths/6638501/JarFromManifestFailure.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -71,28 +71,29 @@
         }
     }
 
-    static void compile(File classOutDir, Iterable<File> classPath, File... files) {
+    static void compile(File classOutDir, Iterable<File> classPath, File... files) throws IOException {
         System.err.println("compile...");
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> fileObjects =
-                    fm.getJavaFileObjectsFromFiles(Arrays.asList(files));
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> fileObjects =
+                        fm.getJavaFileObjectsFromFiles(Arrays.asList(files));
 
-        List<String> options = new ArrayList<String>();
-        if (classOutDir != null) {
-            options.add("-d");
-            options.add(classOutDir.getPath());
+            List<String> options = new ArrayList<String>();
+            if (classOutDir != null) {
+                options.add("-d");
+                options.add(classOutDir.getPath());
+            }
+            if (classPath != null) {
+                options.add("-classpath");
+                options.add(join(classPath, File.pathSeparator));
+            }
+            options.add("-verbose");
+
+            JavaCompiler.CompilationTask task =
+                compiler.getTask(null, fm, null, options, null, fileObjects);
+            if (!task.call())
+                throw new AssertionError("compilation failed");
         }
-        if (classPath != null) {
-            options.add("-classpath");
-            options.add(join(classPath, File.pathSeparator));
-        }
-        options.add("-verbose");
-
-        JavaCompiler.CompilationTask task =
-            compiler.getTask(null, fm, null, options, null, fileObjects);
-        if (!task.call())
-            throw new AssertionError("compilation failed");
     }
 
     static void jar(File jar, Iterable<File> classPath, File base, File... files)
--- a/langtools/test/tools/javac/Paths/TestCompileJARInClassPath.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/Paths/TestCompileJARInClassPath.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -116,17 +116,18 @@
 
         javax.tools.JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
         DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
-        StandardJavaFileManager stdFileManager = javac.getStandardFileManager(diagnostics, null, null);
+        try (StandardJavaFileManager stdFileManager = javac.getStandardFileManager(diagnostics, null, null)) {
 
-        List<File> files = new ArrayList<>();
-        files.add(clientJarFile);
+            List<File> files = new ArrayList<>();
+            files.add(clientJarFile);
 
-        stdFileManager.setLocation(StandardLocation.CLASS_PATH, files);
+            stdFileManager.setLocation(StandardLocation.CLASS_PATH, files);
+
+            Iterable<? extends JavaFileObject> sourceFiles = stdFileManager.getJavaFileObjects(sourceFileToCompile);
 
-        Iterable<? extends JavaFileObject> sourceFiles = stdFileManager.getJavaFileObjects(sourceFileToCompile);
-
-        if (!javac.getTask(null, stdFileManager, diagnostics, null, null, sourceFiles).call()) {
-            throw new AssertionError("compilation failed");
+            if (!javac.getTask(null, stdFileManager, diagnostics, null, null, sourceFiles).call()) {
+                throw new AssertionError("compilation failed");
+            }
         }
     }
 }
--- a/langtools/test/tools/javac/T6265400.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6265400.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -44,10 +44,11 @@
                         throw new NullPointerException(SILLY_BILLY);
                     }
                 };
-            StandardJavaFileManager fm = javac.getStandardFileManager(dl, null, null);
-            Iterable<? extends JavaFileObject> files =
-                fm.getJavaFileObjectsFromStrings(Arrays.asList("badfile.java"));
-            javac.getTask(null, fm, dl, null, null, files).call();
+            try (StandardJavaFileManager fm = javac.getStandardFileManager(dl, null, null)) {
+                Iterable<? extends JavaFileObject> files =
+                    fm.getJavaFileObjectsFromStrings(Arrays.asList("badfile.java"));
+                javac.getTask(null, fm, dl, null, null, files).call();
+            }
         }
         catch (RuntimeException e) {
             Throwable cause = e.getCause();
--- a/langtools/test/tools/javac/T6340549.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6340549.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -44,13 +44,14 @@
 
         try {
             JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-            StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null);
-            jfm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(new File(".")));
+            try (StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null)) {
+                jfm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(new File(".")));
 
-            for (JavaFileObject jfo : jfm.list(StandardLocation.CLASS_PATH,
-                    "", EnumSet.of(Kind.OTHER), false)) {
-                if (new File(jfo.getName()).isDirectory()) {
-                    throw new AssertionError("Found directory: " + jfo);
+                for (JavaFileObject jfo : jfm.list(StandardLocation.CLASS_PATH,
+                        "", EnumSet.of(Kind.OTHER), false)) {
+                    if (new File(jfo.getName()).isDirectory()) {
+                        throw new AssertionError("Found directory: " + jfo);
+                    }
                 }
             }
         } finally {
--- a/langtools/test/tools/javac/T6351767.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6351767.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -38,52 +38,52 @@
     public static void main(String... args) throws Exception {
 
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        JavaFileManager jfm = compiler.getStandardFileManager(null, null, null);
+        try (JavaFileManager jfm = compiler.getStandardFileManager(null, null, null)) {
 
-        // test null
-        try {
-            jfm.list(StandardLocation.SOURCE_PATH, null, EnumSet.of(Kind.SOURCE), false);
-            error("NPE not thrown");
-        }
-        catch (NullPointerException e) {
-            // expected
-        }
+            // test null
+            try {
+                jfm.list(StandardLocation.SOURCE_PATH, null, EnumSet.of(Kind.SOURCE), false);
+                error("NPE not thrown");
+            }
+            catch (NullPointerException e) {
+                // expected
+            }
 
-        // test null fileKinds
-        try {
-            jfm.list(StandardLocation.SOURCE_PATH, "", null, false);
-            error("NPE not thrown");
-        }
-        catch (NullPointerException e) {
-            // expected
-        }
+            // test null fileKinds
+            try {
+                jfm.list(StandardLocation.SOURCE_PATH, "", null, false);
+                error("NPE not thrown");
+            }
+            catch (NullPointerException e) {
+                // expected
+            }
 
-        // test good package
-        boolean found = false;
-        for (JavaFileObject jfo : jfm.list(StandardLocation.PLATFORM_CLASS_PATH,
-                                           "java.lang",
-                                           EnumSet.of(Kind.CLASS),
-                                           false)) {
-            System.err.println("found " + jfo.toUri());
-            if (jfo.isNameCompatible("Object", Kind.CLASS))
-                found = true;
-        }
-        if (!found)
-            error("expected file, java/lang/Object.class, not found");
+            // test good package
+            boolean found = false;
+            for (JavaFileObject jfo : jfm.list(StandardLocation.PLATFORM_CLASS_PATH,
+                                               "java.lang",
+                                               EnumSet.of(Kind.CLASS),
+                                               false)) {
+                System.err.println("found " + jfo.toUri());
+                if (jfo.isNameCompatible("Object", Kind.CLASS))
+                    found = true;
+            }
+            if (!found)
+                error("expected file, java/lang/Object.class, not found");
 
-        found = false;
-        // test good package (VM name)
-        for (JavaFileObject jfo : jfm.list(StandardLocation.PLATFORM_CLASS_PATH,
-                                           "java/lang",
-                                           EnumSet.of(Kind.CLASS),
-                                           false)) {
-            System.err.println("found " + jfo.toUri());
-            if (jfo.isNameCompatible("Object", Kind.CLASS))
-                found = true;
+            found = false;
+            // test good package (VM name)
+            for (JavaFileObject jfo : jfm.list(StandardLocation.PLATFORM_CLASS_PATH,
+                                               "java/lang",
+                                               EnumSet.of(Kind.CLASS),
+                                               false)) {
+                System.err.println("found " + jfo.toUri());
+                if (jfo.isNameCompatible("Object", Kind.CLASS))
+                    found = true;
+            }
+            if (!found)
+                error("expected file, java/lang/Object.class, not found");
         }
-        if (!found)
-            error("expected file, java/lang/Object.class, not found");
-
     }
 
     static void error(String msg) {
--- a/langtools/test/tools/javac/T6361619.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6361619.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -57,17 +57,18 @@
             }
         };
 
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        Iterable<? extends JavaFileObject> f =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrcDir,
-                                                                  self + ".java")));
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            Iterable<? extends JavaFileObject> f =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrcDir,
+                                                                      self + ".java")));
 
-        JavacTask task = tool.getTask(out, fm, dl, flags, null, f);
-        MyTaskListener tl = new MyTaskListener(task);
-        task.setTaskListener(tl);
+            JavacTask task = tool.getTask(out, fm, dl, flags, null, f);
+            MyTaskListener tl = new MyTaskListener(task);
+            task.setTaskListener(tl);
 
-        // should complete, without exceptions
-        task.call();
+            // should complete, without exceptions
+            task.call();
+        }
     }
 
     public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv) {
--- a/langtools/test/tools/javac/T6395974.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6395974.java	Wed Jul 05 20:06:12 2017 +0200
@@ -44,24 +44,25 @@
         String testSrc = System.getProperty("test.src");
 
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        Iterable<?extends JavaFileObject> f =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, self + ".java")));
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            Iterable<?extends JavaFileObject> f =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, self + ".java")));
 
-        PrintWriter out = new PrintWriter(System.err, true);
+            PrintWriter out = new PrintWriter(System.err, true);
 
-        JavacTaskImpl task = (JavacTaskImpl) tool.getTask(out,
-                                                          fm,
-                                                          null,
-                                                          Arrays.asList("-processor",
-                                                                        "Foo.java"),
-                                                          null,
-                                                          f);
+            JavacTaskImpl task = (JavacTaskImpl) tool.getTask(out,
+                                                              fm,
+                                                              null,
+                                                              Arrays.asList("-processor",
+                                                                            "Foo.java"),
+                                                              null,
+                                                              f);
 
-        MyTaskListener tl = new MyTaskListener();
-        task.setTaskListener(tl);
+            MyTaskListener tl = new MyTaskListener();
+            task.setTaskListener(tl);
 
-        task.call();
+            task.call();
+        }
     }
 
     static class MyTaskListener implements TaskListener {
--- a/langtools/test/tools/javac/T6397044.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6397044.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -42,14 +42,15 @@
         String srcDir = System.getProperty("test.src", ".");
         String self = T6397044.class.getName();
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files
-            = fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(srcDir, self + ".java")));
-        JavacTask task = tool.getTask(null, fm, null, null, null, files);
-        Iterable<? extends CompilationUnitTree> trees = task.parse();
-        Checker checker = new Checker();
-        for (CompilationUnitTree tree: trees)
-            checker.check(tree);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files
+                = fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(srcDir, self + ".java")));
+            JavacTask task = tool.getTask(null, fm, null, null, null, files);
+            Iterable<? extends CompilationUnitTree> trees = task.parse();
+            Checker checker = new Checker();
+            for (CompilationUnitTree tree: trees)
+                checker.check(tree);
+        }
     }
 
     public int x_public;
--- a/langtools/test/tools/javac/T6397286.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6397286.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -40,29 +40,30 @@
         String self = T6397286.class.getName();
 
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrcDir, self + ".java")));
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrcDir, self + ".java")));
 
-        JavacTask task = tool.getTask(null, fm, null, null, null, files);
-        task.setTaskListener(new TaskListener() {
-                public void started(TaskEvent e) {
-                    throw new TaskEventError(e);
-                }
-                public void finished(TaskEvent e) {
+            JavacTask task = tool.getTask(null, fm, null, null, null, files);
+            task.setTaskListener(new TaskListener() {
+                    public void started(TaskEvent e) {
+                        throw new TaskEventError(e);
+                    }
+                    public void finished(TaskEvent e) {
+                    }
+                });
+
+            try {
+                task.call();
+                throw new AssertionError("no exception thrown");
+            } catch (RuntimeException e) {
+                if (e.getCause() instanceof TaskEventError) {
+                    TaskEventError tee = (TaskEventError) e.getCause();
+                    System.err.println("Exception thrown for " + tee.event + " as expected");
+                } else {
+                    e.printStackTrace();
+                    throw new AssertionError("TaskEventError not thrown");
                 }
-            });
-
-        try {
-            task.call();
-            throw new AssertionError("no exception thrown");
-        } catch (RuntimeException e) {
-            if (e.getCause() instanceof TaskEventError) {
-                TaskEventError tee = (TaskEventError) e.getCause();
-                System.err.println("Exception thrown for " + tee.event + " as expected");
-            } else {
-                e.printStackTrace();
-                throw new AssertionError("TaskEventError not thrown");
             }
         }
     }
--- a/langtools/test/tools/javac/T6403466.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6403466.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -51,24 +51,25 @@
     public static void main(String[] args) throws IOException {
         JavacTool tool = JavacTool.create();
 
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrcDir, self + ".java")));
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrcDir, self + ".java")));
+
+            Iterable<String> options = Arrays.asList("-processorpath", testClassDir,
+                                                     "-processor", self,
+                                                     "-s", ".",
+                                                     "-d", ".");
+            JavacTask task = tool.getTask(out, fm, null, options, null, files);
 
-        Iterable<String> options = Arrays.asList("-processorpath", testClassDir,
-                                                 "-processor", self,
-                                                 "-s", ".",
-                                                 "-d", ".");
-        JavacTask task = tool.getTask(out, fm, null, options, null, files);
+            VerifyingTaskListener vtl = new VerifyingTaskListener(new File(testSrcDir, self + ".out"));
+            task.setTaskListener(vtl);
 
-        VerifyingTaskListener vtl = new VerifyingTaskListener(new File(testSrcDir, self + ".out"));
-        task.setTaskListener(vtl);
+            if (!task.call())
+                throw new AssertionError("compilation failed");
 
-        if (!task.call())
-            throw new AssertionError("compilation failed");
-
-        if (vtl.iter.hasNext() || vtl.errors)
-            throw new AssertionError("comparison against golden file failed.");
+            if (vtl.iter.hasNext() || vtl.errors)
+                throw new AssertionError("comparison against golden file failed.");
+        }
     }
 
     public boolean process(Set<? extends TypeElement> annos, RoundEnvironment rEnv) {
--- a/langtools/test/tools/javac/T6406771.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6406771.java	Wed Jul 05 20:06:12 2017 +0200
@@ -33,21 +33,22 @@
 
     // White-space after this point does not matter
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws IOException {
         String self = T6406771.class.getName();
         String testSrc = System.getProperty("test.src");
         String testClasses = System.getProperty("test.classes");
 
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        JavaFileObject f = fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, self+".java"))).iterator().next();
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            JavaFileObject f = fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, self+".java"))).iterator().next();
 
-        List<String> opts = Arrays.asList("-d", ".", "-processorpath", testClasses, "-processor", self, "-proc:only");
+            List<String> opts = Arrays.asList("-d", ".", "-processorpath", testClasses, "-processor", self, "-proc:only");
 
-        JavacTask task = tool.getTask(null, fm, null, opts, null, Arrays.asList(f));
+            JavacTask task = tool.getTask(null, fm, null, opts, null, Arrays.asList(f));
 
-        if (!task.call())
-            throw new AssertionError("failed");
+            if (!task.call())
+                throw new AssertionError("failed");
+        }
     }
 
     public boolean process(Set<? extends TypeElement> elems, RoundEnvironment rEnv) {
--- a/langtools/test/tools/javac/T6407066.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6407066.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -37,20 +37,21 @@
         String testClasses = System.getProperty("test.classes", ".");
 
         JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager jfm = tool.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager jfm = tool.getStandardFileManager(null, null, null)) {
 
-        List<File> path = new ArrayList<File>();
-        path.add(new File("BadDirectory"));
-        path.add(new File(testSrc));
-        path.add(new File("BadFile.jar"));
+            List<File> path = new ArrayList<File>();
+            path.add(new File("BadDirectory"));
+            path.add(new File(testSrc));
+            path.add(new File("BadFile.jar"));
 
-        jfm.setLocation(StandardLocation.SOURCE_PATH, path);
+            jfm.setLocation(StandardLocation.SOURCE_PATH, path);
 
-        List<File> path2  = new ArrayList<File>();
-        for (File f: jfm.getLocation(StandardLocation.SOURCE_PATH))
-            path2.add(f);
+            List<File> path2  = new ArrayList<File>();
+            for (File f: jfm.getLocation(StandardLocation.SOURCE_PATH))
+                path2.add(f);
 
-        if (!path.equals(path2))
-            throw new AssertionError("path not preserved");
+            if (!path.equals(path2))
+                throw new AssertionError("path not preserved");
+        }
     }
 }
--- a/langtools/test/tools/javac/T6410706.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6410706.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -44,21 +44,22 @@
         String testClasses = System.getProperty("test.classes", ".");
         JavacTool tool = JavacTool.create();
         MyDiagListener dl = new MyDiagListener();
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(testClasses)));
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6410706.class.getName()+".java")));
-        JavacTask task = tool.getTask(null, fm, dl, null, null, files);
-        task.parse();
-        task.analyze();
-        task.generate();
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(testClasses)));
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6410706.class.getName()+".java")));
+            JavacTask task = tool.getTask(null, fm, dl, null, null, files);
+            task.parse();
+            task.analyze();
+            task.generate();
 
-        // expect 2 notes:
-        // Note: T6410706.java uses or overrides a deprecated API.
-        // Note: Recompile with -Xlint:deprecation for details.
+            // expect 2 notes:
+            // Note: T6410706.java uses or overrides a deprecated API.
+            // Note: Recompile with -Xlint:deprecation for details.
 
-        if (dl.notes != 2)
-            throw new AssertionError(dl.notes + " notes given");
+            if (dl.notes != 2)
+                throw new AssertionError(dl.notes + " notes given");
+        }
     }
 
     private static class MyDiagListener implements DiagnosticListener<JavaFileObject>
--- a/langtools/test/tools/javac/T6458823/T6458823.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6458823/T6458823.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -55,33 +55,34 @@
         }
         DiagnosticCollector<JavaFileObject> diagColl =
             new DiagnosticCollector<JavaFileObject>();
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
-        List<String> options = new ArrayList<String>();
-        options.add("-processor");
-        options.add("MyProcessor");
-        options.add("-proc:only");
-        List<File> files = new ArrayList<File>();
-        files.add(new File(T6458823.class.getResource("TestClass.java").toURI()));
-        final CompilationTask task = compiler.getTask(null, fm, diagColl,
-            options, null, fm.getJavaFileObjectsFromFiles(files));
-        task.call();
-        int diagCount = 0;
-        for (Diagnostic<? extends JavaFileObject> diag : diagColl.getDiagnostics()) {
-            if (diag.getKind() != Diagnostic.Kind.WARNING) {
-                throw new AssertionError("Only warnings expected");
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            List<String> options = new ArrayList<String>();
+            options.add("-processor");
+            options.add("MyProcessor");
+            options.add("-proc:only");
+            List<File> files = new ArrayList<File>();
+            files.add(new File(T6458823.class.getResource("TestClass.java").toURI()));
+            final CompilationTask task = compiler.getTask(null, fm, diagColl,
+                options, null, fm.getJavaFileObjectsFromFiles(files));
+            task.call();
+            int diagCount = 0;
+            for (Diagnostic<? extends JavaFileObject> diag : diagColl.getDiagnostics()) {
+                if (diag.getKind() != Diagnostic.Kind.WARNING) {
+                    throw new AssertionError("Only warnings expected");
+                }
+                System.out.println(diag);
+                if (diag.getPosition() == Diagnostic.NOPOS) {
+                    throw new AssertionError("No position info in message");
+                }
+                if (diag.getSource() == null) {
+                    throw new AssertionError("No source info in message");
+                }
+                diagCount++;
             }
-            System.out.println(diag);
-            if (diag.getPosition() == Diagnostic.NOPOS) {
-                throw new AssertionError("No position info in message");
+            if (diagCount != 2) {
+                throw new AssertionError("unexpected number of warnings: " +
+                    diagCount + ", expected: 2");
             }
-            if (diag.getSource() == null) {
-                throw new AssertionError("No source info in message");
-            }
-            diagCount++;
-        }
-        if (diagCount != 2) {
-            throw new AssertionError("unexpected number of warnings: " +
-                diagCount + ", expected: 2");
         }
     }
 }
--- a/langtools/test/tools/javac/T6665791.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6665791.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -47,29 +47,30 @@
         write(test_java, test);
 
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager manager =
-                compiler.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> units = manager.getJavaFileObjects(test_java);
-        final StringWriter sw = new StringWriter();
-        JavacTask task = (JavacTask) compiler.getTask(sw, manager, null, null,
-                null, units);
+        try (StandardJavaFileManager manager =
+                compiler.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> units = manager.getJavaFileObjects(test_java);
+            final StringWriter sw = new StringWriter();
+            JavacTask task = (JavacTask) compiler.getTask(sw, manager, null, null,
+                    null, units);
 
-        new TreeScanner<Boolean, Void>() {
-            @Override
-            public Boolean visitClass(ClassTree arg0, Void arg1) {
-                sw.write(arg0.toString());
-                return super.visitClass(arg0, arg1);
-            }
-        }.scan(task.parse(), null);
+            new TreeScanner<Boolean, Void>() {
+                @Override
+                public Boolean visitClass(ClassTree arg0, Void arg1) {
+                    sw.write(arg0.toString());
+                    return super.visitClass(arg0, arg1);
+                }
+            }.scan(task.parse(), null);
 
-        System.out.println("output:");
-        System.out.println(sw.toString());
-        String found = sw.toString().replaceAll("\\s+", " ").trim();
-        String expect = test.replaceAll("\\s+", " ").trim();
-        if (!expect.equals(found)) {
-            System.out.println("expect: " + expect);
-            System.out.println("found:  " + found);
-            throw new Exception("unexpected output");
+            System.out.println("output:");
+            System.out.println(sw.toString());
+            String found = sw.toString().replaceAll("\\s+", " ").trim();
+            String expect = test.replaceAll("\\s+", " ").trim();
+            if (!expect.equals(found)) {
+                System.out.println("expect: " + expect);
+                System.out.println("found:  " + found);
+                throw new Exception("unexpected output");
+            }
         }
     }
 
--- a/langtools/test/tools/javac/T6705935.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6705935.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -45,46 +45,47 @@
             java_home = java_home.getParentFile();
 
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
-        //System.err.println("platform class path: " + asList(fm.getLocation(StandardLocation.PLATFORM_CLASS_PATH)));
+        try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            //System.err.println("platform class path: " + asList(fm.getLocation(StandardLocation.PLATFORM_CLASS_PATH)));
+
+            for (JavaFileObject fo: fm.list(StandardLocation.PLATFORM_CLASS_PATH,
+                                            "java.lang",
+                                            Collections.singleton(JavaFileObject.Kind.CLASS),
+                                            false)) {
+                test++;
 
-        for (JavaFileObject fo: fm.list(StandardLocation.PLATFORM_CLASS_PATH,
-                                        "java.lang",
-                                        Collections.singleton(JavaFileObject.Kind.CLASS),
-                                        false)) {
-            test++;
+                if (!(fo instanceof ZipFileObject || fo instanceof ZipFileIndexFileObject)) {
+                    System.out.println("Skip " + fo.getClass().getSimpleName() + " " + fo.getName());
+                    skip++;
+                    continue;
+                }
 
-            if (!(fo instanceof ZipFileObject || fo instanceof ZipFileIndexFileObject)) {
-                System.out.println("Skip " + fo.getClass().getSimpleName() + " " + fo.getName());
-                skip++;
-                continue;
+                //System.err.println(fo.getName());
+                String p = fo.getName();
+                int bra = p.indexOf("(");
+                int ket = p.indexOf(")");
+                //System.err.println(bra + "," + ket + "," + p.length());
+                if (bra == -1 || ket != p.length() -1)
+                    throw new Exception("unexpected path: " + p + "[" + bra + "," + ket + "," + p.length());
+                String part1 = p.substring(0, bra);
+                String part2 = p.substring(bra + 1, ket);
+                //System.err.println("[" + part1 + "|" + part2 + "]" + " " + java_home);
+                if (part1.equals(part2) || !part1.startsWith(java_home.getPath()))
+                    throw new Exception("bad path: " + p);
+
             }
 
-            //System.err.println(fo.getName());
-            String p = fo.getName();
-            int bra = p.indexOf("(");
-            int ket = p.indexOf(")");
-            //System.err.println(bra + "," + ket + "," + p.length());
-            if (bra == -1 || ket != p.length() -1)
-                throw new Exception("unexpected path: " + p + "[" + bra + "," + ket + "," + p.length());
-            String part1 = p.substring(0, bra);
-            String part2 = p.substring(bra + 1, ket);
-            //System.err.println("[" + part1 + "|" + part2 + "]" + " " + java_home);
-            if (part1.equals(part2) || !part1.startsWith(java_home.getPath()))
-                throw new Exception("bad path: " + p);
+            if (test == 0)
+                throw new Exception("no files found");
 
-        }
-
-        if (test == 0)
-            throw new Exception("no files found");
+            if (skip == 0)
+                System.out.println(test + " files found");
+            else
+                System.out.println(test + " files found, " + skip + " files skipped");
 
-        if (skip == 0)
-            System.out.println(test + " files found");
-        else
-            System.out.println(test + " files found, " + skip + " files skipped");
-
-        if (test == skip)
-            System.out.println("Warning: all files skipped; no platform classes found in zip files.");
+            if (test == skip)
+                System.out.println("Warning: all files skipped; no platform classes found in zip files.");
+        }
     }
 
     private <T> List<T> asList(Iterable<? extends T> items) {
--- a/langtools/test/tools/javac/T6900149.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6900149.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -37,14 +37,15 @@
         DiagnosticCollector<JavaFileObject> diag =
                 new DiagnosticCollector<JavaFileObject>();
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm =
-                compiler.getStandardFileManager(null, null, null);
-        File emptyFile = createTempFile("Empty.java");
-        File[] files = new File[] { emptyFile, emptyFile };
-        CompilationTask task = compiler.getTask(null, fm, diag,
-                null, null, fm.getJavaFileObjects(files));
-        if (! task.call()) {
-            throw new AssertionError("compilation failed");
+        try (StandardJavaFileManager fm =
+                compiler.getStandardFileManager(null, null, null)) {
+            File emptyFile = createTempFile("Empty.java");
+            File[] files = new File[] { emptyFile, emptyFile };
+            CompilationTask task = compiler.getTask(null, fm, diag,
+                    null, null, fm.getJavaFileObjects(files));
+            if (! task.call()) {
+                throw new AssertionError("compilation failed");
+            }
         }
     }
 
--- a/langtools/test/tools/javac/T6956462/T6956462.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6956462/T6956462.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -44,14 +44,15 @@
         if (compiler == null) {
             throw new RuntimeException("can't get javax.tools.JavaCompiler!");
         }
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
-        List<File> files = new ArrayList<File>();
-        files.add(new File(T6956462.class.getResource("TestClass.java").toURI()));
-        final CompilationTask task = compiler.getTask(null, fm, null,
-            null, null, fm.getJavaFileObjectsFromFiles(files));
-        JavacTask javacTask = (JavacTask) task;
-        for (CompilationUnitTree cu : javacTask.parse()) {
-            cu.accept(new MyVisitor(javacTask), null);
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            List<File> files = new ArrayList<File>();
+            files.add(new File(T6956462.class.getResource("TestClass.java").toURI()));
+            final CompilationTask task = compiler.getTask(null, fm, null,
+                null, null, fm.getJavaFileObjectsFromFiles(files));
+            JavacTask javacTask = (JavacTask) task;
+            for (CompilationUnitTree cu : javacTask.parse()) {
+                cu.accept(new MyVisitor(javacTask), null);
+            }
         }
     }
 
--- a/langtools/test/tools/javac/T6956638.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T6956638.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -96,34 +96,35 @@
         List<String> compileOptions = Arrays.asList("-d", classesDir.getPath());
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
         DiagnosticCollector<JavaFileObject> diagnosticCollector = new DiagnosticCollector<JavaFileObject>();
-        StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnosticCollector, null, null);
-        Iterable<? extends JavaFileObject> sourceFileObjects = fileManager.getJavaFileObjects(sourceFiles);
-        System.err.println("1- javac given java source JavaFileObjects " + sourceFileObjects);
-        JavaCompiler.CompilationTask task = compiler.getTask(compilerOutputStream, fileManager, null, compileOptions, null, sourceFileObjects);
-        JavacTask javacTask = (JavacTask) task;
+        try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnosticCollector, null, null)) {
+            Iterable<? extends JavaFileObject> sourceFileObjects = fileManager.getJavaFileObjects(sourceFiles);
+            System.err.println("1- javac given java source JavaFileObjects " + sourceFileObjects);
+            JavaCompiler.CompilationTask task = compiler.getTask(compilerOutputStream, fileManager, null, compileOptions, null, sourceFileObjects);
+            JavacTask javacTask = (JavacTask) task;
 
-        Iterable<? extends CompilationUnitTree> parsedTrees = javacTask.parse();
-        Iterable<? extends Element> analyzedTrees = javacTask.analyze();
-        Iterable<? extends JavaFileObject> generatedFiles = javacTask.generate();
+            Iterable<? extends CompilationUnitTree> parsedTrees = javacTask.parse();
+            Iterable<? extends Element> analyzedTrees = javacTask.analyze();
+            Iterable<? extends JavaFileObject> generatedFiles = javacTask.generate();
 
-        System.err.println("2- parsed:" + size(parsedTrees) + " analysed:" + size(analyzedTrees) + " generated:" + size(generatedFiles));
+            System.err.println("2- parsed:" + size(parsedTrees) + " analysed:" + size(analyzedTrees) + " generated:" + size(generatedFiles));
 
-        System.err.print("3-");
-        for (JavaFileObject f : generatedFiles)
-            System.err.print(" " + f);
-        System.err.println("");
+            System.err.print("3-");
+            for (JavaFileObject f : generatedFiles)
+                System.err.print(" " + f);
+            System.err.println("");
 
-        System.err.print("5-");
-        for (File f : classesDir.listFiles())
-            System.err.print(" " + f);
-        System.err.println("");
+            System.err.print("5-");
+            for (File f : classesDir.listFiles())
+                System.err.print(" " + f);
+            System.err.println("");
 
-        System.err.println("----");
-        System.err.println(compilerOutputStream.toString());
+            System.err.println("----");
+            System.err.println(compilerOutputStream.toString());
 
-        if (size(generatedFiles) != size(parsedTrees)) {
-            throw new Exception("wrong number of files generated: " + size(generatedFiles)
-                    + " expected: " + size(parsedTrees));
+            if (size(generatedFiles) != size(parsedTrees)) {
+                throw new Exception("wrong number of files generated: " + size(generatedFiles)
+                        + " expected: " + size(parsedTrees));
+            }
         }
     }
 
--- a/langtools/test/tools/javac/T7142672/Bug.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T7142672/Bug.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -58,28 +58,29 @@
             }
         };
 
-        StandardJavaFileManager sjfm = javac.getStandardFileManager(dl,null,null);
+        try (StandardJavaFileManager sjfm = javac.getStandardFileManager(dl,null,null)) {
 
-        List<String> opts = new ArrayList<String>();
-        opts.add("-proc:only");
-        opts.add("-processor");
-        opts.add("AnnoProcessor");
+            List<String> opts = new ArrayList<String>();
+            opts.add("-proc:only");
+            opts.add("-processor");
+            opts.add("AnnoProcessor");
 
-        boolean xxx;
+            boolean xxx;
 
-        System.err.println("\n-- " + name);
-        task2 = javac.getTask(pw, sjfm, dl, opts, Arrays.asList(name), null);
-        xxx = task2.call();
+            System.err.println("\n-- " + name);
+            task2 = javac.getTask(pw, sjfm, dl, opts, Arrays.asList(name), null);
+            xxx = task2.call();
 
-        String out = sw.toString();
-        System.err.println(out);
-        if (out.contains("Assert")) {
-            System.err.println("--Failed: Assertion failure");
-            System.exit(1);
-        }
-        if (!out.contains(expectedMsg)) {
-            System.err.println("--Failed: Expected diagnostic not found");
-            System.exit(1);
+            String out = sw.toString();
+            System.err.println(out);
+            if (out.contains("Assert")) {
+                System.err.println("--Failed: Assertion failure");
+                System.exit(1);
+            }
+            if (!out.contains(expectedMsg)) {
+                System.err.println("--Failed: Expected diagnostic not found");
+                System.exit(1);
+            }
         }
     }
 }
--- a/langtools/test/tools/javac/T7159016.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T7159016.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -45,6 +45,7 @@
 import javax.lang.model.element.TypeElement;
 import javax.tools.Diagnostic;
 import javax.tools.JavaCompiler;
+import javax.tools.StandardJavaFileManager;
 import javax.tools.ToolProvider;
 
 public class T7159016 {
@@ -58,11 +59,13 @@
             w.close();
         }
         JavaCompiler jc = ToolProvider.getSystemJavaCompiler();
-        JavaCompiler.CompilationTask task = jc.getTask(null, null, null, null, null,
-                                                       jc.getStandardFileManager(null, null, null).getJavaFileObjects(src));
-        task.setProcessors(Collections.singleton(new Proc()));
-        if (!task.call()) {
-            throw new Error("Test failed");
+        try (StandardJavaFileManager fm = jc.getStandardFileManager(null, null, null)) {
+            JavaCompiler.CompilationTask task = jc.getTask(null, fm, null, null, null,
+                                                           fm.getJavaFileObjects(src));
+            task.setProcessors(Collections.singleton(new Proc()));
+            if (!task.call()) {
+                throw new Error("Test failed");
+            }
         }
     }
 
--- a/langtools/test/tools/javac/T8003967/DetectMutableStaticFields.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T8003967/DetectMutableStaticFields.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -179,18 +179,19 @@
             ConstantPoolException,
             InvalidDescriptor {
         JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        JavaFileManager.Location location =
-                StandardLocation.locationFor(resource.getPath());
-        fm.setLocation(location, com.sun.tools.javac.util.List.of(
-                new File(resource.getPath())));
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            JavaFileManager.Location location =
+                    StandardLocation.locationFor(resource.getPath());
+            fm.setLocation(location, com.sun.tools.javac.util.List.of(
+                    new File(resource.getPath())));
 
-        for (JavaFileObject file : fm.list(location, "", EnumSet.of(CLASS), true)) {
-            String className = fm.inferBinaryName(location, file);
-            int index = className.lastIndexOf('.');
-            String pckName = index == -1 ? "" : className.substring(0, index);
-            if (shouldAnalyzePackage(pckName)) {
-                analyzeClassFile(ClassFile.read(file.openInputStream()));
+            for (JavaFileObject file : fm.list(location, "", EnumSet.of(CLASS), true)) {
+                String className = fm.inferBinaryName(location, file);
+                int index = className.lastIndexOf('.');
+                String pckName = index == -1 ? "" : className.substring(0, index);
+                if (shouldAnalyzePackage(pckName)) {
+                    analyzeClassFile(ClassFile.read(file.openInputStream()));
+                }
             }
         }
     }
--- a/langtools/test/tools/javac/T8010737/ParameterNamesAreNotCopiedToAnonymousInitTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/T8010737/ParameterNamesAreNotCopiedToAnonymousInitTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -132,73 +132,74 @@
             throws IOException {
         Assert.checkNonNull(paramsToCheck, nonNullParamPositionsMsg);
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> fos =
-                fm.getJavaFileObjectsFromFiles(
-                Arrays.asList(new File(System.getProperty("test.src"),
-                this.getClass().getName() + ".java")));
-        JavacTask task = (JavacTask) c.getTask(null, fm, null,
-                Arrays.asList("-d", System.getProperty("user.dir")), null, fos);
+        try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> fos =
+                    fm.getJavaFileObjectsFromFiles(
+                    Arrays.asList(new File(System.getProperty("test.src"),
+                    this.getClass().getName() + ".java")));
+            JavacTask task = (JavacTask) c.getTask(null, fm, null,
+                    Arrays.asList("-d", System.getProperty("user.dir")), null, fos);
+
+            BasicJavacTask impl = (BasicJavacTask)task;
+            Context context = impl.getContext();
+            final Names names = Names.instance(context);
+
+            task.addTaskListener(new TaskListener() {
 
-        BasicJavacTask impl = (BasicJavacTask)task;
-        Context context = impl.getContext();
-        final Names names = Names.instance(context);
+                @Override
+                public void started(TaskEvent e) {}
 
-        task.addTaskListener(new TaskListener() {
+                @Override
+                public void finished(TaskEvent e) {
+                    class TheTreeScanner extends TreeScanner {
+                        boolean foundAndCorrect = false;
 
-            @Override
-            public void started(TaskEvent e) {}
+                        @Override
+                        public void visitMethodDef(JCTree.JCMethodDecl tree) {
+                            ClassSymbol clazz = (ClassSymbol)tree.sym.owner;
+                            if (clazz.owner.name.toString().equals(classOwnerName) &&
+                                tree.sym.name == names.init) {
 
-            @Override
-            public void finished(TaskEvent e) {
-                class TheTreeScanner extends TreeScanner {
-                    boolean foundAndCorrect = false;
+                                int currentParamPos = 0;
+                                int paramArrayIndex = 0;
 
-                    @Override
-                    public void visitMethodDef(JCTree.JCMethodDecl tree) {
-                        ClassSymbol clazz = (ClassSymbol)tree.sym.owner;
-                        if (clazz.owner.name.toString().equals(classOwnerName) &&
-                            tree.sym.name == names.init) {
-
-                            int currentParamPos = 0;
-                            int paramArrayIndex = 0;
+                                List<VarSymbol> params = tree.sym.params;
+                                while (params.nonEmpty() && paramArrayIndex < paramsToCheck.size()) {
+                                    VarSymbol param = params.head;
+                                    if (currentParamPos == paramsToCheck.get(paramArrayIndex)) {
+                                        if (!param.name.toString()
+                                                .equals(paramNames.get(paramArrayIndex))) {
+                                            error(paramNameNotCopiedAssertionMsg);
+                                        }
+                                        paramArrayIndex++;
+                                    }
+                                    currentParamPos++;
+                                    params = params.tail;
+                                }
+                                foundAndCorrect = paramArrayIndex >= paramsToCheck.size();
+                            }
+                            super.visitMethodDef(tree);
+                        }
+                    }
 
-                            List<VarSymbol> params = tree.sym.params;
-                            while (params.nonEmpty() && paramArrayIndex < paramsToCheck.size()) {
-                                VarSymbol param = params.head;
-                                if (currentParamPos == paramsToCheck.get(paramArrayIndex)) {
-                                    if (!param.name.toString()
-                                            .equals(paramNames.get(paramArrayIndex))) {
-                                        error(paramNameNotCopiedAssertionMsg);
-                                    }
-                                    paramArrayIndex++;
-                                }
-                                currentParamPos++;
-                                params = params.tail;
-                            }
-                            foundAndCorrect = paramArrayIndex >= paramsToCheck.size();
+                    if (e.getKind() == TaskEvent.Kind.ANALYZE) {
+                        CompilationUnitTree compUnitTree = e.getCompilationUnit();
+                        boolean foundAndCorrect = false;
+                        for (Tree tree : compUnitTree.getTypeDecls()) {
+                            TheTreeScanner scanner = new TheTreeScanner();
+                            scanner.scan((JCTree) tree);
+                            foundAndCorrect = foundAndCorrect | scanner.foundAndCorrect;
                         }
-                        super.visitMethodDef(tree);
+                        if (!foundAndCorrect) {
+                            error(seekMethodNotFound);
+                        }
                     }
                 }
+            });
 
-                if (e.getKind() == TaskEvent.Kind.ANALYZE) {
-                    CompilationUnitTree compUnitTree = e.getCompilationUnit();
-                    boolean foundAndCorrect = false;
-                    for (Tree tree : compUnitTree.getTypeDecls()) {
-                        TheTreeScanner scanner = new TheTreeScanner();
-                        scanner.scan((JCTree) tree);
-                        foundAndCorrect = foundAndCorrect | scanner.foundAndCorrect;
-                    }
-                    if (!foundAndCorrect) {
-                        error(seekMethodNotFound);
-                    }
-                }
+            if (!task.call()) {
+                error(compilationFailed);
             }
-        });
-
-        if (!task.call()) {
-            error(compilationFailed);
         }
     }
 
--- a/langtools/test/tools/javac/TryWithResources/InterruptedExceptionTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/TryWithResources/InterruptedExceptionTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -117,16 +117,17 @@
 
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (XlintOption xlint : XlintOption.values()) {
-            for (SuppressLevel suppress_decl : SuppressLevel.values()) {
-                for (SuppressLevel suppress_use : SuppressLevel.values()) {
-                    for (ClassKind ck : ClassKind.values()) {
-                        for (ExceptionKind ek_decl : ExceptionKind.values()) {
-                            for (ExceptionKind ek_use : ExceptionKind.values()) {
-                                new InterruptedExceptionTest(xlint, suppress_decl,
-                                        suppress_use, ck, ek_decl, ek_use).run(comp, fm);
+            for (XlintOption xlint : XlintOption.values()) {
+                for (SuppressLevel suppress_decl : SuppressLevel.values()) {
+                    for (SuppressLevel suppress_use : SuppressLevel.values()) {
+                        for (ClassKind ck : ClassKind.values()) {
+                            for (ExceptionKind ek_decl : ExceptionKind.values()) {
+                                for (ExceptionKind ek_use : ExceptionKind.values()) {
+                                    new InterruptedExceptionTest(xlint, suppress_decl,
+                                            suppress_use, ck, ek_decl, ek_use).run(comp, fm);
+                                }
                             }
                         }
                     }
--- a/langtools/test/tools/javac/TryWithResources/UnusedResourcesTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/TryWithResources/UnusedResourcesTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -161,20 +161,24 @@
     }
 
     public static void main(String... args) throws Exception {
-        for (XlintOption xlint : XlintOption.values()) {
-            for (SuppressLevel suppressLevel : SuppressLevel.values()) {
-                for (ResourceUsage usage1 : ResourceUsage.values()) {
-                    for (ResourceUsage usage2 : ResourceUsage.values()) {
-                        for (ResourceUsage usage3 : ResourceUsage.values()) {
-                                test(xlint,
-                                        suppressLevel,
-                                        usage1,
-                                        usage2,
-                                        usage3);
+        try {
+            for (XlintOption xlint : XlintOption.values()) {
+                for (SuppressLevel suppressLevel : SuppressLevel.values()) {
+                    for (ResourceUsage usage1 : ResourceUsage.values()) {
+                        for (ResourceUsage usage2 : ResourceUsage.values()) {
+                            for (ResourceUsage usage3 : ResourceUsage.values()) {
+                                    test(xlint,
+                                            suppressLevel,
+                                            usage1,
+                                            usage2,
+                                            usage3);
+                            }
                         }
                     }
                 }
             }
+        } finally {
+            fm.close();
         }
     }
 
--- a/langtools/test/tools/javac/annotations/neg/8022765/VerifyAnnotationsAttributed.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/annotations/neg/8022765/VerifyAnnotationsAttributed.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -41,38 +41,39 @@
         File testSrc = new File(System.getProperty("test.src"));
         File testFile = new File(testSrc, args[0]);
         if (!testFile.canRead()) throw new IllegalStateException("Cannot read the test source");
-        JavacFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
-        JavacTask task = JavacTool.create().getTask(null,
-                                                    fm,
-                                                    null,
-                                                    Collections.<String>emptyList(),
-                                                    null,
-                                                    fm.getJavaFileObjects(testFile));
-        final Trees trees = Trees.instance(task);
-        final CompilationUnitTree cut = task.parse().iterator().next();
-        task.analyze();
+        try (JavacFileManager fm = JavacTool.create().getStandardFileManager(null, null, null)) {
+            JavacTask task = JavacTool.create().getTask(null,
+                                                        fm,
+                                                        null,
+                                                        Collections.<String>emptyList(),
+                                                        null,
+                                                        fm.getJavaFileObjects(testFile));
+            final Trees trees = Trees.instance(task);
+            final CompilationUnitTree cut = task.parse().iterator().next();
+            task.analyze();
 
-        //ensure all the annotation attributes are annotated meaningfully
-        //all the attributes in the test file should contain either an identifier
-        //or a select, so only checking those for a reasonable Element/Symbol.
-        new TreePathScanner<Void, Void>() {
-            @Override
-            public Void visitIdentifier(IdentifierTree node, Void p) {
-                verifyAttributedMeaningfully();
-                return super.visitIdentifier(node, p);
-            }
-            @Override
-            public Void visitMemberSelect(MemberSelectTree node, Void p) {
-                verifyAttributedMeaningfully();
-                return super.visitMemberSelect(node, p);
-            }
-            private void verifyAttributedMeaningfully() {
-                Element el = trees.getElement(getCurrentPath());
+            //ensure all the annotation attributes are annotated meaningfully
+            //all the attributes in the test file should contain either an identifier
+            //or a select, so only checking those for a reasonable Element/Symbol.
+            new TreePathScanner<Void, Void>() {
+                @Override
+                public Void visitIdentifier(IdentifierTree node, Void p) {
+                    verifyAttributedMeaningfully();
+                    return super.visitIdentifier(node, p);
+                }
+                @Override
+                public Void visitMemberSelect(MemberSelectTree node, Void p) {
+                    verifyAttributedMeaningfully();
+                    return super.visitMemberSelect(node, p);
+                }
+                private void verifyAttributedMeaningfully() {
+                    Element el = trees.getElement(getCurrentPath());
 
-                if (el == null || el.getKind() == ElementKind.OTHER) {
-                    throw new IllegalStateException("Not attributed properly: " + getCurrentPath().getParentPath().getLeaf());
+                    if (el == null || el.getKind() == ElementKind.OTHER) {
+                        throw new IllegalStateException("Not attributed properly: " + getCurrentPath().getParentPath().getLeaf());
+                    }
                 }
-            }
-        }.scan(cut, null);
+            }.scan(cut, null);
+        }
     }
 }
--- a/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/Helper.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/annotations/repeatingAnnotations/combo/Helper.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -102,29 +102,31 @@
             throw new RuntimeException("can't get javax.tools.JavaCompiler!");
         }
 
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
-
-        // Assuming filesCount can maximum be 2 and if true, one file is package-info.java
-        if (isPkgInfoPresent(files)) {
-            JavacTask task = (JavacTask) compiler.getTask(null, fm, diagnostics, null, null, files);
-            try {
-                fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(destDir));
-                task.generate();
-            } catch (IOException ioe) {
-                throw new RuntimeException("Compilation failed for package level tests", ioe);
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            // Assuming filesCount can maximum be 2 and if true, one file is package-info.java
+            if (isPkgInfoPresent(files)) {
+                JavacTask task = (JavacTask) compiler.getTask(null, fm, diagnostics, null, null, files);
+                try {
+                    fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(destDir));
+                    task.generate();
+                } catch (IOException ioe) {
+                    throw new RuntimeException("Compilation failed for package level tests", ioe);
+                }
+                int err = 0;
+                for (Diagnostic<? extends JavaFileObject> d : diagnostics.getDiagnostics()) {
+                    if(d.getKind() == Diagnostic.Kind.ERROR) {
+                      err++;
+                    }
+                }
+                ok = (err == 0);
+            } else {
+                CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, files);
+                ok = task.call();
             }
-            int err = 0;
-            for (Diagnostic<? extends JavaFileObject> d : diagnostics.getDiagnostics()) {
-                if(d.getKind() == Diagnostic.Kind.ERROR) {
-                  err++;
-                }
-            }
-            ok = (err == 0);
-        } else {
-            CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, files);
-            ok = task.call();
+            return ok;
+        } catch (IOException e) {
+            throw new Error(e);
         }
-        return ok;
     }
 
     static private boolean isPkgInfoPresent(Iterable<? extends JavaFileObject> files) {
--- a/langtools/test/tools/javac/annotations/typeAnnotations/api/AnnotatedArrayOrder.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/api/AnnotatedArrayOrder.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -46,18 +46,18 @@
     public static void main(String[] args) throws Exception {
         PrintWriter out = new PrintWriter(System.out, true);
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File testSrc = new File(System.getProperty("test.src"));
-        Iterable<? extends JavaFileObject> f =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "AnnotatedArrayOrder.java")));
-        JavacTask task = tool.getTask(out, fm, null, null, null, f);
-        Iterable<? extends CompilationUnitTree> trees = task.parse();
-        out.flush();
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File testSrc = new File(System.getProperty("test.src"));
+            Iterable<? extends JavaFileObject> f =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "AnnotatedArrayOrder.java")));
+            JavacTask task = tool.getTask(out, fm, null, null, null, f);
+            Iterable<? extends CompilationUnitTree> trees = task.parse();
+            out.flush();
 
-        Scanner s = new Scanner();
-        for (CompilationUnitTree t: trees)
-            s.scan(t, null);
-
+            Scanner s = new Scanner();
+            for (CompilationUnitTree t: trees)
+                s.scan(t, null);
+        }
     }
 
     private static class Scanner extends TreeScanner<Void,Void> {
--- a/langtools/test/tools/javac/annotations/typeAnnotations/api/ArrayCreationTree.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/api/ArrayCreationTree.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -48,18 +48,18 @@
     public static void main(String[] args) throws Exception {
         PrintWriter out = new PrintWriter(System.out, true);
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File testSrc = new File(System.getProperty("test.src"));
-        Iterable<? extends JavaFileObject> f =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "ArrayCreationTree.java")));
-        JavacTask task = tool.getTask(out, fm, null, null, null, f);
-        Iterable<? extends CompilationUnitTree> trees = task.parse();
-        out.flush();
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File testSrc = new File(System.getProperty("test.src"));
+            Iterable<? extends JavaFileObject> f =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "ArrayCreationTree.java")));
+            JavacTask task = tool.getTask(out, fm, null, null, null, f);
+            Iterable<? extends CompilationUnitTree> trees = task.parse();
+            out.flush();
 
-        Scanner s = new Scanner();
-        for (CompilationUnitTree t: trees)
-            s.scan(t, null);
-
+            Scanner s = new Scanner();
+            for (CompilationUnitTree t: trees)
+                s.scan(t, null);
+        }
     }
 
     private static class Scanner extends TreeScanner<Void,Void> {
--- a/langtools/test/tools/javac/annotations/typeAnnotations/api/ArrayPositionConsistency.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/api/ArrayPositionConsistency.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -47,18 +47,18 @@
     public static void main(String[] args) throws Exception {
         PrintWriter out = new PrintWriter(System.out, true);
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File testSrc = new File(System.getProperty("test.src"));
-        Iterable<? extends JavaFileObject> f =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "ArrayPositionConsistency.java")));
-        JavacTask task = tool.getTask(out, fm, null, null, null, f);
-        Iterable<? extends CompilationUnitTree> trees = task.parse();
-        out.flush();
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File testSrc = new File(System.getProperty("test.src"));
+            Iterable<? extends JavaFileObject> f =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "ArrayPositionConsistency.java")));
+            JavacTask task = tool.getTask(out, fm, null, null, null, f);
+            Iterable<? extends CompilationUnitTree> trees = task.parse();
+            out.flush();
 
-        Scanner s = new Scanner();
-        for (CompilationUnitTree t: trees)
-            s.scan(t, null);
-
+            Scanner s = new Scanner();
+            for (CompilationUnitTree t: trees)
+                s.scan(t, null);
+        }
     }
 
     private static class Scanner extends TreeScanner<Void,Void> {
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/CheckErrorsForSource7.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/CheckErrorsForSource7.java	Wed Jul 05 20:06:12 2017 +0200
@@ -72,77 +72,78 @@
         File testSrc = new File(System.getProperty("test.src"));
         File testFile = new File(testSrc, args[0]);
         if (!testFile.canRead()) throw new IllegalStateException("Cannot read the test source");
-        JavacFileManager fm = JavacTool.create().getStandardFileManager(null, null, null);
+        try (JavacFileManager fm = JavacTool.create().getStandardFileManager(null, null, null)) {
 
-        //gather spans of the @TA annotations into typeAnnotationSpans:
-        JavacTask task = JavacTool.create().getTask(null,
-                                                    fm,
-                                                    null,
-                                                    Collections.<String>emptyList(),
-                                                    null,
-                                                    fm.getJavaFileObjects(testFile));
-        final Trees trees = Trees.instance(task);
-        final CompilationUnitTree cut = task.parse().iterator().next();
-        final List<int[]> typeAnnotationSpans = new ArrayList<>();
+            //gather spans of the @TA annotations into typeAnnotationSpans:
+            JavacTask task = JavacTool.create().getTask(null,
+                                                        fm,
+                                                        null,
+                                                        Collections.<String>emptyList(),
+                                                        null,
+                                                        fm.getJavaFileObjects(testFile));
+            final Trees trees = Trees.instance(task);
+            final CompilationUnitTree cut = task.parse().iterator().next();
+            final List<int[]> typeAnnotationSpans = new ArrayList<>();
 
-        new TreePathScanner<Void, Void>() {
-            @Override
-            public Void visitAnnotation(AnnotationTree node, Void p) {
-                if (node.getAnnotationType().getKind() == Kind.IDENTIFIER &&
-                    ((IdentifierTree) node.getAnnotationType()).getName().contentEquals("TA")) {
-                    int start = (int) trees.getSourcePositions().getStartPosition(cut, node);
-                    int end = (int) trees.getSourcePositions().getEndPosition(cut, node);
-                    typeAnnotationSpans.add(new int[] {start, end});
+            new TreePathScanner<Void, Void>() {
+                @Override
+                public Void visitAnnotation(AnnotationTree node, Void p) {
+                    if (node.getAnnotationType().getKind() == Kind.IDENTIFIER &&
+                        ((IdentifierTree) node.getAnnotationType()).getName().contentEquals("TA")) {
+                        int start = (int) trees.getSourcePositions().getStartPosition(cut, node);
+                        int end = (int) trees.getSourcePositions().getEndPosition(cut, node);
+                        typeAnnotationSpans.add(new int[] {start, end});
+                    }
+                    return null;
                 }
-                return null;
-            }
-        }.scan(cut, null);
+            }.scan(cut, null);
 
-        //sort the spans in the reverse order, to simplify removing them from the source:
-        Collections.sort(typeAnnotationSpans, new Comparator<int[]>() {
-            @Override
-            public int compare(int[] o1, int[] o2) {
-                return o2[0] - o1[0];
-            }
-        });
+            //sort the spans in the reverse order, to simplify removing them from the source:
+            Collections.sort(typeAnnotationSpans, new Comparator<int[]>() {
+                @Override
+                public int compare(int[] o1, int[] o2) {
+                    return o2[0] - o1[0];
+                }
+            });
 
-        //verify the errors are produce correctly:
-        String originalSource = cut.getSourceFile().getCharContent(false).toString();
+            //verify the errors are produce correctly:
+            String originalSource = cut.getSourceFile().getCharContent(false).toString();
 
-        for (int[] toKeep : typeAnnotationSpans) {
-            //prepare updated source code by removing all the annotations except the toKeep one:
-            String updated = originalSource;
+            for (int[] toKeep : typeAnnotationSpans) {
+                //prepare updated source code by removing all the annotations except the toKeep one:
+                String updated = originalSource;
 
-            for (int[] span : typeAnnotationSpans) {
-                if (span == toKeep) continue;
+                for (int[] span : typeAnnotationSpans) {
+                    if (span == toKeep) continue;
 
-                updated = updated.substring(0, span[0]) + updated.substring(span[1]);
-            }
+                    updated = updated.substring(0, span[0]) + updated.substring(span[1]);
+                }
 
-            //parse and verify:
-            JavaFileObject updatedFile = new TestFO(cut.getSourceFile().toUri(), updated);
-            DiagnosticCollector<JavaFileObject> errors = new DiagnosticCollector<>();
-            JavacTask task2 = JavacTool.create().getTask(null,
-                                                         fm,
-                                                         errors,
-                                                         Arrays.asList("-source", "7"),
-                                                         null,
-                                                         Arrays.asList(updatedFile));
-            task2.parse();
+                //parse and verify:
+                JavaFileObject updatedFile = new TestFO(cut.getSourceFile().toUri(), updated);
+                DiagnosticCollector<JavaFileObject> errors = new DiagnosticCollector<>();
+                JavacTask task2 = JavacTool.create().getTask(null,
+                                                             fm,
+                                                             errors,
+                                                             Arrays.asList("-source", "7"),
+                                                             null,
+                                                             Arrays.asList(updatedFile));
+                task2.parse();
+
+                boolean found = false;
 
-            boolean found = false;
-
-            for (Diagnostic<? extends JavaFileObject> d : errors.getDiagnostics()) {
-                if (d.getKind() == Diagnostic.Kind.ERROR && EXPECTED_ERRORS.contains(d.getCode())) {
-                    if (found) {
-                        throw new IllegalStateException("More than one expected error found.");
+                for (Diagnostic<? extends JavaFileObject> d : errors.getDiagnostics()) {
+                    if (d.getKind() == Diagnostic.Kind.ERROR && EXPECTED_ERRORS.contains(d.getCode())) {
+                        if (found) {
+                            throw new IllegalStateException("More than one expected error found.");
+                        }
+                        found = true;
                     }
-                    found = true;
                 }
+
+                if (!found)
+                    throw new IllegalStateException("Did not produce proper errors for: " + updated);
             }
-
-            if (!found)
-                throw new IllegalStateException("Did not produce proper errors for: " + updated);
         }
     }
 
--- a/langtools/test/tools/javac/api/6406133/T6406133.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6406133/T6406133.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -106,6 +106,8 @@
     }
 
     public static void main(String... args) throws Exception {
-        new T6406133().test();
+        try (T6406133 t = new T6406133()) {
+            t.test();
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6410643/T6410643.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6410643/T6410643.java	Wed Jul 05 20:06:12 2017 +0200
@@ -31,6 +31,7 @@
  * @run main T6410643
  */
 
+import java.io.IOException;
 import javax.tools.JavaFileObject;
 import static java.util.Collections.singleton;
 
@@ -68,7 +69,10 @@
         testGetTask(s,    s,    f);
         System.err.println("Test result: PASSED");
     }
-    public static void main(String... args) {
-        new T6410643().test(args);
+
+    public static void main(String... args) throws IOException {
+        try (T6410643 t = new T6410643()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6411310/T6411310.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6411310/T6411310.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -54,6 +54,8 @@
     }
 
     public static void main(String... args) throws IOException {
-        new T6411310().test(args);
+        try (T6411310 t = new T6411310()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6411333/T6411333.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6411333/T6411333.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -82,7 +82,10 @@
         testRelativeUri("util/List.java", false);
         testRelativeUri("/util/List.java", true);
     }
-    public static void main(String... args) {
-        new T6411333().test(args);
+
+    public static void main(String... args) throws IOException {
+        try (T6411333 t = new T6411333()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6412656/T6412656.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6412656/T6412656.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -31,6 +31,7 @@
  * @run main T6412656
  */
 
+import java.io.IOException;
 import java.util.Set;
 import java.util.Collections;
 import javax.lang.model.element.TypeElement;
@@ -52,8 +53,10 @@
         System.out.println("OK");
     }
 
-    public static void main(String... args) {
-        new T6412656().test(args);
+    public static void main(String... args) throws IOException {
+        try (T6412656 t = new T6412656()) {
+            t.test(args);
+        }
     }
 
     @SupportedAnnotationTypes("*")
--- a/langtools/test/tools/javac/api/6415780/T6415780.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6415780/T6415780.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -32,6 +32,7 @@
  * @run main T6415780
  */
 
+import java.io.IOException;
 import static javax.tools.StandardLocation.CLASS_PATH;
 
 public class T6415780 extends ToolTester {
@@ -39,8 +40,9 @@
         System.out.println(fm.getClassLoader(CLASS_PATH).toString()); // null-check
     }
 
-    public static void main(String... args) {
-        T6415780 tester = new T6415780();
-        tester.test();
+    public static void main(String... args) throws IOException {
+        try (T6415780 tester = new T6415780()) {
+            tester.test();
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6418694/T6418694.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6418694/T6418694.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -32,6 +32,7 @@
  * @run main T6418694
  */
 
+import java.io.IOException;
 import javax.tools.StandardLocation;
 
 public class T6418694 extends ToolTester {
@@ -52,7 +53,9 @@
             }
         }
     }
-    public static void main(String... args) {
-        new T6418694().test(args);
+    public static void main(String... args) throws IOException {
+        try (T6418694 t = new T6418694()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6420409/T6420409.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6420409/T6420409.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -46,21 +46,22 @@
 
     public static void main(String... args) throws IOException {
         final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
-        final StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        fm.setLocation(SOURCE_PATH,  Arrays.asList(test_classes)); // switcheroo !!!
-        fm.setLocation(CLASS_PATH,   Arrays.asList(test_src));
-        fm.setLocation(CLASS_OUTPUT, Arrays.asList(test_classes));
-        final Iterable<? extends JavaFileObject> compilationUnits =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(test_src, "T6420409.java")));
-        tool.getTask(null,
-                     fm,
-                     null,
-                     Arrays.asList("-proc:none"),
-                     null,
-                     compilationUnits).call();
-        test(fm.getLocation(CLASS_PATH),   test_src,     CLASS_PATH);
-        test(fm.getLocation(SOURCE_PATH),  test_classes, SOURCE_PATH);
-        test(fm.getLocation(CLASS_OUTPUT), test_classes, CLASS_OUTPUT);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            fm.setLocation(SOURCE_PATH,  Arrays.asList(test_classes)); // switcheroo !!!
+            fm.setLocation(CLASS_PATH,   Arrays.asList(test_src));
+            fm.setLocation(CLASS_OUTPUT, Arrays.asList(test_classes));
+            final Iterable<? extends JavaFileObject> compilationUnits =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(test_src, "T6420409.java")));
+            tool.getTask(null,
+                         fm,
+                         null,
+                         Arrays.asList("-proc:none"),
+                         null,
+                         compilationUnits).call();
+            test(fm.getLocation(CLASS_PATH),   test_src,     CLASS_PATH);
+            test(fm.getLocation(SOURCE_PATH),  test_classes, SOURCE_PATH);
+            test(fm.getLocation(CLASS_OUTPUT), test_classes, CLASS_OUTPUT);
+        }
     }
 
     static void test(Iterable<? extends File> path, File file, Location location) {
--- a/langtools/test/tools/javac/api/6420464/T6420464.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6420464/T6420464.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -38,15 +38,16 @@
 
     public static void main(String... args) throws IOException {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager mgr = compiler.getStandardFileManager(null, null, null);
-        mgr.setLocation(StandardLocation.SOURCE_PATH, Collections.singleton(test_src));
-        JavaFileObject f = mgr.getJavaFileForInput(StandardLocation.SOURCE_PATH,
-                                                   "T6420464",
-                                                   JavaFileObject.Kind.SOURCE);
-        if (!f.isNameCompatible("T6420464", JavaFileObject.Kind.SOURCE))
-            throw new AssertionError("isNameCompatible(SOURCE) fails on " + f.toUri());
-        if (f.isNameCompatible("T6420464", JavaFileObject.Kind.OTHER))
-            throw new AssertionError("isNameCompatible(OTHER) fails on " + f.toUri());
-        System.out.println("OK");
+        try (StandardJavaFileManager mgr = compiler.getStandardFileManager(null, null, null)) {
+            mgr.setLocation(StandardLocation.SOURCE_PATH, Collections.singleton(test_src));
+            JavaFileObject f = mgr.getJavaFileForInput(StandardLocation.SOURCE_PATH,
+                                                       "T6420464",
+                                                       JavaFileObject.Kind.SOURCE);
+            if (!f.isNameCompatible("T6420464", JavaFileObject.Kind.SOURCE))
+                throw new AssertionError("isNameCompatible(SOURCE) fails on " + f.toUri());
+            if (f.isNameCompatible("T6420464", JavaFileObject.Kind.OTHER))
+                throw new AssertionError("isNameCompatible(OTHER) fails on " + f.toUri());
+            System.out.println("OK");
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6421111/T6421111.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6421111/T6421111.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -33,6 +33,7 @@
  */
 
 import java.io.File;
+import java.io.IOException;
 import java.net.URI;
 import java.util.Arrays;
 import java.util.Collections;
@@ -101,8 +102,10 @@
             return SourceVersion.latest();
         }
     }
-    public static void main(String... args) {
-        new T6421111().test(args);
+    public static void main(String... args) throws IOException {
+        try (T6421111 t = new T6421111()) {
+            t.test(args);
+        }
     }
     public static AssertionError error(String format, Object... args) {
         return new AssertionError(String.format(format, args));
--- a/langtools/test/tools/javac/api/6421756/T6421756.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6421756/T6421756.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -32,6 +32,7 @@
  * @run main T6421756
  */
 
+import java.io.IOException;
 import java.util.Collections;
 
 public class T6421756 extends ToolTester {
@@ -44,7 +45,9 @@
             System.out.println("OK: got expected error " + e.getLocalizedMessage());
         }
     }
-    public static void main(String... args) {
-        new T6421756().test(args);
+    public static void main(String... args) throws IOException {
+        try (T6421756 t = new T6421756()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6422215/T6422215.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6422215/T6422215.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -46,7 +46,9 @@
             System.out.println("OK: caught expected exception: " + e.getLocalizedMessage());
         }
     }
-    public static void main(String... args) {
-        new T6422215().test(args);
+    public static void main(String... args) throws IOException {
+        try (T6422215 t = new T6422215()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6422327/T6422327.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6422327/T6422327.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -32,6 +32,7 @@
  */
 
 import java.io.File;
+import java.io.IOException;
 
 public class T6422327 extends ToolTester {
     void test(String... args) {
@@ -43,7 +44,9 @@
             System.err.println("OK, got expected exception: " + e.getLocalizedMessage());
         }
     }
-    public static void main(String... args) {
-        new T6422327().test(args);
+    public static void main(String... args) throws IOException {
+        try (T6422327 t = new T6422327()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6423003/T6423003.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6423003/T6423003.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -32,6 +32,7 @@
  * @run main T6423003
  */
 
+import java.io.IOException;
 import java.util.Arrays;
 
 public class T6423003 extends ToolTester {
@@ -44,7 +45,9 @@
         }
         throw new AssertionError("Expected IllegalStateException not thrown");
     }
-    public static void main(String... args) {
-        new T6423003().test(args);
+    public static void main(String... args) throws IOException {
+        try (T6423003 t = new T6423003()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6431257/T6431257.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6431257/T6431257.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -67,6 +67,8 @@
     }
 
     public static void main(String... args) throws IOException {
-        new T6431257().test(args);
+        try (T6431257 t = new T6431257()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6431435/T6431435.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6431435/T6431435.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -39,18 +39,19 @@
         String testSrc = System.getProperty("test.src", ".");
         String testClasses = System.getProperty("test.classes", ".");
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
-        fm.setLocation(StandardLocation.SOURCE_PATH, Arrays.asList(new File(testSrc)));
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjectsFromFiles(Arrays.asList(
-                new File(testSrc, "A.java")));
-        JavacTask task = tool.getTask(null, fm, null, null, null, files);
-        boolean ok = true;
-        ok &= check("parse", task.parse(), 1);       // A.java
-        ok &= check("analyze", task.analyze(), 3);   // A, Foo, p.B
-        ok &= check("generate", task.generate(), 5); // A, Foo, Foo$Baz, Foo$1, p.B
-        if (!ok)
-            throw new AssertionError("Test failed");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
+            fm.setLocation(StandardLocation.SOURCE_PATH, Arrays.asList(new File(testSrc)));
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjectsFromFiles(Arrays.asList(
+                    new File(testSrc, "A.java")));
+            JavacTask task = tool.getTask(null, fm, null, null, null, files);
+            boolean ok = true;
+            ok &= check("parse", task.parse(), 1);       // A.java
+            ok &= check("analyze", task.analyze(), 3);   // A, Foo, p.B
+            ok &= check("generate", task.generate(), 5); // A, Foo, Foo$Baz, Foo$1, p.B
+            if (!ok)
+                throw new AssertionError("Test failed");
+        }
     }
 
     private static boolean check(String name, Iterable<?> iter, int expect) {
--- a/langtools/test/tools/javac/api/6437349/T6437349.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6437349/T6437349.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -51,6 +51,8 @@
             throw new AssertionError();
     }
     public static void main(String... args) throws IOException {
-        new T6437349().test(args);
+        try (T6437349 t = new T6437349()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6437999/T6437999.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6437999/T6437999.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -86,6 +86,8 @@
             throw new AssertionError("Error in UTF-8 mode");
     }
     public static void main(String... args) throws IOException {
-        new T6437999().test(args);
+        try (T6437999 t = new T6437999()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6440333/T6440333.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6440333/T6440333.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -50,6 +50,8 @@
         }
     }
     public static void main(String... args) throws IOException {
-        new T6440333().test(args);
+        try (T6440333 t = new T6440333()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6440528/T6440528.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6440528/T6440528.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -66,6 +66,8 @@
     }
 
     public static void main(String... args) throws Exception {
-        new T6440528().test(args);
+        try (T6440528 t = new T6440528()) {
+            t.test(args);
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6468404/T6468404.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6468404/T6468404.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -88,8 +88,10 @@
         if (!task.call())
             throw new AssertionError();
     }
-    public static void main(String... args) {
-        new T6468404().test(args);
+    public static void main(String... args) throws IOException {
+        try (T6468404 t = new T6468404()) {
+            t.test(args);
+        }
     }
 
 }
--- a/langtools/test/tools/javac/api/6731573/T6731573.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6731573/T6731573.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -106,6 +106,8 @@
     }
 
     public static void main(String... args) throws Exception {
-        new T6731573().test();
+        try (T6731573 t = new T6731573()) {
+            t.test();
+        }
     }
 }
--- a/langtools/test/tools/javac/api/6733837/T6733837.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/6733837/T6733837.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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
@@ -31,6 +31,7 @@
  * @run main T6733837
  */
 
+import java.io.IOException;
 import java.io.StringWriter;
 import java.io.PrintWriter;
 import java.net.URI;
@@ -43,8 +44,10 @@
 
 public class T6733837 extends ToolTester {
 
-    public static void main(String... args) {
-        new T6733837().exec();
+    public static void main(String... args) throws IOException {
+        try (T6733837 t = new T6733837()) {
+            t.exec();
+        }
     }
 
     public void exec() {
--- a/langtools/test/tools/javac/api/7086261/T7086261.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/7086261/T7086261.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -66,10 +66,11 @@
 
     void test() throws Throwable {
         JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
-        JavaFileManager jfm = javac.getStandardFileManager(null, null, null);
-        JavaCompiler.CompilationTask task =
-                javac.getTask(null, jfm, new DiagnosticChecker(), null, null, Arrays.asList(new ErroneousSource()));
-        task.call();
+        try (JavaFileManager jfm = javac.getStandardFileManager(null, null, null)) {
+            JavaCompiler.CompilationTask task =
+                    javac.getTask(null, jfm, new DiagnosticChecker(), null, null, Arrays.asList(new ErroneousSource()));
+            task.call();
+        }
     }
 
     public static void main(String[] args) throws Throwable {
--- a/langtools/test/tools/javac/api/8007344/Test.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/8007344/Test.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -83,14 +83,15 @@
         File testSrc = new File(System.getProperty("test.src"));
         File thisFile = new File(testSrc, getClass().getName() + ".java");
         JavacTool javac = JavacTool.create();
-        StandardJavaFileManager fm = javac.getStandardFileManager(null, null, null);
-        fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
-        Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjects(thisFile);
-        testAnnoProcessor(javac, fm, fos, out, EXPECT_DOC_COMMENTS);
-        testTaskListener(javac, fm, fos, out, EXPECT_DOC_COMMENTS);
+        try (StandardJavaFileManager fm = javac.getStandardFileManager(null, null, null)) {
+            fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
+            Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjects(thisFile);
+            testAnnoProcessor(javac, fm, fos, out, EXPECT_DOC_COMMENTS);
+            testTaskListener(javac, fm, fos, out, EXPECT_DOC_COMMENTS);
 
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
+        }
     }
 
     void testAnnoProcessor(JavacTool javac, StandardJavaFileManager fm,
--- a/langtools/test/tools/javac/api/Sibling.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/Sibling.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -39,17 +39,18 @@
 public class Sibling {
     public static void main(String... args) throws IOException {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
-        JavaFileObject sibling =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File("Test.java")))
-            .iterator().next();
-        JavaFileObject classFile =  fm.getJavaFileForOutput(CLASS_OUTPUT,
-                                                            "foo.bar.baz.Test",
-                                                            CLASS,
-                                                            sibling);
-        File file = new File("Test.class").getAbsoluteFile();
-        if (!classFile.toUri().equals(file.toURI()))
-            throw new AssertionError("Expected " + file.toURI() + ", got " +
-                                     classFile.toUri());
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            JavaFileObject sibling =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File("Test.java")))
+                .iterator().next();
+            JavaFileObject classFile =  fm.getJavaFileForOutput(CLASS_OUTPUT,
+                                                                "foo.bar.baz.Test",
+                                                                CLASS,
+                                                                sibling);
+            File file = new File("Test.class").getAbsoluteFile();
+            if (!classFile.toUri().equals(file.toURI()))
+                throw new AssertionError("Expected " + file.toURI() + ", got " +
+                                         classFile.toUri());
+        }
     }
 }
--- a/langtools/test/tools/javac/api/T6258271.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6258271.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -33,7 +33,7 @@
 import javax.tools.*;
 
 public class T6258271 {
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
         DiagnosticListener<JavaFileObject> dl =  new DiagnosticListener<JavaFileObject>() {
                 public void report(Diagnostic<? extends JavaFileObject> message) {
@@ -43,9 +43,10 @@
                     System.out.println(message);
                 }
             };
-        StandardJavaFileManager fm = javac.getStandardFileManager(dl, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromStrings(Arrays.asList("nofile.java"));
-        javac.getTask(null, fm, dl, null, null, files).call();
+        try (StandardJavaFileManager fm = javac.getStandardFileManager(dl, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromStrings(Arrays.asList("nofile.java"));
+            javac.getTask(null, fm, dl, null, null, files).call();
+        }
     }
 }
--- a/langtools/test/tools/javac/api/T6265137.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6265137.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -29,11 +29,12 @@
  */
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Arrays;
 import javax.tools.*;
 
 public class T6265137 {
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
         DiagnosticListener<JavaFileObject> dl =  new DiagnosticListener<JavaFileObject>() {
                 public void report(Diagnostic<? extends JavaFileObject> message) {
@@ -45,10 +46,11 @@
                     System.out.flush();
                 }
         };
-        StandardJavaFileManager fm = javac.getStandardFileManager(dl, null, null);
-        String srcdir = System.getProperty("test.src");
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(srcdir, "T6265137a.java")));
-        javac.getTask(null, fm, dl, Arrays.asList("-target","9"), null, files).call();
+        try (StandardJavaFileManager fm = javac.getStandardFileManager(dl, null, null)) {
+            String srcdir = System.getProperty("test.src");
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(srcdir, "T6265137a.java")));
+            javac.getTask(null, fm, dl, Arrays.asList("-target","9"), null, files).call();
+        }
     }
 }
--- a/langtools/test/tools/javac/api/T6306137.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6306137.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -87,10 +87,18 @@
         }
     }
 
+    void close() throws IOException {
+        fm.close();
+    }
+
     public static void main(String[] args) throws IOException {
         T6306137 self = new T6306137();
-        self.test("utf-8", true);
-        self.test("ascii", false);
-        self.test("utf-8", true);
+        try {
+            self.test("utf-8", true);
+            self.test("ascii", false);
+            self.test("utf-8", true);
+        } finally {
+            self.close();
+        }
     }
 }
--- a/langtools/test/tools/javac/api/T6345974.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6345974.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -45,17 +45,18 @@
     public static void main(String[] args) throws Exception {
         PrintWriter out = new PrintWriter(System.out, true);
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File testSrc = new File(System.getProperty("test.src"));
-        Iterable<? extends JavaFileObject> f =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "T6345974.java")));
-        JavacTask task = tool.getTask(out, fm, null, null, null, f);
-        Iterable<? extends CompilationUnitTree> trees = task.parse();
-        out.flush();
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File testSrc = new File(System.getProperty("test.src"));
+            Iterable<? extends JavaFileObject> f =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "T6345974.java")));
+            JavacTask task = tool.getTask(out, fm, null, null, null, f);
+            Iterable<? extends CompilationUnitTree> trees = task.parse();
+            out.flush();
 
-        Scanner s = new Scanner();
-        for (CompilationUnitTree t: trees)
-            s.scan(t, null);
+            Scanner s = new Scanner();
+            for (CompilationUnitTree t: trees)
+                s.scan(t, null);
+        }
     }
 
     private static class Scanner extends TreeScanner<Void,Void> {
--- a/langtools/test/tools/javac/api/T6357331.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6357331.java	Wed Jul 05 20:06:12 2017 +0200
@@ -33,42 +33,43 @@
 
 public class T6357331
 {
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
         PrintWriter out = new PrintWriter(new StringWriter());
         List<String> opts = Arrays.asList("-d", ".");
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File thisFile = new File(System.getProperty("test.src"), "T6357331.java");
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(thisFile);
-        final JavacTask task = (JavacTask) (tool.getTask(out, fm, null, opts, null, files));
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File thisFile = new File(System.getProperty("test.src"), "T6357331.java");
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(thisFile);
+            final JavacTask task = (JavacTask) (tool.getTask(out, fm, null, opts, null, files));
 
-        // set a listener to verify that IllegalStateException is not thrown
-        // during the compilation
-        task.setTaskListener(new TaskListener() {
-                public void started(TaskEvent e) {
-                    task.getElements();
-                    task.getTypes();
-                }
-                public void finished(TaskEvent e) { }
-            });
+            // set a listener to verify that IllegalStateException is not thrown
+            // during the compilation
+            task.setTaskListener(new TaskListener() {
+                    public void started(TaskEvent e) {
+                        task.getElements();
+                        task.getTypes();
+                    }
+                    public void finished(TaskEvent e) { }
+                });
+
+            task.call();
 
-        task.call();
+            // now the compilation is over, we expect IllegalStateException (not NPE)
+            try {
+                task.getElements();
+                throw new AssertionError("IllegalStateException not thrown");
+            }
+            catch (IllegalStateException e) {
+                // expected
+            }
 
-        // now the compilation is over, we expect IllegalStateException (not NPE)
-        try {
-            task.getElements();
-            throw new AssertionError("IllegalStateException not thrown");
-        }
-        catch (IllegalStateException e) {
-            // expected
-        }
-
-        try {
-            task.getTypes();
-            throw new AssertionError("IllegalStateException not thrown");
-        }
-        catch (IllegalStateException e) {
-            // expected
+            try {
+                task.getTypes();
+                throw new AssertionError("IllegalStateException not thrown");
+            }
+            catch (IllegalStateException e) {
+                // expected
+            }
         }
     }
 }
--- a/langtools/test/tools/javac/api/T6358786.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6358786.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -44,16 +44,17 @@
 public class T6358786 {
     public static void main(String... args) throws IOException {
         JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        String srcdir = System.getProperty("test.src");
-        File file = new File(srcdir, args[0]);
-        JavacTaskImpl task = (JavacTaskImpl)tool.getTask(null, fm, null, null, null, fm.getJavaFileObjectsFromFiles(Arrays.asList(file)));
-        Elements elements = task.getElements();
-        for (TypeElement clazz : task.enter(task.parse())) {
-            String doc = elements.getDocComment(clazz);
-            if (doc == null)
-                throw new AssertionError(clazz.getSimpleName() + ": no doc comment");
-            System.out.format("%s: %s%n", clazz.getSimpleName(), doc);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            String srcdir = System.getProperty("test.src");
+            File file = new File(srcdir, args[0]);
+            JavacTaskImpl task = (JavacTaskImpl)tool.getTask(null, fm, null, null, null, fm.getJavaFileObjectsFromFiles(Arrays.asList(file)));
+            Elements elements = task.getElements();
+            for (TypeElement clazz : task.enter(task.parse())) {
+                String doc = elements.getDocComment(clazz);
+                if (doc == null)
+                    throw new AssertionError(clazz.getSimpleName() + ": no doc comment");
+                System.out.format("%s: %s%n", clazz.getSimpleName(), doc);
+            }
         }
     }
 }
--- a/langtools/test/tools/javac/api/T6358955.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6358955.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -36,34 +36,35 @@
 public class T6358955 {
     public static void main(String[] args) throws Exception {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager jfm = compiler.getStandardFileManager(null, null, null)) {
 
-        File dir = new File("temp" + args.hashCode());
-        if (!dir.exists())
-            dir.mkdir();
-        if (!dir.isDirectory())
-            throw new AssertionError("Not a directory " + dir);
+            File dir = new File("temp" + args.hashCode());
+            if (!dir.exists())
+                dir.mkdir();
+            if (!dir.isDirectory())
+                throw new AssertionError("Not a directory " + dir);
 
-        try {
-            jfm.setLocation(StandardLocation.CLASS_OUTPUT,
-                            Arrays.asList(dir.getCanonicalFile().getParentFile()));
             try {
-                jfm.getFileForInput(StandardLocation.CLASS_OUTPUT, "", dir.getPath());
-                throw new AssertionError("IllegalArgumentException not thrown");
-            } catch (IllegalArgumentException e) {
-                System.out.println("OK: " + e.getLocalizedMessage());
-            }
-            try {
-                jfm.getJavaFileObjectsFromFiles(Arrays.asList(dir));
-                throw new AssertionError("IllegalArgumentException not thrown");
-            } catch (IllegalArgumentException e) {
-                System.out.println("OK: " + e.getLocalizedMessage());
-            }
-        } finally {
-            try {
-                dir.delete(); // cleanup
-            } catch (Throwable t) {
-                t.printStackTrace();
+                jfm.setLocation(StandardLocation.CLASS_OUTPUT,
+                                Arrays.asList(dir.getCanonicalFile().getParentFile()));
+                try {
+                    jfm.getFileForInput(StandardLocation.CLASS_OUTPUT, "", dir.getPath());
+                    throw new AssertionError("IllegalArgumentException not thrown");
+                } catch (IllegalArgumentException e) {
+                    System.out.println("OK: " + e.getLocalizedMessage());
+                }
+                try {
+                    jfm.getJavaFileObjectsFromFiles(Arrays.asList(dir));
+                    throw new AssertionError("IllegalArgumentException not thrown");
+                } catch (IllegalArgumentException e) {
+                    System.out.println("OK: " + e.getLocalizedMessage());
+                }
+            } finally {
+                try {
+                    dir.delete(); // cleanup
+                } catch (Throwable t) {
+                    t.printStackTrace();
+                }
             }
         }
     }
--- a/langtools/test/tools/javac/api/T6392782.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6392782.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -38,21 +38,22 @@
     public static void main(String... args) throws IOException {
         String testSrc = System.getProperty("test.src", ".");
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6392782.class.getName()+".java")));
-        JavacTask task = tool.getTask(null, fm, null, null, null, files);
-        Iterable<? extends Tree> trees = task.parse();
-        TreeScanner<Integer,Void> scanner = new MyScanner();
-        check(scanner, 6, scanner.scan(trees, null));
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6392782.class.getName()+".java")));
+            JavacTask task = tool.getTask(null, fm, null, null, null, files);
+            Iterable<? extends Tree> trees = task.parse();
+            TreeScanner<Integer,Void> scanner = new MyScanner();
+            check(scanner, 6, scanner.scan(trees, null));
 
-        CountNodes nodeCounter = new CountNodes();
-        // 359 nodes with the regular parser; 360 nodes with EndPosParser
-        // We automatically switch to EndPosParser when calling JavacTask.parse()
-        check(nodeCounter, 360, nodeCounter.scan(trees, null));
+            CountNodes nodeCounter = new CountNodes();
+            // 359 nodes with the regular parser; 360 nodes with EndPosParser
+            // We automatically switch to EndPosParser when calling JavacTask.parse()
+            check(nodeCounter, 362, nodeCounter.scan(trees, null));
 
-        CountIdentifiers idCounter = new CountIdentifiers();
-        check(idCounter, 107, idCounter.scan(trees, null));
+            CountIdentifiers idCounter = new CountIdentifiers();
+            check(idCounter, 107, idCounter.scan(trees, null));
+        }
     }
 
     private static void check(TreeScanner<?,?> scanner, int expect, int found) {
--- a/langtools/test/tools/javac/api/T6397104.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6397104.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -65,16 +65,15 @@
     void test(boolean hasLocation, File siblingFile, String relName, String expectedPath)
         throws Exception
     {
-        StandardJavaFileManager fm;
-        if (hasLocation) {
-            for (Location location : StandardLocation.values()) {
-                fm = tool.getStandardFileManager(null, null, null);
-                fm.setLocation(location, Arrays.asList(new File(".")));
-                test(fm, location, siblingFile, relName, expectedPath);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            if (hasLocation) {
+                for (Location location : StandardLocation.values()) {
+                    fm.setLocation(location, Arrays.asList(new File(".")));
+                    test(fm, location, siblingFile, relName, expectedPath);
+                }
+            } else {
+                test(fm, CLASS_OUTPUT, siblingFile, relName, expectedPath);
             }
-        } else {
-            fm = tool.getStandardFileManager(null, null, null);
-            test(fm, CLASS_OUTPUT, siblingFile, relName, expectedPath);
         }
     }
 
--- a/langtools/test/tools/javac/api/T6400205.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6400205.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -28,22 +28,24 @@
  * @author  Peter von der Ah\u00e9
  */
 
+import java.io.IOException;
 import javax.tools.*;
 import static javax.tools.StandardLocation.*;
 
 public class T6400205 {
-    public static void main(String... args) {
-        JavaFileManager fm =
-            ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
-        try {
-            fm.getClassLoader(null);
-            throw new AssertionError("NullPointerException not thrown");
-        } catch (NullPointerException e) {
-            // expected result
+    public static void main(String... args) throws IOException {
+        try (JavaFileManager fm =
+                ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) {
+            try {
+                fm.getClassLoader(null);
+                throw new AssertionError("NullPointerException not thrown");
+            } catch (NullPointerException e) {
+                // expected result
+            }
+            ClassLoader cl = fm.getClassLoader(locationFor("bogus"));
+            if (cl != null)
+                throw new AssertionError("non-null class loader for bogus location");
+            System.err.println("Test PASSED.");
         }
-        ClassLoader cl = fm.getClassLoader(locationFor("bogus"));
-        if (cl != null)
-            throw new AssertionError("non-null class loader for bogus location");
-        System.err.println("Test PASSED.");
     }
 }
--- a/langtools/test/tools/javac/api/T6400207.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6400207.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -61,28 +61,29 @@
     }
 
     public static void main(String... args) throws Exception {
-        JavaFileManager fm =
-            ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
-        JavaFileManager.Location bogusLocation = locationFor("bogus");
-        JavaFileManager.Location knownLocation = CLASS_PATH;
-        String packageName = "java.lang";
-        Set<JavaFileObject.Kind> kinds = EnumSet.of(CLASS);
+        try (JavaFileManager fm =
+                ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) {
+            JavaFileManager.Location bogusLocation = locationFor("bogus");
+            JavaFileManager.Location knownLocation = CLASS_PATH;
+            String packageName = "java.lang";
+            Set<JavaFileObject.Kind> kinds = EnumSet.of(CLASS);
 
-        for (StandardLocation location : StandardLocation.values()) {
-            if (location != locationFor(location.getName()))
-                throw new AssertionError(location + " != locationFor(" +
-                                         location.getName() + ")");
+            for (StandardLocation location : StandardLocation.values()) {
+                if (location != locationFor(location.getName()))
+                    throw new AssertionError(location + " != locationFor(" +
+                                             location.getName() + ")");
+            }
+
+            testList(fm, null, null, null);
+            testList(fm, bogusLocation, packageName, kinds);
+            testList(fm, knownLocation, packageName, kinds);
+            testList(fm, null, packageName, kinds);
+            testList(fm, knownLocation, null, kinds);
+            testList(fm, knownLocation, packageName, null);
+            testList(fm, bogusLocation, null, kinds);
+            testList(fm, bogusLocation, packageName, null);
+
+            System.err.println("Test PASSED.");
         }
-
-        testList(fm, null, null, null);
-        testList(fm, bogusLocation, packageName, kinds);
-        testList(fm, knownLocation, packageName, kinds);
-        testList(fm, null, packageName, kinds);
-        testList(fm, knownLocation, null, kinds);
-        testList(fm, knownLocation, packageName, null);
-        testList(fm, bogusLocation, null, kinds);
-        testList(fm, bogusLocation, packageName, null);
-
-        System.err.println("Test PASSED.");
     }
 }
--- a/langtools/test/tools/javac/api/T6412669.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6412669.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -64,22 +64,23 @@
         //System.err.println("toolsClasses: " + toolsClasses);
 
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses, toolsClasses));
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6412669.class.getName()+".java")));
-        String[] opts = { "-proc:only", "-processor", T6412669.class.getName()};
-        StringWriter sw = new StringWriter();
-        JavacTask task = tool.getTask(sw, fm, null, Arrays.asList(opts), null, files);
-        boolean ok = task.call();
-        String out = sw.toString();
-        if (!out.isEmpty())
-            System.err.println(out);
-        if (!ok)
-            throw new AssertionError("compilation of test program failed");
-        // verify we found an annotated element to exercise the SourcePositions API
-        if (!out.contains("processing element"))
-            throw new AssertionError("expected text not found in compilation output");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses, toolsClasses));
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6412669.class.getName()+".java")));
+            String[] opts = { "-proc:only", "-processor", T6412669.class.getName()};
+            StringWriter sw = new StringWriter();
+            JavacTask task = tool.getTask(sw, fm, null, Arrays.asList(opts), null, files);
+            boolean ok = task.call();
+            String out = sw.toString();
+            if (!out.isEmpty())
+                System.err.println(out);
+            if (!ok)
+                throw new AssertionError("compilation of test program failed");
+            // verify we found an annotated element to exercise the SourcePositions API
+            if (!out.contains("processing element"))
+                throw new AssertionError("expected text not found in compilation output");
+        }
     }
 
     public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
--- a/langtools/test/tools/javac/api/T6419926.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6419926.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -35,17 +35,18 @@
 public class T6419926 {
     public static void main(String[] argv) throws Exception {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager mgr = compiler.getStandardFileManager( new DiagnosticCollector<JavaFileObject>(), null, null);
-        System.out.println( new File( new File(".").toURI() ).getAbsolutePath() );
-        mgr.setLocation(StandardLocation.CLASS_OUTPUT,
-                            Collections.singleton(new File(".")));
+        try (StandardJavaFileManager mgr = compiler.getStandardFileManager( new DiagnosticCollector<JavaFileObject>(), null, null)) {
+            System.out.println( new File( new File(".").toURI() ).getAbsolutePath() );
+            mgr.setLocation(StandardLocation.CLASS_OUTPUT,
+                                Collections.singleton(new File(".")));
 
-        FileObject fo = mgr.getFileForOutput(StandardLocation.CLASS_OUTPUT,
-                                "", "file.to.delete", null);
-        URI uri = fo.toUri();
-        System.out.println( uri );
+            FileObject fo = mgr.getFileForOutput(StandardLocation.CLASS_OUTPUT,
+                                    "", "file.to.delete", null);
+            URI uri = fo.toUri();
+            System.out.println( uri );
 
-        if (!"file".equals(uri.getScheme()))
-            throw new Exception("unexpected scheme for uri: " + uri.getScheme());
+            if (!"file".equals(uri.getScheme()))
+                throw new Exception("unexpected scheme for uri: " + uri.getScheme());
+        }
     }
 }
--- a/langtools/test/tools/javac/api/T6430241.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6430241.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
     /*
-     * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+     * Copyright (c) 2011, 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
@@ -134,21 +134,22 @@
             System.err.println("test task API: " + pcp);
 
             JavacTool tool = JavacTool.create();
-            StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
+            try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
 
-            if (pcp != null)
-                fm.setLocation(StandardLocation.PLATFORM_CLASS_PATH, pcp);
+                if (pcp != null)
+                    fm.setLocation(StandardLocation.PLATFORM_CLASS_PATH, pcp);
 
-            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(testFile);
+                Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(testFile);
 
-            StringWriter sw = new StringWriter();
-            PrintWriter pw = new PrintWriter(sw);
-            JavacTask task = tool.getTask(pw, fm, null, null, null, files);
-            boolean ok = task.call();
-            String out = showOutput(sw.toString());
+                StringWriter sw = new StringWriter();
+                PrintWriter pw = new PrintWriter(sw);
+                JavacTask task = tool.getTask(pw, fm, null, null, null, files);
+                boolean ok = task.call();
+                String out = showOutput(sw.toString());
 
-            checkCompilationOK(ok);
-            checkOutput(out, expectWarnings);
+                checkCompilationOK(ok);
+                checkOutput(out, expectWarnings);
+            }
         }
 
         //----- utility methods
--- a/langtools/test/tools/javac/api/T6431879.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6431879.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -39,18 +39,18 @@
         String testSrc = System.getProperty("test.src", ".");
         String testClasses = System.getProperty("test.classes", ".");
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6431879.class.getName()+".java")));
-        JavacTask task = tool.getTask(null, fm, null, null, null, files);
-        Iterable<? extends CompilationUnitTree> trees = task.parse();
-        TreeScanner<Void,Trees> dependencyScanner = new DependencyScanner();
-        Trees treeUtil = Trees.instance(task);
-        for (CompilationUnitTree unit : trees) {
-            //System.err.println("scan " + unit);
-            dependencyScanner.scan(unit, treeUtil);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6431879.class.getName()+".java")));
+            JavacTask task = tool.getTask(null, fm, null, null, null, files);
+            Iterable<? extends CompilationUnitTree> trees = task.parse();
+            TreeScanner<Void,Trees> dependencyScanner = new DependencyScanner();
+            Trees treeUtil = Trees.instance(task);
+            for (CompilationUnitTree unit : trees) {
+                //System.err.println("scan " + unit);
+                dependencyScanner.scan(unit, treeUtil);
+            }
         }
-
     }
 
     private static class DependencyScanner<R,P> extends TreePathScanner<R,P> {
--- a/langtools/test/tools/javac/api/T6483788.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6483788.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -42,14 +42,15 @@
     void run() throws Exception {
         File jar = createJar();
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
-        fm.setLocation(StandardLocation.CLASS_PATH, Collections.singleton(jar));
-        JavaFileObject fo = fm.getJavaFileForInput(StandardLocation.CLASS_PATH, "dummy", JavaFileObject.Kind.CLASS);
-        System.err.println("file: " + fo);
-        URI uri = fo.toUri();
-        System.err.println("uri: " + uri);
-        if (uri.toString().contains(" "))
-            throw new Exception("unexpected space character found");
+        try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            fm.setLocation(StandardLocation.CLASS_PATH, Collections.singleton(jar));
+            JavaFileObject fo = fm.getJavaFileForInput(StandardLocation.CLASS_PATH, "dummy", JavaFileObject.Kind.CLASS);
+            System.err.println("file: " + fo);
+            URI uri = fo.toUri();
+            System.err.println("uri: " + uri);
+            if (uri.toString().contains(" "))
+                throw new Exception("unexpected space character found");
+        }
     }
 
     File createJar() throws IOException {
--- a/langtools/test/tools/javac/api/T6501502.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/T6501502.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -46,16 +46,18 @@
     // we test a number of platform-independent paths.
     void run() throws Exception {
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        fm = c.getStandardFileManager(null, null, null);
-        System.err.println(System.getProperties());
-        File tmpDir = new File(System.getProperty("java.io.tmpdir"));
-        File testSrcDir = new File(System.getProperty("test.src"));
-        File testClassesDir = new File(System.getProperty("test.classes"));
-        test(new File("abc.tmp"));
-        test(new File(tmpDir, "bad.file"));
-        test(new File(testSrcDir, "T6501501.java"));
-        test(new File(testClassesDir, "T6501501.class"));
-        test(new File("a b"));
+        try (StandardJavaFileManager sfm = c.getStandardFileManager(null, null, null)) {
+            fm = sfm;
+            System.err.println(System.getProperties());
+            File tmpDir = new File(System.getProperty("java.io.tmpdir"));
+            File testSrcDir = new File(System.getProperty("test.src"));
+            File testClassesDir = new File(System.getProperty("test.classes"));
+            test(new File("abc.tmp"));
+            test(new File(tmpDir, "bad.file"));
+            test(new File(testSrcDir, "T6501501.java"));
+            test(new File(testClassesDir, "T6501501.class"));
+            test(new File("a b"));
+        }
     }
 
     void test(File f) throws Exception {
--- a/langtools/test/tools/javac/api/TestClientCodeWrapper.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestClientCodeWrapper.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -56,34 +56,36 @@
      */
     void run() throws Exception {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        defaultFileManager = compiler.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            defaultFileManager = fm;
 
-        for (Method m: getMethodsExcept(JavaFileManager.class, "close", "getJavaFileForInput")) {
-            test(m);
-        }
+            for (Method m: getMethodsExcept(JavaFileManager.class, "close", "getJavaFileForInput")) {
+                test(m);
+            }
 
-        for (Method m: getMethodsExcept(FileObject.class, "delete")) {
-            test(m);
-        }
+            for (Method m: getMethodsExcept(FileObject.class, "delete")) {
+                test(m);
+            }
 
-        for (Method m: getMethods(JavaFileObject.class)) {
-            test(m);
-        }
+            for (Method m: getMethods(JavaFileObject.class)) {
+                test(m);
+            }
 
-        for (Method m: getMethodsExcept(Processor.class, "getCompletions")) {
-            test(m);
-        }
+            for (Method m: getMethodsExcept(Processor.class, "getCompletions")) {
+                test(m);
+            }
 
-        for (Method m: DiagnosticListener.class.getDeclaredMethods()) {
-            test(m);
+            for (Method m: DiagnosticListener.class.getDeclaredMethods()) {
+                test(m);
+            }
+
+            for (Method m: TaskListener.class.getDeclaredMethods()) {
+                test(m);
+            }
+
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
         }
-
-        for (Method m: TaskListener.class.getDeclaredMethods()) {
-            test(m);
-        }
-
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
     }
 
     /** Get a sorted set of the methods declared on a class. */
--- a/langtools/test/tools/javac/api/TestDocComments.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestDocComments.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -52,23 +52,23 @@
         File file = new File(testSrc, "TestDocComments.java");
 
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        Iterable<? extends JavaFileObject> fileObjects = fm.getJavaFileObjects(file);
-        JavacTask task = tool.getTask(pw, fm, null, null, null, fileObjects);
-        Iterable<? extends CompilationUnitTree> units = task.parse();
-        Trees trees = Trees.instance(task);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            Iterable<? extends JavaFileObject> fileObjects = fm.getJavaFileObjects(file);
+            JavacTask task = tool.getTask(pw, fm, null, null, null, fileObjects);
+            Iterable<? extends CompilationUnitTree> units = task.parse();
+            Trees trees = Trees.instance(task);
 
-        CommentScanner s = new CommentScanner();
-        int n = s.scan(units, trees);
+            CommentScanner s = new CommentScanner();
+            int n = s.scan(units, trees);
 
-        if (n != 12)
-            error("Unexpected number of doc comments found: " + n);
+            if (n != 12)
+                error("Unexpected number of doc comments found: " + n);
 
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
+        }
     }
 
     /**
--- a/langtools/test/tools/javac/api/TestGetElementReference.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestGetElementReference.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -50,31 +50,32 @@
 
     public static void main(String... args) throws IOException {
         File source = new File(System.getProperty("test.src", "."), "TestGetElementReferenceData.java").getAbsoluteFile();
-        StandardJavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
-        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
-        JavacTask ct = (JavacTask) ToolProvider.getSystemJavaCompiler().getTask(null, null, diagnostics, Arrays.asList("-Xjcov"), null, fm.getJavaFileObjects(source));
-        Trees trees = Trees.instance(ct);
-        CompilationUnitTree cut = ct.parse().iterator().next();
+        try (StandardJavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) {
+            DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
+            JavacTask ct = (JavacTask) ToolProvider.getSystemJavaCompiler().getTask(null, null, diagnostics, Arrays.asList("-Xjcov"), null, fm.getJavaFileObjects(source));
+            Trees trees = Trees.instance(ct);
+            CompilationUnitTree cut = ct.parse().iterator().next();
 
-        ct.analyze();
+            ct.analyze();
 
-        for (Diagnostic<? extends JavaFileObject> d : diagnostics.getDiagnostics()) {
-            if (d.getKind() == Diagnostic.Kind.ERROR) {
-                throw new IllegalStateException("Should have been attributed without errors: " + diagnostics.getDiagnostics());
+            for (Diagnostic<? extends JavaFileObject> d : diagnostics.getDiagnostics()) {
+                if (d.getKind() == Diagnostic.Kind.ERROR) {
+                    throw new IllegalStateException("Should have been attributed without errors: " + diagnostics.getDiagnostics());
+                }
             }
-        }
 
-        Pattern p = Pattern.compile("/\\*getElement:(.*?)\\*/");
-        Matcher m = p.matcher(cut.getSourceFile().getCharContent(false));
+            Pattern p = Pattern.compile("/\\*getElement:(.*?)\\*/");
+            Matcher m = p.matcher(cut.getSourceFile().getCharContent(false));
 
-        while (m.find()) {
-            TreePath tp = pathFor(trees, cut, m.start() - 1);
-            Element found = trees.getElement(tp);
-            String expected = m.group(1);
-            String actual = found != null ? found.getKind() + ":" + symbolToString(found) : "<null>";
+            while (m.find()) {
+                TreePath tp = pathFor(trees, cut, m.start() - 1);
+                Element found = trees.getElement(tp);
+                String expected = m.group(1);
+                String actual = found != null ? found.getKind() + ":" + symbolToString(found) : "<null>";
 
-            if (!expected.equals(actual)) {
-                throw new IllegalStateException("expected=" + expected + "; actual=" + actual);
+                if (!expected.equals(actual)) {
+                    throw new IllegalStateException("expected=" + expected + "; actual=" + actual);
+                }
             }
         }
     }
--- a/langtools/test/tools/javac/api/TestGetScope.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestGetScope.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -29,6 +29,7 @@
 
 import com.sun.source.tree.IdentifierTree;
 import java.io.File;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -51,24 +52,25 @@
 
 @SupportedAnnotationTypes("*")
 public class TestGetScope extends AbstractProcessor {
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         new TestGetScope().run();
     }
 
-    public void run() {
+    public void run() throws IOException {
         File srcDir = new File(System.getProperty("test.src"));
         File thisFile = new File(srcDir, getClass().getName() + ".java");
 
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
 
-        List<String> opts = Arrays.asList("-proc:only", "-doe");
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(thisFile);
-        JavacTask t = (JavacTask) c.getTask(null, fm, null, opts, null, files);
-        t.setProcessors(Collections.singleton(this));
-        boolean ok = t.call();
-        if (!ok)
-            throw new Error("compilation failed");
+            List<String> opts = Arrays.asList("-proc:only", "-doe");
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(thisFile);
+            JavacTask t = (JavacTask) c.getTask(null, fm, null, opts, null, files);
+            t.setProcessors(Collections.singleton(this));
+            boolean ok = t.call();
+            if (!ok)
+                throw new Error("compilation failed");
+        }
     }
 
     @Override
--- a/langtools/test/tools/javac/api/TestJavacTask.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestJavacTask.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -41,8 +41,8 @@
 
 public class TestJavacTask {
     static final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+    static final StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
     static JavacTaskImpl getTask(File... file) {
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
         Iterable<? extends JavaFileObject> files =
             fm.getJavaFileObjectsFromFiles(Arrays.asList(file));
         return (JavacTaskImpl)compiler.getTask(null, fm, null, null, null, files);
@@ -69,7 +69,11 @@
     }
 
     public static void main(String... args) throws IOException {
-        basicTest(args);
-        checkKindError();
+        try {
+            basicTest(args);
+            checkKindError();
+        } finally {
+            fm.close();
+        }
     }
 }
--- a/langtools/test/tools/javac/api/TestJavacTaskScanner.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestJavacTaskScanner.java	Wed Jul 05 20:06:12 2017 +0200
@@ -115,7 +115,9 @@
 
     public static void main(String... args) throws IOException {
         String srcdir = System.getProperty("test.src");
-        new TestJavacTaskScanner(new File(srcdir, args[0])).run();
+        try (TestJavacTaskScanner t = new TestJavacTaskScanner(new File(srcdir, args[0]))) {
+            t.run();
+        }
     }
 
     private void testGetAllMembers(TypeElement clazz) {
--- a/langtools/test/tools/javac/api/TestJavacTask_Lock.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestJavacTask_Lock.java	Wed Jul 05 20:06:12 2017 +0200
@@ -67,15 +67,18 @@
     void run() throws Exception {
         comp = ToolProvider.getSystemJavaCompiler();
         fm = comp.getStandardFileManager(null, null, null);
-
-        for (MethodKind first: MethodKind.values()) {
-            for (MethodKind second: MethodKind.values()) {
-                test(first, second);
+        try {
+            for (MethodKind first: MethodKind.values()) {
+                for (MethodKind second: MethodKind.values()) {
+                    test(first, second);
+                }
             }
+
+            if (errors > 0)
+                throw new Exception(errors + " errors found");
+        } finally {
+            fm.close();
         }
-
-        if (errors > 0)
-            throw new Exception(errors + " errors found");
     }
 
     void test(MethodKind first, MethodKind second) {
--- a/langtools/test/tools/javac/api/TestJavacTask_Multiple.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestJavacTask_Multiple.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -68,16 +68,19 @@
     void run() throws Exception {
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
         StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
-        for (TestKind tk: TestKind.values()) {
-            test(comp, fm, tk);
-        }
+        try {
+            for (TestKind tk: TestKind.values()) {
+                test(comp, fm, tk);
+            }
 
-        int expect = TestKind.values().length * MAX_TASKS;
-        if (count != expect) {
-            throw new Exception("Unexpected number of tests completed: " + count
-                    + ", expected: " + expect);
+            int expect = TestKind.values().length * MAX_TASKS;
+            if (count != expect) {
+                throw new Exception("Unexpected number of tests completed: " + count
+                        + ", expected: " + expect);
+            }
+        } finally {
+            fm.close();
         }
-
     }
 
     void test(JavaCompiler comp, StandardJavaFileManager fm, TestKind tk) {
--- a/langtools/test/tools/javac/api/TestJavacTask_ParseAttrGen.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestJavacTask_ParseAttrGen.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -45,14 +45,17 @@
     void run() throws Exception {
         comp = ToolProvider.getSystemJavaCompiler();
         fm = comp.getStandardFileManager(null, null, null);
-
-        final boolean[] booleanValues = { false, true };
-        for (boolean pk: booleanValues) {
-            for (boolean ak: booleanValues) {
-                for (boolean gk: booleanValues) {
-                    test(pk, ak, gk);
+        try {
+            final boolean[] booleanValues = { false, true };
+            for (boolean pk: booleanValues) {
+                for (boolean ak: booleanValues) {
+                    for (boolean gk: booleanValues) {
+                        test(pk, ak, gk);
+                    }
                 }
             }
+        } finally {
+            fm.close();
         }
     }
 
--- a/langtools/test/tools/javac/api/TestResolveError.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestResolveError.java	Wed Jul 05 20:06:12 2017 +0200
@@ -51,7 +51,9 @@
  */
 public class TestResolveError extends ToolTester {
     public static void main(String... args) throws Exception {
-        new TestResolveError().run();
+        try (TestResolveError t = new TestResolveError()) {
+            t.run();
+        }
     }
 
     void run() throws Exception {
--- a/langtools/test/tools/javac/api/TestSearchPaths.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestSearchPaths.java	Wed Jul 05 20:06:12 2017 +0200
@@ -76,30 +76,33 @@
     void run() throws Exception {
         compiler = ToolProvider.getSystemJavaCompiler();
         fileManager = compiler.getStandardFileManager(null, null, null);
-
-        // basic output path
-        testClassOutput();
+        try {
+            // basic output path
+            testClassOutput();
 
-        // basic search paths
-        testClassPath();
-        testSourcePath();
-        testPlatformClassPath();
+            // basic search paths
+            testClassPath();
+            testSourcePath();
+            testPlatformClassPath();
+
+            // annotation processing
+            testAnnotationProcessorPath();
+            testSourceOutput();
 
-        // annotation processing
-        testAnnotationProcessorPath();
-        testSourceOutput();
-
-        // javah equivalent
-        testNativeHeaderOutput();
+            // javah equivalent
+            testNativeHeaderOutput();
 
-        // future-proof: guard against new StandardLocations being added
-        if (!tested.equals(EnumSet.allOf(StandardLocation.class))) {
-            error("not all standard locations have been tested");
-            out.println("not yet tested: " + EnumSet.complementOf(tested));
-        }
+            // future-proof: guard against new StandardLocations being added
+            if (!tested.equals(EnumSet.allOf(StandardLocation.class))) {
+                error("not all standard locations have been tested");
+                out.println("not yet tested: " + EnumSet.complementOf(tested));
+            }
 
-        if (errors > 0) {
-            throw new Exception(errors + " errors occurred");
+            if (errors > 0) {
+                throw new Exception(errors + " errors occurred");
+            }
+        } finally {
+            fileManager.close();
         }
     }
 
--- a/langtools/test/tools/javac/api/TestTreePath.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestTreePath.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -105,17 +105,18 @@
 
     public void run() throws IOException {
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fileManager
-            = compiler.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> tests
-            = fileManager.getJavaFileObjects(writeTestFile());
+        try (StandardJavaFileManager fileManager
+                = compiler.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> tests
+                = fileManager.getJavaFileObjects(writeTestFile());
 
-        JavaCompiler.CompilationTask task =
-            ToolProvider.getSystemJavaCompiler().getTask(
-                    null, null, null,
-                    Arrays.asList("-processor", this.getClass().getName()), null,
-                    tests);
-        task.call();
+            JavaCompiler.CompilationTask task =
+                ToolProvider.getSystemJavaCompiler().getTask(
+                        null, null, null,
+                        Arrays.asList("-processor", this.getClass().getName()), null,
+                        tests);
+            task.call();
+        }
     }
 
     public static void main(String[] args) throws IOException {
--- a/langtools/test/tools/javac/api/TestTrees.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/TestTrees.java	Wed Jul 05 20:06:12 2017 +0200
@@ -74,29 +74,30 @@
                 }
             };
 
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrcDir, self + ".java")));
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrcDir, self + ".java")));
 
-        Iterable<String> opts = Arrays.asList("-d", ".", "-XDcompilePolicy=simple");
+            Iterable<String> opts = Arrays.asList("-d", ".", "-XDcompilePolicy=simple");
 
-        System.err.println("simple compilation, no processing");
-        JavacTask task = tool.getTask(out, fm, dl, opts, null, files);
-        task.setTaskListener(new MyTaskListener(task));
-        if (!task.call())
-            throw new AssertionError("compilation failed");
+            System.err.println("simple compilation, no processing");
+            JavacTask task = tool.getTask(out, fm, dl, opts, null, files);
+            task.setTaskListener(new MyTaskListener(task));
+            if (!task.call())
+                throw new AssertionError("compilation failed");
 
-        opts =  Arrays.asList("-d", ".", "-processorpath", testClassDir, "-processor", self,
-            "-XDcompilePolicy=simple");
+            opts =  Arrays.asList("-d", ".", "-processorpath", testClassDir, "-processor", self,
+                "-XDcompilePolicy=simple");
 
-        System.err.println();
-        System.err.println("compilation with processing");
-        task = tool.getTask(out, fm, dl,opts, null, files);
-        if (!task.call())
-            throw new AssertionError("compilation failed");
+            System.err.println();
+            System.err.println("compilation with processing");
+            task = tool.getTask(out, fm, dl,opts, null, files);
+            if (!task.call())
+                throw new AssertionError("compilation failed");
 
-        if (errors > 0)
-            throw new AssertionError(errors + " errors occurred");
+            if (errors > 0)
+                throw new AssertionError(errors + " errors occurred");
+        }
     }
 
     void testElement(Trees trees, Element e) {
--- a/langtools/test/tools/javac/api/guide/Test.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/guide/Test.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -80,7 +80,9 @@
     }
 
     public static void main(String... args) throws Exception {
-        new Test().test(args);
+        try (Test t = new Test()) {
+            t.test(args);
+        }
     }
 
 }
--- a/langtools/test/tools/javac/api/lib/ToolTester.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/lib/ToolTester.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -31,7 +31,7 @@
 import static javax.tools.StandardLocation.SOURCE_PATH;
 import static javax.tools.StandardLocation.CLASS_OUTPUT;
 
-public class ToolTester {
+public class ToolTester implements AutoCloseable {
     public final File test_src     = new File(System.getProperty("test.src", "."));
     public final File test_classes = new File(System.getProperty("test.classes", "."));
     public final List<File> test_class_path = pathToFiles(System.getProperty("test.class.path"),
@@ -77,4 +77,9 @@
         result.addAll(b);
         return result;
     }
+
+    @Override
+    public void close() throws IOException {
+        fm.close();
+    }
 }
--- a/langtools/test/tools/javac/api/taskListeners/CompileEvent.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/taskListeners/CompileEvent.java	Wed Jul 05 20:06:12 2017 +0200
@@ -73,18 +73,19 @@
         assertOutput(out.toString());
 
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> testFileObjects = fm.getJavaFileObjects(test);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> testFileObjects = fm.getJavaFileObjects(test);
 
-        //test events fired to listeners registered from plugins
-        //when starting compiler using JavaCompiler.getTask(...).call
-        List<String> options =
-                Arrays.asList("-Xplugin:compile-event", "-processorpath", testClasses);
-        out = new StringWriter();
-        boolean compResult = comp.getTask(out, null, null, options, null, testFileObjects).call();
-        if (!compResult)
-            throw new AssertionError("Compilation failed unexpectedly.");
-        assertOutput(out.toString());
+            //test events fired to listeners registered from plugins
+            //when starting compiler using JavaCompiler.getTask(...).call
+            List<String> options =
+                    Arrays.asList("-Xplugin:compile-event", "-processorpath", testClasses);
+            out = new StringWriter();
+            boolean compResult = comp.getTask(out, null, null, options, null, testFileObjects).call();
+            if (!compResult)
+                throw new AssertionError("Compilation failed unexpectedly.");
+            assertOutput(out.toString());
+        }
     }
 
     void assertOutput(String found) {
--- a/langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -44,7 +44,12 @@
     StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
 
     public static void main(String... args) throws IOException {
-        new EventsBalancedTest().test();
+        EventsBalancedTest t = new EventsBalancedTest();
+        try {
+            t.test();
+        } finally {
+            t.fm.close();
+        }
     }
 
     void test() throws IOException {
--- a/langtools/test/tools/javac/api/taskListeners/TestSimpleAddRemove.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/api/taskListeners/TestSimpleAddRemove.java	Wed Jul 05 20:06:12 2017 +0200
@@ -203,7 +203,12 @@
     }
 
     public static void main(String... args) throws Exception {
-        new TestSimpleAddRemove().run();
+        TestSimpleAddRemove t = new TestSimpleAddRemove();
+        try {
+            t.run();
+        } finally {
+            t.fm.close();
+        }
     }
 
     JavacTool tool = (JavacTool) ToolProvider.getSystemJavaCompiler();
--- a/langtools/test/tools/javac/cast/intersection/IntersectionTypeParserTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/cast/intersection/IntersectionTypeParserTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -104,35 +104,36 @@
     public static void main(String... args) throws Exception {
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (CastKind ck : CastKind.values()) {
-            for (TypeKind t1 : TypeKind.values()) {
-                for (ArrayKind ak1 : ArrayKind.values()) {
-                    Type typ1 = new Type(t1, ak1);
-                    if (ck.nBounds == 1) {
-                        new IntersectionTypeParserTest(ck, typ1).run(comp, fm);
-                        continue;
-                    }
-                    for (TypeKind t2 : TypeKind.values()) {
-                        for (ArrayKind ak2 : ArrayKind.values()) {
-                            Type typ2 = new Type(t2, ak2);
-                            if (ck.nBounds == 2) {
-                                new IntersectionTypeParserTest(ck, typ1, typ2).run(comp, fm);
-                                continue;
-                            }
-                            for (TypeKind t3 : TypeKind.values()) {
-                                for (ArrayKind ak3 : ArrayKind.values()) {
-                                    Type typ3 = new Type(t3, ak3);
-                                    new IntersectionTypeParserTest(ck, typ1, typ2, typ3).run(comp, fm);
+            for (CastKind ck : CastKind.values()) {
+                for (TypeKind t1 : TypeKind.values()) {
+                    for (ArrayKind ak1 : ArrayKind.values()) {
+                        Type typ1 = new Type(t1, ak1);
+                        if (ck.nBounds == 1) {
+                            new IntersectionTypeParserTest(ck, typ1).run(comp, fm);
+                            continue;
+                        }
+                        for (TypeKind t2 : TypeKind.values()) {
+                            for (ArrayKind ak2 : ArrayKind.values()) {
+                                Type typ2 = new Type(t2, ak2);
+                                if (ck.nBounds == 2) {
+                                    new IntersectionTypeParserTest(ck, typ1, typ2).run(comp, fm);
+                                    continue;
+                                }
+                                for (TypeKind t3 : TypeKind.values()) {
+                                    for (ArrayKind ak3 : ArrayKind.values()) {
+                                        Type typ3 = new Type(t3, ak3);
+                                        new IntersectionTypeParserTest(ck, typ1, typ2, typ3).run(comp, fm);
+                                    }
                                 }
                             }
                         }
                     }
                 }
             }
+            System.out.println("Total check executed: " + checkCount);
         }
-        System.out.println("Total check executed: " + checkCount);
     }
 
     CastKind ck;
--- a/langtools/test/tools/javac/classreader/T7031108.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/classreader/T7031108.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -68,39 +68,40 @@
 
     void run() throws Exception {
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        // step 1: compile test classes
-        File cwd = new File(".");
-        fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(cwd));
-        compile(comp, fm, null, null, pC);
+            // step 1: compile test classes
+            File cwd = new File(".");
+            fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(cwd));
+            compile(comp, fm, null, null, pC);
 
-        // step 2: verify functioning of processor
-        fm.setLocation(StandardLocation.ANNOTATION_PROCESSOR_PATH,
-                fm.getLocation(StandardLocation.CLASS_PATH));
-        fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(cwd));
-        compile(comp, fm, null, getClass().getName(), dummy);
+            // step 2: verify functioning of processor
+            fm.setLocation(StandardLocation.ANNOTATION_PROCESSOR_PATH,
+                    fm.getLocation(StandardLocation.CLASS_PATH));
+            fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(cwd));
+            compile(comp, fm, null, getClass().getName(), dummy);
 
-        File pC_class = new File(new File("p"), "C.class");
-        pC_class.delete();
+            File pC_class = new File(new File("p"), "C.class");
+            pC_class.delete();
 
-        DiagnosticCollector<JavaFileObject> dc = new DiagnosticCollector<JavaFileObject>();
-        compile(comp, fm, dc, getClass().getName(), dummy);
-        List<Diagnostic<? extends JavaFileObject>> diags =dc.getDiagnostics();
+            DiagnosticCollector<JavaFileObject> dc = new DiagnosticCollector<JavaFileObject>();
+            compile(comp, fm, dc, getClass().getName(), dummy);
+            List<Diagnostic<? extends JavaFileObject>> diags =dc.getDiagnostics();
 
-        System.err.println(diags);
-        switch (diags.size()) {
-            case 0:
-                throw new Exception("no diagnostics received");
-            case 1:
-                String code = diags.get(0).getCode();
-                String expect = "compiler.err.proc.cant.access.1";
-                if (!expect.equals(code))
-                    throw new Exception("unexpected diag code: " + code
-                            + ", expected: " + expect);
-                break;
-            default:
-                throw new Exception("unexpected diags received");
+            System.err.println(diags);
+            switch (diags.size()) {
+                case 0:
+                    throw new Exception("no diagnostics received");
+                case 1:
+                    String code = diags.get(0).getCode();
+                    String expect = "compiler.err.proc.cant.access.1";
+                    if (!expect.equals(code))
+                        throw new Exception("unexpected diag code: " + code
+                                + ", expected: " + expect);
+                    break;
+                default:
+                    throw new Exception("unexpected diags received");
+            }
         }
     }
 
--- a/langtools/test/tools/javac/defaultMethods/DefaultMethodFlags.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/defaultMethods/DefaultMethodFlags.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -54,31 +54,32 @@
 
     void checkDefaultMethodFlags() throws IOException {
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> fos =
-                fm.getJavaFileObjectsFromFiles(
-                Arrays.asList(new File(
-                System.getProperty("test.src"),
-                this.getClass().getSimpleName() + ".java")));
-        JavacTask task = (JavacTask) c.getTask(null, fm, null, null, null, fos);
+        try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> fos =
+                    fm.getJavaFileObjectsFromFiles(
+                    Arrays.asList(new File(
+                    System.getProperty("test.src"),
+                    this.getClass().getSimpleName() + ".java")));
+            JavacTask task = (JavacTask) c.getTask(null, fm, null, null, null, fos);
 
-        task.addTaskListener(new TaskListener() {
+            task.addTaskListener(new TaskListener() {
 
-            @Override
-            public void started(TaskEvent e) {}
+                @Override
+                public void started(TaskEvent e) {}
 
-            @Override
-            public void finished(TaskEvent e) {
-                if (e.getKind() == TaskEvent.Kind.ANALYZE) {
-                    TypeElement te = e.getTypeElement();
-                    if (te.getSimpleName().toString().equals("I")) {
-                        checkDefaultInterface(te);
+                @Override
+                public void finished(TaskEvent e) {
+                    if (e.getKind() == TaskEvent.Kind.ANALYZE) {
+                        TypeElement te = e.getTypeElement();
+                        if (te.getSimpleName().toString().equals("I")) {
+                            checkDefaultInterface(te);
+                        }
                     }
                 }
-            }
-        });
+            });
 
-        task.analyze();
+            task.analyze();
+        }
     }
 
     void checkDefaultInterface(TypeElement te) {
--- a/langtools/test/tools/javac/defaultMethods/static/hiding/InterfaceMethodHidingTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/defaultMethods/static/hiding/InterfaceMethodHidingTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -123,18 +123,19 @@
 
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (MethodKind mk1 : MethodKind.values()) {
-            for (SignatureKind sk1 : SignatureKind.values()) {
-                for (BodyExpr be1 : BodyExpr.values()) {
-                    for (MethodKind mk2 : MethodKind.values()) {
-                        for (SignatureKind sk2 : SignatureKind.values()) {
-                            for (BodyExpr be2 : BodyExpr.values()) {
-                                for (MethodKind mk3 : MethodKind.values()) {
-                                    for (SignatureKind sk3 : SignatureKind.values()) {
-                                        for (BodyExpr be3 : BodyExpr.values()) {
-                                            new InterfaceMethodHidingTest(mk1, mk2, mk3, sk1, sk2, sk3, be1, be2, be3).run(comp, fm);
+            for (MethodKind mk1 : MethodKind.values()) {
+                for (SignatureKind sk1 : SignatureKind.values()) {
+                    for (BodyExpr be1 : BodyExpr.values()) {
+                        for (MethodKind mk2 : MethodKind.values()) {
+                            for (SignatureKind sk2 : SignatureKind.values()) {
+                                for (BodyExpr be2 : BodyExpr.values()) {
+                                    for (MethodKind mk3 : MethodKind.values()) {
+                                        for (SignatureKind sk3 : SignatureKind.values()) {
+                                            for (BodyExpr be3 : BodyExpr.values()) {
+                                                new InterfaceMethodHidingTest(mk1, mk2, mk3, sk1, sk2, sk3, be1, be2, be3).run(comp, fm);
+                                            }
                                         }
                                     }
                                 }
@@ -143,8 +144,8 @@
                     }
                 }
             }
+            System.out.println("Total check executed: " + checkCount);
         }
-        System.out.println("Total check executed: " + checkCount);
     }
 
     MethodKind mk1, mk2, mk3;
--- a/langtools/test/tools/javac/defaultMethods/syntax/TestDefaultMethodsSyntax.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/defaultMethods/syntax/TestDefaultMethodsSyntax.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -188,20 +188,21 @@
 
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (VersionKind vk : VersionKind.values()) {
-            for (EnclosingKind ek : EnclosingKind.values()) {
-                for (MethodKind mk : MethodKind.values()) {
-                    for (ModifierKind modk1 : ModifierKind.values()) {
-                        for (ModifierKind modk2 : ModifierKind.values()) {
-                            new TestDefaultMethodsSyntax(vk, ek, mk, modk1, modk2).run(comp, fm);
+            for (VersionKind vk : VersionKind.values()) {
+                for (EnclosingKind ek : EnclosingKind.values()) {
+                    for (MethodKind mk : MethodKind.values()) {
+                        for (ModifierKind modk1 : ModifierKind.values()) {
+                            for (ModifierKind modk2 : ModifierKind.values()) {
+                                new TestDefaultMethodsSyntax(vk, ek, mk, modk1, modk2).run(comp, fm);
+                            }
                         }
                     }
                 }
             }
+            System.out.println("Total check executed: " + checkCount);
         }
-        System.out.println("Total check executed: " + checkCount);
     }
 
     VersionKind vk;
--- a/langtools/test/tools/javac/diags/CheckResourceKeys.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/diags/CheckResourceKeys.java	Wed Jul 05 20:06:12 2017 +0200
@@ -313,27 +313,28 @@
     Set<String> getCodeStrings() throws IOException {
         Set<String> results = new TreeSet<String>();
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        JavaFileManager fm = c.getStandardFileManager(null, null, null);
-        JavaFileManager.Location javacLoc = findJavacLocation(fm);
-        String[] pkgs = {
-            "javax.annotation.processing",
-            "javax.lang.model",
-            "javax.tools",
-            "com.sun.source",
-            "com.sun.tools.javac"
-        };
-        for (String pkg: pkgs) {
-            for (JavaFileObject fo: fm.list(javacLoc,
-                    pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) {
-                String name = fo.getName();
-                // ignore resource files, and files which are not really part of javac
-                if (name.matches(".*resources.[A-Za-z_0-9]+\\.class.*")
-                        || name.matches(".*CreateSymbols\\.class.*"))
-                    continue;
-                scan(fo, results);
+        try (JavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            JavaFileManager.Location javacLoc = findJavacLocation(fm);
+            String[] pkgs = {
+                "javax.annotation.processing",
+                "javax.lang.model",
+                "javax.tools",
+                "com.sun.source",
+                "com.sun.tools.javac"
+            };
+            for (String pkg: pkgs) {
+                for (JavaFileObject fo: fm.list(javacLoc,
+                        pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) {
+                    String name = fo.getName();
+                    // ignore resource files, and files which are not really part of javac
+                    if (name.matches(".*resources.[A-Za-z_0-9]+\\.class.*")
+                            || name.matches(".*CreateSymbols\\.class.*"))
+                        continue;
+                    scan(fo, results);
+                }
             }
+            return results;
         }
-        return results;
     }
 
     // depending on how the test is run, javac may be on bootclasspath or classpath
--- a/langtools/test/tools/javac/doclint/DocLintTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/doclint/DocLintTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -109,44 +109,48 @@
     void run() throws Exception {
         javac = ToolProvider.getSystemJavaCompiler();
         fm = javac.getStandardFileManager(null, null, null);
-        fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
-        file = new SimpleJavaFileObject(URI.create("Test.java"), JavaFileObject.Kind.SOURCE) {
-            @Override
-            public CharSequence getCharContent(boolean ignoreEncoding) {
-                return code;
-            }
-        };
+        try {
+            fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
+            file = new SimpleJavaFileObject(URI.create("Test.java"), JavaFileObject.Kind.SOURCE) {
+                @Override
+                public CharSequence getCharContent(boolean ignoreEncoding) {
+                    return code;
+                }
+            };
 
-        test(Collections.<String>emptyList(),
-                Main.Result.OK,
-                EnumSet.noneOf(Message.class));
+            test(Collections.<String>emptyList(),
+                    Main.Result.OK,
+                    EnumSet.noneOf(Message.class));
 
-        test(Arrays.asList("-Xdoclint:none"),
-                Main.Result.OK,
-                EnumSet.noneOf(Message.class));
+            test(Arrays.asList("-Xdoclint:none"),
+                    Main.Result.OK,
+                    EnumSet.noneOf(Message.class));
+
+            test(Arrays.asList(rawDiags, "-Xdoclint"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR6, Message.DL_ERR9, Message.DL_WRN12));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR6, Message.DL_ERR9, Message.DL_WRN12));
+            test(Arrays.asList(rawDiags, "-Xdoclint:all/public"),
+                    Main.Result.OK,
+                    EnumSet.of(Message.DL_WRN12));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:all/public"),
-                Main.Result.OK,
-                EnumSet.of(Message.DL_WRN12));
+            test(Arrays.asList(rawDiags, "-Xdoclint:syntax"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR6, Message.DL_WRN12));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:syntax"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR6, Message.DL_WRN12));
+            test(Arrays.asList(rawDiags, "-Xdoclint:reference"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR9));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:reference"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR9));
+            test(Arrays.asList(rawDiags, "-Xdoclint:badarg"),
+                    Main.Result.CMDERR,
+                    EnumSet.of(Message.OPT_BADARG));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:badarg"),
-                Main.Result.CMDERR,
-                EnumSet.of(Message.OPT_BADARG));
-
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
+        } finally {
+            fm.close();
+        }
     }
 
     void test(List<String> opts, Main.Result expectResult, Set<Message> expectMessages) {
--- a/langtools/test/tools/javac/doctree/DocTreePathScannerTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/doctree/DocTreePathScannerTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -66,22 +66,23 @@
         }
 
         JavacTool javac = JavacTool.create();
-        StandardJavaFileManager fm = javac.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = javac.getStandardFileManager(null, null, null)) {
+
+            Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjectsFromFiles(files);
 
-        Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjectsFromFiles(files);
+            JavacTask t = javac.getTask(null, fm, null, null, null, fos);
+            DocTrees trees = DocTrees.instance(t);
 
-        JavacTask t = javac.getTask(null, fm, null, null, null, fos);
-        DocTrees trees = DocTrees.instance(t);
+            Iterable<? extends CompilationUnitTree> units = t.parse();
 
-        Iterable<? extends CompilationUnitTree> units = t.parse();
+            DeclScanner ds = new DeclScanner(trees);
+            for (CompilationUnitTree unit: units) {
+                ds.scan(unit, null);
+            }
 
-        DeclScanner ds = new DeclScanner(trees);
-        for (CompilationUnitTree unit: units) {
-            ds.scan(unit, null);
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
         }
-
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
     }
 
     void error(String msg) {
--- a/langtools/test/tools/javac/doctree/SimpleDocTreeVisitorTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/doctree/SimpleDocTreeVisitorTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -66,28 +66,29 @@
         }
 
         JavacTool javac = JavacTool.create();
-        StandardJavaFileManager fm = javac.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = javac.getStandardFileManager(null, null, null)) {
 
-        Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjectsFromFiles(files);
+            Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjectsFromFiles(files);
 
-        JavacTask t = javac.getTask(null, fm, null, null, null, fos);
-        DocTrees trees = DocTrees.instance(t);
+            JavacTask t = javac.getTask(null, fm, null, null, null, fos);
+            DocTrees trees = DocTrees.instance(t);
 
-        Iterable<? extends CompilationUnitTree> units = t.parse();
+            Iterable<? extends CompilationUnitTree> units = t.parse();
 
-        Set<DocTree.Kind> found = EnumSet.noneOf(DocTree.Kind.class);
-        DeclScanner ds = new DeclScanner(trees, found);
-        for (CompilationUnitTree unit: units) {
-            ds.scan(unit, null);
-        }
+            Set<DocTree.Kind> found = EnumSet.noneOf(DocTree.Kind.class);
+            DeclScanner ds = new DeclScanner(trees, found);
+            for (CompilationUnitTree unit: units) {
+                ds.scan(unit, null);
+            }
 
-        for (DocTree.Kind k: DocTree.Kind.values()) {
-            if (!found.contains(k) && k != DocTree.Kind.OTHER)
-                error("not found: " + k);
+            for (DocTree.Kind k: DocTree.Kind.values()) {
+                if (!found.contains(k) && k != DocTree.Kind.OTHER)
+                    error("not found: " + k);
+            }
+
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
         }
-
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
     }
 
     void error(String msg) {
--- a/langtools/test/tools/javac/file/T7068451.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/file/T7068451.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -47,6 +47,7 @@
 import javax.tools.Diagnostic.Kind;
 import javax.tools.JavaCompiler;
 import javax.tools.JavaCompiler.CompilationTask;
+import javax.tools.StandardJavaFileManager;
 import javax.tools.StandardLocation;
 import javax.tools.ToolProvider;
 
@@ -75,34 +76,36 @@
         System.err.println("FIRST compilation");
         System.err.println();
 
-        CompilationTask task = compiler.getTask(null, null, null, opts, null,
-                compiler.getStandardFileManager(null, null, null).getJavaFileObjects(input));
-        task.setProcessors(Collections.singleton(new Proc("first")));
-        check("compilation", task.call());
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            CompilationTask task = compiler.getTask(null, fm, null, opts, null,
+                    fm.getJavaFileObjects(input));
+            task.setProcessors(Collections.singleton(new Proc("first")));
+            check("compilation", task.call());
 
-        writeFile(tmp, "X.java", "package p; class X { { p.C.second(); } }");
+            writeFile(tmp, "X.java", "package p; class X { { p.C.second(); } }");
 
-        //Thread.sleep(2000);
+            //Thread.sleep(2000);
 
-        System.err.println();
-        System.err.println("SECOND compilation");
-        System.err.println();
+            System.err.println();
+            System.err.println("SECOND compilation");
+            System.err.println();
 
-        task = compiler.getTask(null, null, null, opts, null,
-                compiler.getStandardFileManager(null, null, null).getJavaFileObjects(input));
-        task.setProcessors(Collections.singleton(new Proc("second")));
-        check("compilation", task.call());
+            task = compiler.getTask(null, fm, null, opts, null,
+                    fm.getJavaFileObjects(input));
+            task.setProcessors(Collections.singleton(new Proc("second")));
+            check("compilation", task.call());
 
-        //Thread.sleep(2000);
+            //Thread.sleep(2000);
 
-        System.err.println();
-        System.err.println("SECOND compilation, REPEATED");
-        System.err.println();
+            System.err.println();
+            System.err.println("SECOND compilation, REPEATED");
+            System.err.println();
 
-        task = compiler.getTask(null, null, null, opts, null,
-                compiler.getStandardFileManager(null, null, null).getJavaFileObjects(input));
-        task.setProcessors(Collections.singleton(new Proc("second")));
-        check("compilation", task.call());
+            task = compiler.getTask(null, fm, null, opts, null,
+                    fm.getJavaFileObjects(input));
+            task.setProcessors(Collections.singleton(new Proc("second")));
+            check("compilation", task.call());
+        }
     }
 
     void check(String msg, boolean ok) {
--- a/langtools/test/tools/javac/flow/LVTHarness.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/flow/LVTHarness.java	Wed Jul 05 20:06:12 2017 +0200
@@ -76,18 +76,21 @@
     static final StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
 
     public static void main(String[] args) throws Exception {
+        try {
+            String testDir = System.getProperty("test.src");
+            fm.setLocation(SOURCE_PATH, Arrays.asList(new File(testDir, "tests")));
 
-        String testDir = System.getProperty("test.src");
-        fm.setLocation(SOURCE_PATH, Arrays.asList(new File(testDir, "tests")));
+            // Make sure classes are written to scratch dir.
+            fm.setLocation(CLASS_OUTPUT, Arrays.asList(new File(".")));
 
-        // Make sure classes are written to scratch dir.
-        fm.setLocation(CLASS_OUTPUT, Arrays.asList(new File(".")));
-
-        for (JavaFileObject jfo : fm.list(SOURCE_PATH, "", Collections.singleton(SOURCE), true)) {
-            new LVTHarness(jfo).check();
-        }
-        if (nerrors > 0) {
-            throw new AssertionError("Errors were found");
+            for (JavaFileObject jfo : fm.list(SOURCE_PATH, "", Collections.singleton(SOURCE), true)) {
+                new LVTHarness(jfo).check();
+            }
+            if (nerrors > 0) {
+                throw new AssertionError("Errors were found");
+            }
+        } finally {
+            fm.close();
         }
     }
 
--- a/langtools/test/tools/javac/generics/bridges/BridgeHarness.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/generics/bridges/BridgeHarness.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -70,19 +70,23 @@
     static final StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
 
     public static void main(String[] args) throws Exception {
-        //set sourcepath
-        fm.setLocation(SOURCE_PATH,
-                Arrays.asList(new File(System.getProperty("test.src"), "tests")));
-        //set output (-d)
-        fm.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT,
-                Arrays.asList(new File(System.getProperty("user.dir"))));
-        for (JavaFileObject jfo : fm.list(SOURCE_PATH, "", Collections.singleton(JavaFileObject.Kind.SOURCE), true)) {
-            //for each source, compile and check against annotations
-            new BridgeHarness(jfo).compileAndCheck();
-        }
-        //if there were errors, fail
-        if (nerrors > 0) {
-            throw new AssertionError("Errors were found");
+        try {
+            //set sourcepath
+            fm.setLocation(SOURCE_PATH,
+                    Arrays.asList(new File(System.getProperty("test.src"), "tests")));
+            //set output (-d)
+            fm.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT,
+                    Arrays.asList(new File(System.getProperty("user.dir"))));
+            for (JavaFileObject jfo : fm.list(SOURCE_PATH, "", Collections.singleton(JavaFileObject.Kind.SOURCE), true)) {
+                //for each source, compile and check against annotations
+                new BridgeHarness(jfo).compileAndCheck();
+            }
+            //if there were errors, fail
+            if (nerrors > 0) {
+                throw new AssertionError("Errors were found");
+            }
+        } finally {
+            fm.close();
         }
     }
 
--- a/langtools/test/tools/javac/generics/diamond/7030150/GenericConstructorAndDiamondTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/generics/diamond/7030150/GenericConstructorAndDiamondTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -150,17 +150,17 @@
 
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
-
-        for (BoundKind boundKind : BoundKind.values()) {
-            for (ConstructorKind constructorKind : ConstructorKind.values()) {
-                for (TypeArgumentKind declArgKind : TypeArgumentKind.values()) {
-                    for (TypeArgArity arity : TypeArgArity.values()) {
-                        for (TypeArgumentKind useArgKind : TypeArgumentKind.values()) {
-                            for (TypeArgumentKind diamondArgKind : TypeArgumentKind.values()) {
-                                for (ArgumentKind argKind : ArgumentKind.values()) {
-                                    new GenericConstructorAndDiamondTest(boundKind, constructorKind,
-                                            declArgKind, arity, useArgKind, diamondArgKind, argKind).run(comp, fm);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
+            for (BoundKind boundKind : BoundKind.values()) {
+                for (ConstructorKind constructorKind : ConstructorKind.values()) {
+                    for (TypeArgumentKind declArgKind : TypeArgumentKind.values()) {
+                        for (TypeArgArity arity : TypeArgArity.values()) {
+                            for (TypeArgumentKind useArgKind : TypeArgumentKind.values()) {
+                                for (TypeArgumentKind diamondArgKind : TypeArgumentKind.values()) {
+                                    for (ArgumentKind argKind : ArgumentKind.values()) {
+                                        new GenericConstructorAndDiamondTest(boundKind, constructorKind,
+                                                declArgKind, arity, useArgKind, diamondArgKind, argKind).run(comp, fm);
+                                    }
                                 }
                             }
                         }
--- a/langtools/test/tools/javac/generics/diamond/7030687/ParserTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/generics/diamond/7030687/ParserTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -78,26 +78,27 @@
 
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (TypeQualifierArity arity : TypeQualifierArity.values()) {
-            for (TypeArgumentKind tak1 : TypeArgumentKind.values()) {
-                if (arity == TypeQualifierArity.ONE) {
-                    new ParserTest(arity, tak1).run(comp, fm);
-                    continue;
-                }
-                for (TypeArgumentKind tak2 : TypeArgumentKind.values()) {
-                    if (arity == TypeQualifierArity.TWO) {
-                        new ParserTest(arity, tak1, tak2).run(comp, fm);
+            for (TypeQualifierArity arity : TypeQualifierArity.values()) {
+                for (TypeArgumentKind tak1 : TypeArgumentKind.values()) {
+                    if (arity == TypeQualifierArity.ONE) {
+                        new ParserTest(arity, tak1).run(comp, fm);
                         continue;
                     }
-                    for (TypeArgumentKind tak3 : TypeArgumentKind.values()) {
-                        if (arity == TypeQualifierArity.THREE) {
-                            new ParserTest(arity, tak1, tak2, tak3).run(comp, fm);
+                    for (TypeArgumentKind tak2 : TypeArgumentKind.values()) {
+                        if (arity == TypeQualifierArity.TWO) {
+                            new ParserTest(arity, tak1, tak2).run(comp, fm);
                             continue;
                         }
-                        for (TypeArgumentKind tak4 : TypeArgumentKind.values()) {
-                            new ParserTest(arity, tak1, tak2, tak3, tak4).run(comp, fm);
+                        for (TypeArgumentKind tak3 : TypeArgumentKind.values()) {
+                            if (arity == TypeQualifierArity.THREE) {
+                                new ParserTest(arity, tak1, tak2, tak3).run(comp, fm);
+                                continue;
+                            }
+                            for (TypeArgumentKind tak4 : TypeArgumentKind.values()) {
+                                new ParserTest(arity, tak1, tak2, tak3, tak4).run(comp, fm);
+                            }
                         }
                     }
                 }
--- a/langtools/test/tools/javac/generics/inference/7086601/T7086601b.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/generics/inference/7086601/T7086601b.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -86,18 +86,19 @@
 
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (TypeKind a1 : TypeKind.values()) {
-            for (TypeKind a2 : TypeKind.values()) {
-                for (TypeKind a3 : TypeKind.values()) {
-                    for (MethodCallKind mck : MethodCallKind.values()) {
-                        new T7086601b(a1, a2, a3, mck).run(comp, fm);
+            for (TypeKind a1 : TypeKind.values()) {
+                for (TypeKind a2 : TypeKind.values()) {
+                    for (TypeKind a3 : TypeKind.values()) {
+                        for (MethodCallKind mck : MethodCallKind.values()) {
+                            new T7086601b(a1, a2, a3, mck).run(comp, fm);
+                        }
                     }
                 }
             }
+            System.out.println("Total check executed: " + checkCount);
         }
-        System.out.println("Total check executed: " + checkCount);
     }
 
     TypeKind a1;
--- a/langtools/test/tools/javac/lambda/BadLambdaExpr.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/lambda/BadLambdaExpr.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -105,18 +105,19 @@
 
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (ParameterListKind plk : ParameterListKind.values()) {
-            for (ParameterKind pk : ParameterKind.values()) {
-                for (ArrowKind ak : ArrowKind.values()) {
-                    for (ExprKind ek : ExprKind.values()) {
-                        new BadLambdaExpr(plk, pk, ak, ek).run(comp, fm);
+            for (ParameterListKind plk : ParameterListKind.values()) {
+                for (ParameterKind pk : ParameterKind.values()) {
+                    for (ArrowKind ak : ArrowKind.values()) {
+                        for (ExprKind ek : ExprKind.values()) {
+                            new BadLambdaExpr(plk, pk, ak, ek).run(comp, fm);
+                        }
                     }
                 }
             }
+            System.out.println("Total check executed: " + checkCount);
         }
-        System.out.println("Total check executed: " + checkCount);
     }
 
     ParameterListKind plk;
--- a/langtools/test/tools/javac/lambda/TestSelfRef.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/lambda/TestSelfRef.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -114,22 +114,23 @@
 
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (EnclosingKind ek : EnclosingKind.values()) {
-            for (SiteKind sk : SiteKind.values()) {
-                if (sk == SiteKind.STATIC_INIT && ek == EnclosingKind.MEMBER_INNER)
-                    continue;
-                for (InnerKind ik : InnerKind.values()) {
-                    if (ik != InnerKind.NONE && sk == SiteKind.NONE)
-                        break;
-                    for (RefKind rk : RefKind.values()) {
-                        new TestSelfRef(ek, sk, ik, rk).run(comp, fm);
+            for (EnclosingKind ek : EnclosingKind.values()) {
+                for (SiteKind sk : SiteKind.values()) {
+                    if (sk == SiteKind.STATIC_INIT && ek == EnclosingKind.MEMBER_INNER)
+                        continue;
+                    for (InnerKind ik : InnerKind.values()) {
+                        if (ik != InnerKind.NONE && sk == SiteKind.NONE)
+                            break;
+                        for (RefKind rk : RefKind.values()) {
+                            new TestSelfRef(ek, sk, ik, rk).run(comp, fm);
+                        }
                     }
                 }
             }
+            System.out.println("Total check executed: " + checkCount);
         }
-        System.out.println("Total check executed: " + checkCount);
     }
 
     EnclosingKind ek;
--- a/langtools/test/tools/javac/lambda/intersection/IntersectionTargetTypeTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/lambda/intersection/IntersectionTargetTypeTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -185,14 +185,15 @@
     public static void main(String... args) throws Exception {
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (CastInfo cInfo : allCastInfo()) {
-            for (ExpressionKind ek : ExpressionKind.values()) {
-                new IntersectionTargetTypeTest(cInfo, ek).run(comp, fm);
+            for (CastInfo cInfo : allCastInfo()) {
+                for (ExpressionKind ek : ExpressionKind.values()) {
+                    new IntersectionTargetTypeTest(cInfo, ek).run(comp, fm);
+                }
             }
+            System.out.println("Total check executed: " + checkCount);
         }
-        System.out.println("Total check executed: " + checkCount);
     }
 
     static List<CastInfo> allCastInfo() {
--- a/langtools/test/tools/javac/lambda/methodReference/SamConversionComboTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/lambda/methodReference/SamConversionComboTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -250,13 +250,17 @@
     }
 
     public static void main(String[] args) throws Exception {
-        for(Context ct : Context.values()) {
-            for (FInterface fi : FInterface.values()) {
-                for (MethodDef md: MethodDef.values()) {
-                    new SamConversionComboTest(fi, ct, md).test();
+        try {
+            for(Context ct : Context.values()) {
+                for (FInterface fi : FInterface.values()) {
+                    for (MethodDef md: MethodDef.values()) {
+                        new SamConversionComboTest(fi, ct, md).test();
+                    }
                 }
             }
+            System.out.println("total tests: " + count);
+        } finally {
+            fm.close();
         }
-        System.out.println("total tests: " + count);
     }
 }
--- a/langtools/test/tools/javac/lambdaShapes/org/openjdk/tests/javac/FDTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/lambdaShapes/org/openjdk/tests/javac/FDTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -28,6 +28,7 @@
 import com.sun.source.util.JavacTask;
 import com.sun.tools.javac.util.Pair;
 
+import java.io.IOException;
 import java.net.URI;
 import java.util.Arrays;
 import java.util.ArrayList;
@@ -41,6 +42,7 @@
 import javax.tools.StandardJavaFileManager;
 import javax.tools.ToolProvider;
 
+import org.testng.annotations.AfterSuite;
 import org.testng.annotations.Test;
 import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.DataProvider;
@@ -70,12 +72,19 @@
         fm = comp.getStandardFileManager(null, null, null);
     }
 
+    @AfterSuite
+    static void teardown() throws IOException {
+        fm.close();
+    }
+
     public static void main(String[] args) throws Exception {
         init();
 
         for (Pair<TestKind,Hierarchy> fdtest : generateCases()) {
             runTest(fdtest.fst, fdtest.snd, comp, fm);
         }
+
+        teardown();
     }
 
     @Test(dataProvider = "fdCases")
--- a/langtools/test/tools/javac/nativeHeaders/NativeHeaderTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/nativeHeaders/NativeHeaderTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -193,27 +193,30 @@
     void run() throws Exception {
         javac = JavacTool.create();
         fm = javac.getStandardFileManager(null, null, null);
-
-        for (RunKind rk: RunKind.values()) {
-            for (GenKind gk: GenKind.values()) {
-                for (Method m: getClass().getDeclaredMethods()) {
-                    Annotation a = m.getAnnotation(Test.class);
-                    if (a != null) {
-                        init(rk, gk, m.getName());
-                        try {
-                            m.invoke(this, new Object[] { rk, gk });
-                        } catch (InvocationTargetException e) {
-                            Throwable cause = e.getCause();
-                            throw (cause instanceof Exception) ? ((Exception) cause) : e;
+        try {
+            for (RunKind rk: RunKind.values()) {
+                for (GenKind gk: GenKind.values()) {
+                    for (Method m: getClass().getDeclaredMethods()) {
+                        Annotation a = m.getAnnotation(Test.class);
+                        if (a != null) {
+                            init(rk, gk, m.getName());
+                            try {
+                                m.invoke(this, new Object[] { rk, gk });
+                            } catch (InvocationTargetException e) {
+                                Throwable cause = e.getCause();
+                                throw (cause instanceof Exception) ? ((Exception) cause) : e;
+                            }
+                            System.err.println();
                         }
-                        System.err.println();
                     }
                 }
             }
+            System.err.println(testCount + " tests" + ((errorCount == 0) ? "" : ", " + errorCount + " errors"));
+            if (errorCount > 0)
+                throw new Exception(errorCount + " errors found");
+        } finally {
+            fm.close();
         }
-        System.err.println(testCount + " tests" + ((errorCount == 0) ? "" : ", " + errorCount + " errors"));
-        if (errorCount > 0)
-            throw new Exception(errorCount + " errors found");
     }
 
     /**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/options/XjcovUnionTypeTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8059453
+ * @summary -Xjcov causes crash with union types
+ * @compile -Xjcov XjcovUnionTypeTest.java
+ */
+
+public class XjcovUnionTypeTest {
+  public static void main(String[] args) {
+    try {
+      return;
+    } catch (IllegalStateException | IllegalArgumentException e) {
+    }
+  }
+}
--- a/langtools/test/tools/javac/options/xprefer/XPreferTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/options/xprefer/XPreferTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -45,6 +45,7 @@
 
 import javax.tools.JavaCompiler;
 import javax.tools.JavaCompiler.CompilationTask;
+import javax.tools.StandardJavaFileManager;
 import javax.tools.ToolProvider;
 
 
@@ -73,27 +74,31 @@
     }
 
     final static JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
+    final static StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
     final static File OUTPUT_DIR = new File("out");
 
     public static void main(String... args) throws Exception {
+        try {
+            // Initialize test-directories
+            OUTPUT_DIR.mkdir();
+            for (Dir dir : Dir.values())
+                dir.file.mkdir();
 
-        // Initialize test-directories
-        OUTPUT_DIR.mkdir();
-        for (Dir dir : Dir.values())
-            dir.file.mkdir();
-
-        int testCaseCounter = 0;
+            int testCaseCounter = 0;
 
-        for (List<Dir> dirSubset : SubseqIter.subseqsOf(Dir.values())) {
+            for (List<Dir> dirSubset : SubseqIter.subseqsOf(Dir.values())) {
+
+                if (dirSubset.isEmpty())
+                    continue;
 
-            if (dirSubset.isEmpty())
-                continue;
-
-            for (ImplicitOption policy : ImplicitOption.values()) {
-                for (List<Dir> dirOrder : PermutationIterator.permutationsOf(dirSubset)) {
-                    new TestCase(dirOrder, policy, testCaseCounter++).run();
+                for (ImplicitOption policy : ImplicitOption.values()) {
+                    for (List<Dir> dirOrder : PermutationIterator.permutationsOf(dirSubset)) {
+                        new TestCase(dirOrder, policy, testCaseCounter++).run();
+                    }
                 }
             }
+        } finally {
+            fm.close();
         }
     }
 
@@ -234,8 +239,8 @@
             if(dir == Dir.SOURCE_PATH)
                 return src;
             // ...otherwise compile into a ".class".
-            CompilationTask task = comp.getTask(null, null, null, null, null,
-                    comp.getStandardFileManager(null, null, null).getJavaFileObjects(src));
+            CompilationTask task = comp.getTask(null, fm, null, null, null,
+                    fm.getJavaFileObjects(src));
             File dest = new File(dir.file, classId + ".class");
             if(!task.call() || !dest.exists())
                 throw new RuntimeException("Compilation failure.");
--- a/langtools/test/tools/javac/plugin/showtype/Test.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/plugin/showtype/Test.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -71,21 +71,25 @@
     }
 
     void run() throws Exception {
-        // compile the plugin explicitly, to a non-standard directory
-        // so that we don't find it on the wrong path by accident
-        pluginClasses.mkdirs();
-        compile("-d", pluginClasses.getPath(), pluginSrc.getPath());
-        writeFile(new File(pluginClasses, "META-INF/services/com.sun.source.util.Plugin"),
-                "ShowTypePlugin\n");
-        jar("cf", pluginJar.getPath(), "-C", pluginClasses.getPath(), ".");
+        try {
+            // compile the plugin explicitly, to a non-standard directory
+            // so that we don't find it on the wrong path by accident
+            pluginClasses.mkdirs();
+            compile("-d", pluginClasses.getPath(), pluginSrc.getPath());
+            writeFile(new File(pluginClasses, "META-INF/services/com.sun.source.util.Plugin"),
+                    "ShowTypePlugin\n");
+            jar("cf", pluginJar.getPath(), "-C", pluginClasses.getPath(), ".");
 
-        testCommandLine("-Xplugin:showtype", ref1);
-        testCommandLine("-Xplugin:showtype PI", ref2);
-        testAPI("-Xplugin:showtype", ref1);
-        testAPI("-Xplugin:showtype PI", ref2);
+            testCommandLine("-Xplugin:showtype", ref1);
+            testCommandLine("-Xplugin:showtype PI", ref2);
+            testAPI("-Xplugin:showtype", ref1);
+            testAPI("-Xplugin:showtype PI", ref2);
 
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
+        } finally {
+            fm.close();
+        }
     }
 
     void testAPI(String opt, List<String> ref) throws Exception {
--- a/langtools/test/tools/javac/positions/TreeEndPosTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/positions/TreeEndPosTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -137,32 +137,33 @@
         File tempDir = new File(".");
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
         DiagnosticCollector dc = new DiagnosticCollector();
-        JavaFileManager javaFileManager = getJavaFileManager(compiler, dc);
-        List<String> options = new ArrayList<>();
-        options.add("-cp");
-        options.add(tempDir.getPath());
-        options.add("-d");
-        options.add(tempDir.getPath());
-        options.add("-XDshouldStopPolicy=GENERATE");
+        try (JavaFileManager javaFileManager = getJavaFileManager(compiler, dc)) {
+            List<String> options = new ArrayList<>();
+            options.add("-cp");
+            options.add(tempDir.getPath());
+            options.add("-d");
+            options.add(tempDir.getPath());
+            options.add("-XDshouldStopPolicy=GENERATE");
 
-        List<JavaFileObject> sources = new ArrayList<>();
-        sources.add(src);
-        JavaCompiler.CompilationTask task =
-                compiler.getTask(writer, javaFileManager,
-                dc, options, null,
-                sources);
-        task.call();
-        for (Diagnostic diagnostic : (List<Diagnostic>) dc.getDiagnostics()) {
-            long actualStart = diagnostic.getStartPosition();
-            long actualEnd = diagnostic.getEndPosition();
-            System.out.println("Source: " + src.source);
-            System.out.println("Diagnostic: " + diagnostic);
-            System.out.print("Start position: Expected: " + src.startPos);
-            System.out.println(", Actual: " + actualStart);
-            System.out.print("End position: Expected: " + src.endPos);
-            System.out.println(", Actual: " + actualEnd);
-            if (src.startPos != actualStart || src.endPos != actualEnd) {
-                throw new RuntimeException("error: trees don't match");
+            List<JavaFileObject> sources = new ArrayList<>();
+            sources.add(src);
+            JavaCompiler.CompilationTask task =
+                    compiler.getTask(writer, javaFileManager,
+                    dc, options, null,
+                    sources);
+            task.call();
+            for (Diagnostic diagnostic : (List<Diagnostic>) dc.getDiagnostics()) {
+                long actualStart = diagnostic.getStartPosition();
+                long actualEnd = diagnostic.getEndPosition();
+                System.out.println("Source: " + src.source);
+                System.out.println("Diagnostic: " + diagnostic);
+                System.out.print("Start position: Expected: " + src.startPos);
+                System.out.println(", Actual: " + actualStart);
+                System.out.print("End position: Expected: " + src.endPos);
+                System.out.println(", Actual: " + actualEnd);
+                if (src.startPos != actualStart || src.endPos != actualEnd) {
+                    throw new RuntimeException("error: trees don't match");
+                }
             }
         }
     }
--- a/langtools/test/tools/javac/processing/6348193/T6348193.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/6348193/T6348193.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -85,35 +85,36 @@
 
         MyDiagListener dl = new MyDiagListener();
         PrintWriter out = new PrintWriter(System.err, true);
-        StandardJavaFileManager fm = t.getStandardFileManager(dl, null, null);
-        File file = new File(System.getProperty("test.src"), myName+".java");
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(file));
-        boolean ok = t.getTask(out, null, dl, args, null, files).call();
+        try (StandardJavaFileManager fm = t.getStandardFileManager(dl, null, null)) {
+            File file = new File(System.getProperty("test.src"), myName+".java");
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(file));
+            boolean ok = t.getTask(out, null, dl, args, null, files).call();
 
-        if (config == NoGoodBad.GOOD || proc == NoYes.YES) {
-            if (secMgr == NoYes.YES) {
-                if (dl.last == null)
-                    throw new AssertionError("Security manager installed, and processors present, "
-                                             + " but no diagnostic received");
+            if (config == NoGoodBad.GOOD || proc == NoYes.YES) {
+                if (secMgr == NoYes.YES) {
+                    if (dl.last == null)
+                        throw new AssertionError("Security manager installed, and processors present, "
+                                                 + " but no diagnostic received");
+                }
+                else {
+                    if (!processed.exists())
+                        throw new AssertionError("No security manager installed, and processors present, "
+                                                 + " but no processing occurred");
+                }
+            }
+            else if (config == NoGoodBad.BAD) {
+                // TODO: should verify that no compiler crash occurred
+                // needs revised JSR199 spec
             }
             else {
-                if (!processed.exists())
-                    throw new AssertionError("No security manager installed, and processors present, "
-                                             + " but no processing occurred");
+                if (processed.exists())
+                    throw new AssertionError("No processors present, but processing occurred!");
             }
+
+            if (verbose)
+                System.err.println("OK");
         }
-        else if (config == NoGoodBad.BAD) {
-            // TODO: should verify that no compiler crash occurred
-            // needs revised JSR199 spec
-        }
-        else {
-            if (processed.exists())
-                throw new AssertionError("No processors present, but processing occurred!");
-        }
-
-        if (verbose)
-            System.err.println("OK");
     }
 
     // set up or remove a service configuration file
--- a/langtools/test/tools/javac/processing/6348499/T6348499.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/6348499/T6348499.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -44,32 +44,33 @@
 
 
 public class T6348499 {
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         String testSrc = System.getProperty("test.src", ".");
         String testClasses = System.getProperty("test.classes");
         String testClassPath = System.getProperty("test.class.path", testClasses);
         String A_java = new File(testSrc, "A.java").getPath();
         JavacTool tool = JavacTool.create();
         MyDiagListener dl = new MyDiagListener();
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "A.java")));
-        Iterable<String> opts = Arrays.asList("-proc:only",
-                                              "-processor", "A",
-                                              "-processorpath", testClassPath);
-        StringWriter out = new StringWriter();
-        JavacTask task = tool.getTask(out, fm, dl, opts, null, files);
-        task.call();
-        String s = out.toString();
-        System.err.print(s);
-        // Expect the following 1 multi-line diagnostic, and no output to log
-        //     error: cannot access A_0
-        //     bad class file: A_0.class
-        //     illegal start of class file
-        //     Please remove or make sure it appears in the correct subdirectory of the classpath.
-        System.err.println(dl.count + " diagnostics; " + s.length() + " characters");
-        if (dl.count != 1 || s.length() != 0)
-            throw new AssertionError("unexpected output from compiler");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, "A.java")));
+            Iterable<String> opts = Arrays.asList("-proc:only",
+                                                  "-processor", "A",
+                                                  "-processorpath", testClassPath);
+            StringWriter out = new StringWriter();
+            JavacTask task = tool.getTask(out, fm, dl, opts, null, files);
+            task.call();
+            String s = out.toString();
+            System.err.print(s);
+            // Expect the following 1 multi-line diagnostic, and no output to log
+            //     error: cannot access A_0
+            //     bad class file: A_0.class
+            //     illegal start of class file
+            //     Please remove or make sure it appears in the correct subdirectory of the classpath.
+            System.err.println(dl.count + " diagnostics; " + s.length() + " characters");
+            if (dl.count != 1 || s.length() != 0)
+                throw new AssertionError("unexpected output from compiler");
+        }
     }
 
     static class MyDiagListener implements DiagnosticListener<JavaFileObject> {
--- a/langtools/test/tools/javac/processing/6378728/T6378728.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/6378728/T6378728.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -64,21 +64,22 @@
         }
     }
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws IOException {
         // Get a compiler tool
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
         String srcdir = System.getProperty("test.src");
         File source = new File(srcdir, "T6378728.java");
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
 
-        CompilationTask task =
-            compiler.getTask(null,
-                             new ExceptionalFileManager(fm),
-                             null,
-                             Arrays.asList("-proc:only"),
-                             null,
-                             fm.getJavaFileObjectsFromFiles(Arrays.asList(source)));
-        if (!task.call())
-            throw new RuntimeException("Unexpected compilation failure");
+            CompilationTask task =
+                compiler.getTask(null,
+                                 new ExceptionalFileManager(fm),
+                                 null,
+                                 Arrays.asList("-proc:only"),
+                                 null,
+                                 fm.getJavaFileObjectsFromFiles(Arrays.asList(source)));
+            if (!task.call())
+                throw new RuntimeException("Unexpected compilation failure");
+        }
     }
 }
--- a/langtools/test/tools/javac/processing/6414633/T6414633.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/6414633/T6414633.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -40,29 +40,30 @@
 import com.sun.tools.javac.api.*;
 
 public class T6414633 {
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         String testSrc = System.getProperty("test.src", ".");
         String testClasses = System.getProperty("test.classes", ".");
         String testClassPath = System.getProperty("test.class.path", testClasses);
 
         JavacTool tool = JavacTool.create();
         MyDiagListener dl = new MyDiagListener();
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        try {
-            fm.setLocation(StandardLocation.CLASS_PATH, pathToFiles(testClassPath));
-        } catch (IOException e) {
-            throw new AssertionError(e);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            try {
+                fm.setLocation(StandardLocation.CLASS_PATH, pathToFiles(testClassPath));
+            } catch (IOException e) {
+                throw new AssertionError(e);
+            }
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, A.class.getName()+".java")));
+            String[] opts = { "-proc:only",
+                              "-processor", A.class.getName() };
+            JavacTask task = tool.getTask(null, fm, dl, Arrays.asList(opts), null, files);
+            task.call();
+
+            // two annotations on the same element -- expect 2 diags from the processor
+            if (dl.diags != 2)
+                throw new AssertionError(dl.diags + " diagnostics reported");
         }
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, A.class.getName()+".java")));
-        String[] opts = { "-proc:only",
-                          "-processor", A.class.getName() };
-        JavacTask task = tool.getTask(null, fm, dl, Arrays.asList(opts), null, files);
-        task.call();
-
-        // two annotations on the same element -- expect 2 diags from the processor
-        if (dl.diags != 2)
-            throw new AssertionError(dl.diags + " diagnostics reported");
     }
 
     private static List<File> pathToFiles(String path) {
--- a/langtools/test/tools/javac/processing/6430209/T6430209.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/6430209/T6430209.java	Wed Jul 05 20:06:12 2017 +0200
@@ -58,22 +58,23 @@
         String testClassPath = System.getProperty("test.class.path");
         JavacTool tool = JavacTool.create();
         MyDiagListener dl = new MyDiagListener();
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(new File(".")));
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjectsFromFiles(Arrays.asList(
-            new File(testSrc, "test0.java"), new File(testSrc, "test1.java")));
-        Iterable<String> opts = Arrays.asList("-proc:only",
-                                              "-processor", "b6341534",
-                                              "-processorpath", testClassPath);
-        StringWriter out = new StringWriter();
-        JavacTask task = tool.getTask(out, fm, dl, opts, null, files);
-        task.call();
-        String s = out.toString();
-        System.err.print(s);
-        // Expect the following 2 diagnostics, and no output to log
-        System.err.println(dl.count + " diagnostics; " + s.length() + " characters");
-        if (dl.count != 2 || s.length() != 0)
-            throw new AssertionError("unexpected output from compiler");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(new File(".")));
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjectsFromFiles(Arrays.asList(
+                new File(testSrc, "test0.java"), new File(testSrc, "test1.java")));
+            Iterable<String> opts = Arrays.asList("-proc:only",
+                                                  "-processor", "b6341534",
+                                                  "-processorpath", testClassPath);
+            StringWriter out = new StringWriter();
+            JavacTask task = tool.getTask(out, fm, dl, opts, null, files);
+            task.call();
+            String s = out.toString();
+            System.err.print(s);
+            // Expect the following 2 diagnostics, and no output to log
+            System.err.println(dl.count + " diagnostics; " + s.length() + " characters");
+            if (dl.count != 2 || s.length() != 0)
+                throw new AssertionError("unexpected output from compiler");
+        }
     }
 
     static class MyDiagListener implements DiagnosticListener<JavaFileObject> {
--- a/langtools/test/tools/javac/processing/T6439826.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/T6439826.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -40,28 +40,29 @@
 
 @SupportedAnnotationTypes("*")
 public class T6439826 extends AbstractProcessor {
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         String testSrc = System.getProperty("test.src", ".");
         String testClasses = System.getProperty("test.classes");
         JavacTool tool = JavacTool.create();
         MyDiagListener dl = new MyDiagListener();
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        Iterable<? extends JavaFileObject> files =
-            fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6439826.class.getName()+".java")));
-        Iterable<String> opts = Arrays.asList("-proc:only",
-                                              "-processor", "T6439826",
-                                              "-processorpath", testClasses);
-        StringWriter out = new StringWriter();
-        JavacTask task = tool.getTask(out, fm, dl, opts, null, files);
-        task.call();
-        String s = out.toString();
-        System.err.print(s);
-        // Expect the following 2 diagnostics, and no output to log
-        //   Foo.java:1: illegal character: \35
-        //   Foo.java:1: reached end of file while parsing
-        System.err.println(dl.count + " diagnostics; " + s.length() + " characters");
-        if (dl.count != 2 || s.length() != 0)
-            throw new AssertionError("unexpected output from compiler");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6439826.class.getName()+".java")));
+            Iterable<String> opts = Arrays.asList("-proc:only",
+                                                  "-processor", "T6439826",
+                                                  "-processorpath", testClasses);
+            StringWriter out = new StringWriter();
+            JavacTask task = tool.getTask(out, fm, dl, opts, null, files);
+            task.call();
+            String s = out.toString();
+            System.err.print(s);
+            // Expect the following 2 diagnostics, and no output to log
+            //   Foo.java:1: illegal character: \35
+            //   Foo.java:1: reached end of file while parsing
+            System.err.println(dl.count + " diagnostics; " + s.length() + " characters");
+            if (dl.count != 2 || s.length() != 0)
+                throw new AssertionError("unexpected output from compiler");
+        }
     }
 
     public boolean process(Set<? extends TypeElement> annotations,
--- a/langtools/test/tools/javac/processing/errors/TestSuppression.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/errors/TestSuppression.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -100,41 +100,42 @@
 
         DiagListener dl = new DiagListener();
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null);
-        fm.setLocation(StandardLocation.CLASS_PATH,
-                Arrays.asList(classesDir, new File(System.getProperty("test.classes"))));
-        fm.setLocation(StandardLocation.CLASS_OUTPUT, Collections.singleton(classesDir));
-        fm.setLocation(StandardLocation.SOURCE_OUTPUT, Collections.singleton(gensrcDir));
-        List<String> args = new ArrayList<String>();
-//        args.add("-XprintProcessorInfo");
-        args.add("-XprintRounds");
-        args.add("-Agen=" + gen);
-        if (wk == WarningKind.YES)
-            args.add("-Xlint:serial");
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(x);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, null)) {
+            fm.setLocation(StandardLocation.CLASS_PATH,
+                    Arrays.asList(classesDir, new File(System.getProperty("test.classes"))));
+            fm.setLocation(StandardLocation.CLASS_OUTPUT, Collections.singleton(classesDir));
+            fm.setLocation(StandardLocation.SOURCE_OUTPUT, Collections.singleton(gensrcDir));
+            List<String> args = new ArrayList<String>();
+    //        args.add("-XprintProcessorInfo");
+            args.add("-XprintRounds");
+            args.add("-Agen=" + gen);
+            if (wk == WarningKind.YES)
+                args.add("-Xlint:serial");
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(x);
 
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        JavacTask task = tool.getTask(pw, fm, dl, args, null, files);
-        task.setProcessors(Arrays.asList(new AnnoProc()));
-        boolean ok = task.call();
-        pw.close();
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            JavacTask task = tool.getTask(pw, fm, dl, args, null, files);
+            task.setProcessors(Arrays.asList(new AnnoProc()));
+            boolean ok = task.call();
+            pw.close();
 
-        System.err.println("ok:" + ok + " diags:" + dl.counts);
-        if (sw.toString().length() > 0) {
-            System.err.println("output:\n" + sw.toString());
+            System.err.println("ok:" + ok + " diags:" + dl.counts);
+            if (sw.toString().length() > 0) {
+                System.err.println("output:\n" + sw.toString());
+            }
+
+            for (Diagnostic.Kind dk: Diagnostic.Kind.values()) {
+                Integer v = dl.counts.get(dk);
+                int found = (v == null) ? 0 : v;
+                int expect = (dk == Diagnostic.Kind.WARNING && wk == WarningKind.YES) ? gen : 0;
+                if (found != expect) {
+                    error("Unexpected value for " + dk + ": expected: " + expect + " found: " + found);
+                }
+            }
+
+            System.err.println();
         }
-
-        for (Diagnostic.Kind dk: Diagnostic.Kind.values()) {
-            Integer v = dl.counts.get(dk);
-            int found = (v == null) ? 0 : v;
-            int expect = (dk == Diagnostic.Kind.WARNING && wk == WarningKind.YES) ? gen : 0;
-            if (found != expect) {
-                error("Unexpected value for " + dk + ": expected: " + expect + " found: " + found);
-            }
-        }
-
-        System.err.println();
     }
 
     File createDir(File parent, String name) {
--- a/langtools/test/tools/javac/processing/loader/testClose/TestClose.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/loader/testClose/TestClose.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -117,50 +117,51 @@
 
     void run() throws IOException {
         JavacTool tool = (JavacTool) ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
 
-        File classes = new File("classes");
-        classes.mkdirs();
-        File extraClasses = new File("extraClasses");
-        extraClasses.mkdirs();
+            File classes = new File("classes");
+            classes.mkdirs();
+            File extraClasses = new File("extraClasses");
+            extraClasses.mkdirs();
 
-        System.out.println("compiling classes to extraClasses");
-        {   // setup class in extraClasses
-            fm.setLocation(StandardLocation.CLASS_OUTPUT,
-                    Collections.singleton(extraClasses));
-            List<? extends JavaFileObject> files = Arrays.asList(
-                    new MemFile("AnnoProc.java", annoProc),
-                    new MemFile("Callback.java", callback));
-            JavacTask task = tool.getTask(null, fm, null, null, null, files);
-            check(task.call());
-        }
+            System.out.println("compiling classes to extraClasses");
+            {   // setup class in extraClasses
+                fm.setLocation(StandardLocation.CLASS_OUTPUT,
+                        Collections.singleton(extraClasses));
+                List<? extends JavaFileObject> files = Arrays.asList(
+                        new MemFile("AnnoProc.java", annoProc),
+                        new MemFile("Callback.java", callback));
+                JavacTask task = tool.getTask(null, fm, null, null, null, files);
+                check(task.call());
+            }
 
-        System.out.println("compiling dummy to classes with anno processor");
-        {   // use that class in a TaskListener after processing has completed
-            PrintStream prev = System.out;
-            String out;
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            try (PrintStream ps = new PrintStream(baos)) {
-                System.setOut(ps);
-                File testClasses = new File(System.getProperty("test.classes"));
-                fm.setLocation(StandardLocation.CLASS_OUTPUT,
-                        Collections.singleton(classes));
-                fm.setLocation(StandardLocation.ANNOTATION_PROCESSOR_PATH,
-                        Arrays.asList(extraClasses, testClasses));
-                List<? extends JavaFileObject> files = Arrays.asList(
-                        new MemFile("my://dummy", "class Dummy { }"));
-                List<String> options = Arrays.asList("-processor", "AnnoProc");
-                JavacTask task = tool.getTask(null, fm, null, options, null, files);
-                task.setTaskListener(this);
-                check(task.call());
-            } finally {
-                System.setOut(prev);
-                out = baos.toString();
-                if (!out.isEmpty())
-                    System.out.println(out);
+            System.out.println("compiling dummy to classes with anno processor");
+            {   // use that class in a TaskListener after processing has completed
+                PrintStream prev = System.out;
+                String out;
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                try (PrintStream ps = new PrintStream(baos)) {
+                    System.setOut(ps);
+                    File testClasses = new File(System.getProperty("test.classes"));
+                    fm.setLocation(StandardLocation.CLASS_OUTPUT,
+                            Collections.singleton(classes));
+                    fm.setLocation(StandardLocation.ANNOTATION_PROCESSOR_PATH,
+                            Arrays.asList(extraClasses, testClasses));
+                    List<? extends JavaFileObject> files = Arrays.asList(
+                            new MemFile("my://dummy", "class Dummy { }"));
+                    List<String> options = Arrays.asList("-processor", "AnnoProc");
+                    JavacTask task = tool.getTask(null, fm, null, options, null, files);
+                    task.setTaskListener(this);
+                    check(task.call());
+                } finally {
+                    System.setOut(prev);
+                    out = baos.toString();
+                    if (!out.isEmpty())
+                        System.out.println(out);
+                }
+                check(out.contains("AnnoProc$1: run()"));
+                check(out.contains("Callback: run()"));
             }
-            check(out.contains("AnnoProc$1: run()"));
-            check(out.contains("Callback: run()"));
         }
     }
 
--- a/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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
@@ -64,66 +64,67 @@
             return;
         }
         JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
-        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);
-        Elements elements = javac.getElements();
+        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);
+            Elements elements = javac.getElements();
 
-        final Set<String> packages = new LinkedHashSet<String>();
+            final Set<String> packages = new LinkedHashSet<String>();
 
-        int nestedClasses = 0;
-        int classes = 0;
+            int nestedClasses = 0;
+            int classes = 0;
 
-        for (JavaFileObject file : fm.list(PLATFORM_CLASS_PATH, "", EnumSet.of(CLASS), true)) {
-            String type = fm.inferBinaryName(PLATFORM_CLASS_PATH, file);
-            if (type.endsWith("package-info"))
-                continue;
-            try {
-                TypeElement elem = elements.getTypeElement(type);
-                if (elem == null && type.indexOf('$') > 0) {
-                    nestedClasses++;
-                    type = null;
+            for (JavaFileObject file : fm.list(PLATFORM_CLASS_PATH, "", EnumSet.of(CLASS), true)) {
+                String type = fm.inferBinaryName(PLATFORM_CLASS_PATH, file);
+                if (type.endsWith("package-info"))
                     continue;
+                try {
+                    TypeElement elem = elements.getTypeElement(type);
+                    if (elem == null && type.indexOf('$') > 0) {
+                        nestedClasses++;
+                        type = null;
+                        continue;
+                    }
+                    classes++;
+                    packages.add(getPackage(elem).getQualifiedName().toString());
+                    elements.getTypeElement(type).getKind(); // force completion
+                    type = null;
+                } finally {
+                    if (type != null)
+                        System.err.println("Looking at " + type);
                 }
-                classes++;
-                packages.add(getPackage(elem).getQualifiedName().toString());
-                elements.getTypeElement(type).getKind(); // force completion
-                type = null;
-            } finally {
-                if (type != null)
-                    System.err.println("Looking at " + type);
+            }
+            javac = null;
+            elements = null;
+
+            javac = (JavacTask)tool.getTask(null, fm, null, null, null, null);
+            elements = javac.getElements();
+
+            for (String name : packages) {
+                PackageElement pe = elements.getPackageElement(name);
+                for (Element e : pe.getEnclosedElements()) {
+                    e.getSimpleName().getClass();
+                }
             }
+            /*
+             * A few sanity checks based on current values:
+             *
+             * packages: 775, classes: 12429 + 5917
+             *
+             * As the platform evolves the numbers are likely to grow
+             * monotonically but in case somebody gets a clever idea for
+             * limiting the number of packages exposed, this number might
+             * drop.  So we test low values.
+             */
+            System.out.format("packages: %s, classes: %s + %s%n",
+                              packages.size(), classes, nestedClasses);
+            if (classes < 9000)
+                throw new AssertionError("Too few classes in PLATFORM_CLASS_PATH ;-)");
+            if (packages.size() < 530)
+                throw new AssertionError("Too few packages in PLATFORM_CLASS_PATH ;-)");
+            if (nestedClasses < 3000)
+                throw new AssertionError("Too few nested classes in PLATFORM_CLASS_PATH ;-)");
         }
-        javac = null;
-        elements = null;
-
-        javac = (JavacTask)tool.getTask(null, fm, null, null, null, null);
-        elements = javac.getElements();
-
-        for (String name : packages) {
-            PackageElement pe = elements.getPackageElement(name);
-            for (Element e : pe.getEnclosedElements()) {
-                e.getSimpleName().getClass();
-            }
-        }
-        /*
-         * A few sanity checks based on current values:
-         *
-         * packages: 775, classes: 12429 + 5917
-         *
-         * As the platform evolves the numbers are likely to grow
-         * monotonically but in case somebody gets a clever idea for
-         * limiting the number of packages exposed, this number might
-         * drop.  So we test low values.
-         */
-        System.out.format("packages: %s, classes: %s + %s%n",
-                          packages.size(), classes, nestedClasses);
-        if (classes < 9000)
-            throw new AssertionError("Too few classes in PLATFORM_CLASS_PATH ;-)");
-        if (packages.size() < 530)
-            throw new AssertionError("Too few packages in PLATFORM_CLASS_PATH ;-)");
-        if (nestedClasses < 3000)
-            throw new AssertionError("Too few nested classes in PLATFORM_CLASS_PATH ;-)");
     }
     /*
      * If -XX:+AggressiveOpts has been used to test, the option currently
--- a/langtools/test/tools/javac/processing/model/type/BoundsTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/model/type/BoundsTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -25,6 +25,7 @@
  * @test
  * @bug 6499673
  * @library /tools/javac/lib
+ * @ignore 8062245 Test executes incorrect class
  * @build JavacTestingAbstractProcessor BoundsTest
  * @run main BoundsTest
  * @summary Assertion check for TypeVariable.getUpperBound() fails
@@ -113,15 +114,19 @@
     }
 
     public void run() throws IOException {
-        runOne(Intersection_name, Intersection_contents,
-               Intersection_bounds, Intersection_supers);
-        runOne(Single_name, Single_contents,
-               Single_bounds, Single_supers);
-        runOne(NoBounds_name, NoBounds_contents,
-               NoBounds_bounds, NoBounds_supers);
+        try {
+            runOne(Intersection_name, Intersection_contents,
+                   Intersection_bounds, Intersection_supers);
+            runOne(Single_name, Single_contents,
+                   Single_bounds, Single_supers);
+            runOne(NoBounds_name, NoBounds_contents,
+                   NoBounds_bounds, NoBounds_supers);
 
-        if (0 != errors)
-            throw new RuntimeException(errors + " errors occurred");
+            if (0 != errors)
+                throw new RuntimeException(errors + " errors occurred");
+        } finally {
+            fm.close();
+        }
     }
 
     public static void main(String... args) throws IOException {
--- a/langtools/test/tools/javac/processing/model/type/IntersectionPropertiesTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/model/type/IntersectionPropertiesTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -76,10 +76,14 @@
     }
 
     public void run() throws IOException {
-        runOne(Intersection_name, Intersection_contents);
+        try {
+            runOne(Intersection_name, Intersection_contents);
 
-        if (0 != errors)
-            throw new RuntimeException(errors + " errors occurred");
+            if (0 != errors)
+                throw new RuntimeException(errors + " errors occurred");
+        } finally {
+            fm.close();
+        }
     }
 
     public static void main(String... args) throws IOException {
--- a/langtools/test/tools/javac/processing/model/util/elements/doccomments/TestDocComments.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/model/util/elements/doccomments/TestDocComments.java	Wed Jul 05 20:06:12 2017 +0200
@@ -104,11 +104,12 @@
             }
         };
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> units = fm.getJavaFileObjects(files);
-        JavacTask t = (JavacTask) c.getTask(null, fm, dl, Arrays.asList(opts), null, units);
-        t.parse();
-        t.analyze();
+        try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> units = fm.getJavaFileObjects(files);
+            JavacTask t = (JavacTask) c.getTask(null, fm, dl, Arrays.asList(opts), null, units);
+            t.parse();
+            t.analyze();
+        }
     }
 
     static void test_javac_cmd(String[] opts, File[] files) {
--- a/langtools/test/tools/javac/processing/model/util/elements/doccomments/TestPackageInfoComments.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/model/util/elements/doccomments/TestPackageInfoComments.java	Wed Jul 05 20:06:12 2017 +0200
@@ -60,11 +60,12 @@
             }
         };
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> units = fm.getJavaFileObjects(files);
-        JavacTask t = (JavacTask) c.getTask(null, fm, dl, Arrays.asList(opts), null, units);
-        t.parse();
-        t.analyze();
+        try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> units = fm.getJavaFileObjects(files);
+            JavacTask t = (JavacTask) c.getTask(null, fm, dl, Arrays.asList(opts), null, units);
+            t.parse();
+            t.analyze();
+        }
     }
 
     // -- Annotation processor: Check all PackageDecl's have a doc comment
--- a/langtools/test/tools/javac/processing/options/testCommandLineClasses/Test.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/options/testCommandLineClasses/Test.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -67,16 +67,17 @@
     void test(List<String> names) throws Exception {
         System.err.println("test: " + names);
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
-        File testClasses = new File(System.getProperty("test.classes"));
-        fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses));
-        JavaCompiler.CompilationTask task = compiler.getTask(
-                null, null, null, Arrays.asList("-proc:only"), names, null);
-        task.setProcessors(Arrays.asList(new Test()));
-        boolean ok = task.call();
-        if (!ok)
-            error("compilation failed");
-        System.err.println();
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            File testClasses = new File(System.getProperty("test.classes"));
+            fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses));
+            JavaCompiler.CompilationTask task = compiler.getTask(
+                    null, null, null, Arrays.asList("-proc:only"), names, null);
+            task.setProcessors(Arrays.asList(new Test()));
+            boolean ok = task.call();
+            if (!ok)
+                error("compilation failed");
+            System.err.println();
+        }
     }
 
     <T> List<T> reverse(List<T> list) {
--- a/langtools/test/tools/javac/processing/rounds/BaseClassesNotReRead.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/processing/rounds/BaseClassesNotReRead.java	Wed Jul 05 20:06:12 2017 +0200
@@ -49,19 +49,20 @@
     void run() throws IOException {
         File sources = new File(System.getProperty("test.src"));
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files =
-                fm.getJavaFileObjects(new File(sources, "BaseClassesNotReReadSource.java"));
-        DiagnosticListener<JavaFileObject> noErrors = new DiagnosticListener<JavaFileObject>() {
-            @Override
-            public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
-                throw new IllegalStateException(diagnostic.toString());
-            }
-        };
-        JavaFileManager manager = new OnlyOneReadFileManager(fm);
-        Iterable<String> options = Arrays.asList("-processor", "BaseClassesNotReRead");
-        JavacTask task = (JavacTask) compiler.getTask(null, manager, noErrors, options, null, files);
-        task.analyze();
+        try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files =
+                    fm.getJavaFileObjects(new File(sources, "BaseClassesNotReReadSource.java"));
+            DiagnosticListener<JavaFileObject> noErrors = new DiagnosticListener<JavaFileObject>() {
+                @Override
+                public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
+                    throw new IllegalStateException(diagnostic.toString());
+                }
+            };
+            JavaFileManager manager = new OnlyOneReadFileManager(fm);
+            Iterable<String> options = Arrays.asList("-processor", "BaseClassesNotReRead");
+            JavacTask task = (JavacTask) compiler.getTask(null, manager, noErrors, options, null, files);
+            task.analyze();
+        }
     }
 
     int round = 1;
--- a/langtools/test/tools/javac/profiles/ProfileOptionTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/profiles/ProfileOptionTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -236,24 +236,28 @@
 
     /** Run all test cases. */
     void run() throws Exception {
-        initTestClasses();
+        try {
+            initTestClasses();
 
-        for (Method m: getClass().getDeclaredMethods()) {
-            Annotation a = m.getAnnotation(Test.class);
-            if (a != null) {
-                System.err.println(m.getName());
-                try {
-                    m.invoke(this, new Object[] { });
-                } catch (InvocationTargetException e) {
-                    Throwable cause = e.getCause();
-                    throw (cause instanceof Exception) ? ((Exception) cause) : e;
+            for (Method m: getClass().getDeclaredMethods()) {
+                Annotation a = m.getAnnotation(Test.class);
+                if (a != null) {
+                    System.err.println(m.getName());
+                    try {
+                        m.invoke(this, new Object[] { });
+                    } catch (InvocationTargetException e) {
+                        Throwable cause = e.getCause();
+                        throw (cause instanceof Exception) ? ((Exception) cause) : e;
+                    }
+                    System.err.println();
                 }
-                System.err.println();
             }
+
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
+        } finally {
+            fm.close();
         }
-
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
     }
 
     void error(String msg) {
--- a/langtools/test/tools/javac/resolve/ResolveHarness.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/resolve/ResolveHarness.java	Wed Jul 05 20:06:12 2017 +0200
@@ -71,13 +71,17 @@
     static final StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
 
     public static void main(String[] args) throws Exception {
-        fm.setLocation(SOURCE_PATH,
-                Arrays.asList(new File(System.getProperty("test.src"), "tests")));
-        for (JavaFileObject jfo : fm.list(SOURCE_PATH, "", Collections.singleton(JavaFileObject.Kind.SOURCE), true)) {
-            new ResolveHarness(jfo).check();
-        }
-        if (nerrors > 0) {
-            throw new AssertionError("Errors were found");
+        try {
+            fm.setLocation(SOURCE_PATH,
+                    Arrays.asList(new File(System.getProperty("test.src"), "tests")));
+            for (JavaFileObject jfo : fm.list(SOURCE_PATH, "", Collections.singleton(JavaFileObject.Kind.SOURCE), true)) {
+                new ResolveHarness(jfo).check();
+            }
+            if (nerrors > 0) {
+                throw new AssertionError("Errors were found");
+            }
+        } finally {
+            fm.close();
         }
     }
 
--- a/langtools/test/tools/javac/tree/ClassTreeTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/ClassTreeTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -41,25 +41,26 @@
 
     void run() throws Exception {
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        List<String> opts = Collections.<String>emptyList();
-        File testSrc = new File(System.getProperty("test.src"));
-        File thisFile = new File(testSrc, ClassTreeTest.class.getSimpleName() + ".java");
-        Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjects(thisFile);
-        JavacTask task = tool.getTask(null, fm, null, opts, null, fos);
-        for (CompilationUnitTree cu: task.parse()) {
-            check(cu, "CLASS", Tree.Kind.CLASS);
-            check(cu, "INTERFACE", Tree.Kind.INTERFACE);
-            check(cu, "ENUM", Tree.Kind.ENUM);
-            check(cu, "ANNOTATION_TYPE", Tree.Kind.ANNOTATION_TYPE);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            List<String> opts = Collections.<String>emptyList();
+            File testSrc = new File(System.getProperty("test.src"));
+            File thisFile = new File(testSrc, ClassTreeTest.class.getSimpleName() + ".java");
+            Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjects(thisFile);
+            JavacTask task = tool.getTask(null, fm, null, opts, null, fos);
+            for (CompilationUnitTree cu: task.parse()) {
+                check(cu, "CLASS", Tree.Kind.CLASS);
+                check(cu, "INTERFACE", Tree.Kind.INTERFACE);
+                check(cu, "ENUM", Tree.Kind.ENUM);
+                check(cu, "ANNOTATION_TYPE", Tree.Kind.ANNOTATION_TYPE);
+            }
+
+            int expected = 4;
+            if (checks != expected)
+                error("Unexpected number of checks performed; expected: " + expected + ", found: " + checks);
+
+            if (errors > 0)
+                throw new Exception(errors + " errors found");
         }
-
-        int expected = 4;
-        if (checks != expected)
-            error("Unexpected number of checks performed; expected: " + expected + ", found: " + checks);
-
-        if (errors > 0)
-            throw new Exception(errors + " errors found");
     }
 
     void check(CompilationUnitTree cu, String name, Tree.Kind k) {
--- a/langtools/test/tools/javac/tree/DocCommentToplevelTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/DocCommentToplevelTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -90,24 +90,25 @@
     public static void main(String... args) throws Exception {
         //create default shared JavaCompiler - reused across multiple compilations
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
 
-        for (PackageKind pk : PackageKind.values()) {
-            for (ImportKind ik : ImportKind.values()) {
-                for (ModifierKind mk1 : ModifierKind.values()) {
-                    for (ModifierKind mk2 : ModifierKind.values()) {
-                        for (ToplevelDocKind tdk : ToplevelDocKind.values()) {
-                            new DocCommentToplevelTest(pk, ik, mk1, mk2, tdk).run(comp, fm);
+            for (PackageKind pk : PackageKind.values()) {
+                for (ImportKind ik : ImportKind.values()) {
+                    for (ModifierKind mk1 : ModifierKind.values()) {
+                        for (ModifierKind mk2 : ModifierKind.values()) {
+                            for (ToplevelDocKind tdk : ToplevelDocKind.values()) {
+                                new DocCommentToplevelTest(pk, ik, mk1, mk2, tdk).run(comp, fm);
+                            }
                         }
                     }
                 }
             }
-        }
 
-        if (errors > 0)
-            throw new AssertionError(errors + " errors found");
+            if (errors > 0)
+                throw new AssertionError(errors + " errors found");
 
-        System.out.println(checks + " checks were made");
+            System.out.println(checks + " checks were made");
+        }
     }
 
     PackageKind pk;
--- a/langtools/test/tools/javac/tree/MissingSemicolonTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/MissingSemicolonTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -47,7 +47,7 @@
 import com.sun.tools.javac.util.Context;
 
 public class MissingSemicolonTest {
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         String testSrc = System.getProperty("test.src");
         File baseDir = new File(testSrc);
         boolean ok = new MissingSemicolonTest().run(baseDir, args);
@@ -56,24 +56,28 @@
         }
     }
 
-    boolean run(File baseDir, String... args) {
-        if (args.length == 0) {
-            throw new IllegalStateException("Needs input files.");
-        }
+    boolean run(File baseDir, String... args) throws IOException {
+        try {
+            if (args.length == 0) {
+                throw new IllegalStateException("Needs input files.");
+            }
 
-        for (String arg : args) {
-            File file = new File(baseDir, arg);
-            if (file.exists())
-                test(file);
-            else
-                error("File not found: " + file);
+            for (String arg : args) {
+                File file = new File(baseDir, arg);
+                if (file.exists())
+                    test(file);
+                else
+                    error("File not found: " + file);
+            }
+
+            System.err.println(fileCount + " files read");
+            if (errors > 0)
+                System.err.println(errors + " errors");
+
+            return errors == 0;
+        } finally {
+            fm.close();
         }
-
-        System.err.println(fileCount + " files read");
-        if (errors > 0)
-            System.err.println(errors + " errors");
-
-        return errors == 0;
     }
 
     void test(File file) {
--- a/langtools/test/tools/javac/tree/PrettySimpleStringTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/PrettySimpleStringTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -46,27 +46,28 @@
         File testSrc = new File(System.getProperty("test.src"));
         File thisFile = new File(testSrc, getClass().getName() + ".java");
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        JavacTask task = tool.getTask(null, fm, null, null, null,
-                fm.getJavaFileObjects(thisFile));
-        Iterable<? extends CompilationUnitTree> trees = task.parse();
-        CompilationUnitTree thisTree = trees.iterator().next();
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            JavacTask task = tool.getTask(null, fm, null, null, null,
+                    fm.getJavaFileObjects(thisFile));
+            Iterable<? extends CompilationUnitTree> trees = task.parse();
+            CompilationUnitTree thisTree = trees.iterator().next();
 
-        {   // test default
-            String thisSrc = Pretty.toSimpleString((JCTree) thisTree);
-            System.err.println(thisSrc);
-            String expect = "import jav[...]} } }";
-            if (!thisSrc.equals(expect)) {
-                throw new Exception("unexpected result");
+            {   // test default
+                String thisSrc = Pretty.toSimpleString((JCTree) thisTree);
+                System.err.println(thisSrc);
+                String expect = "import jav[...]} } }";
+                if (!thisSrc.equals(expect)) {
+                    throw new Exception("unexpected result");
+                }
             }
-        }
 
-        {   // test explicit length
-            String thisSrc = Pretty.toSimpleString((JCTree) thisTree, 32);
-            System.err.println(thisSrc);
-            String expect = "import java.io.Fil[...]; } } } }";
-            if (!thisSrc.equals(expect)) {
-                throw new Exception("unexpected result");
+            {   // test explicit length
+                String thisSrc = Pretty.toSimpleString((JCTree) thisTree, 32);
+                System.err.println(thisSrc);
+                String expect = "import java.io.Fil[...]} } } } }";
+                if (!thisSrc.equals(expect)) {
+                    throw new Exception("unexpected result");
+                }
             }
         }
     }
--- a/langtools/test/tools/javac/tree/T6963934.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/T6963934.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -42,17 +42,18 @@
         File testSrc = new File(System.getProperty("test.src"));
         File thisSrc = new File(testSrc, T6963934.class.getSimpleName() + ".java");
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
-        JavacTask task = (JavacTask) compiler.getTask(null, fileManager, null, null, null,
-                fileManager.getJavaFileObjects(thisSrc));
-        CompilationUnitTree tree = task.parse().iterator().next();
-        int count = 0;
-        for (ImportTree importTree : tree.getImports()) {
-            System.out.println(importTree);
-            count++;
+        try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null)) {
+            JavacTask task = (JavacTask) compiler.getTask(null, fileManager, null, null, null,
+                    fileManager.getJavaFileObjects(thisSrc));
+            CompilationUnitTree tree = task.parse().iterator().next();
+            int count = 0;
+            for (ImportTree importTree : tree.getImports()) {
+                System.out.println(importTree);
+                count++;
+            }
+            int expected = 7;
+            if (count != expected)
+                throw new Exception("unexpected number of imports found: " + count + ", expected: " + expected);
         }
-        int expected = 7;
-        if (count != expected)
-            throw new Exception("unexpected number of imports found: " + count + ", expected: " + expected);
     }
 }
--- a/langtools/test/tools/javac/tree/T6993305.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/T6993305.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -59,18 +59,19 @@
         File testSrc = new File(System.getProperty("test.src"));
 
         JavacTool tool = JavacTool.create();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+
+            File f = new File(testSrc, T6993305.class.getSimpleName() + ".java");
+            Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjects(f);
+            JavacTask task = tool.getTask(null, fm, null, null, null, fos);
+            Iterable<? extends CompilationUnitTree> cus = task.parse();
 
-        File f = new File(testSrc, T6993305.class.getSimpleName() + ".java");
-        Iterable<? extends JavaFileObject> fos = fm.getJavaFileObjects(f);
-        JavacTask task = tool.getTask(null, fm, null, null, null, fos);
-        Iterable<? extends CompilationUnitTree> cus = task.parse();
+            TestScanner s = new TestScanner();
+            s.scan(cus, task);
 
-        TestScanner s = new TestScanner();
-        s.scan(cus, task);
-
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
+        }
     }
 
     void error(String msg) {
--- a/langtools/test/tools/javac/tree/TestToString.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/TestToString.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -63,12 +63,16 @@
     }
 
     void run() throws Exception {
-        for (String s: statements) {
-            test(s);
+        try {
+            for (String s: statements) {
+                test(s);
+            }
+
+            if (errors > 0)
+                throw new Exception(errors + " errors found");
+        } finally {
+            fm.close();
         }
-
-        if (errors > 0)
-            throw new Exception(errors + " errors found");
     }
 
     void test(String stmt) throws IOException {
--- a/langtools/test/tools/javac/tree/TreePosRoundsTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/TreePosRoundsTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -54,18 +54,19 @@
         String testSrc = System.getProperty("test.src");
         String testClasses = System.getProperty("test.classes");
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
-        String thisName = TreePosRoundsTest.class.getName();
-        File thisFile = new File(testSrc, thisName + ".java");
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(thisFile);
-        List<String> options = Arrays.asList(
-                "-proc:only",
-                "-processor", thisName,
-                "-processorpath", testClasses);
-        CompilationTask t = c.getTask(null, fm, null, options, null, files);
-        boolean ok = t.call();
-        if (!ok)
-            throw new Exception("processing failed");
+        try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            String thisName = TreePosRoundsTest.class.getName();
+            File thisFile = new File(testSrc, thisName + ".java");
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(thisFile);
+            List<String> options = Arrays.asList(
+                    "-proc:only",
+                    "-processor", thisName,
+                    "-processorpath", testClasses);
+            CompilationTask t = c.getTask(null, fm, null, options, null, files);
+            boolean ok = t.call();
+            if (!ok)
+                throw new Exception("processing failed");
+        }
     }
 
     Filer filer;
@@ -155,6 +156,9 @@
                 //System.err.println("  encl: " +enclKind);
                 if (enclKind == Tree.Kind.CLASS || enclKind == Tree.Kind.BLOCK)
                     expect += ";";
+                // t-w-r- adds implicit final: remove it
+                if (enclKind == Tree.Kind.TRY && expect.startsWith("final "))
+                    expect = expect.substring(6);
             }
             //System.err.println("expect: " + expect);
 
--- a/langtools/test/tools/javac/tree/TreePosTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/tree/TreePosTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -113,7 +113,7 @@
      * args is the value of ${test.src}. In jtreg mode, the -r option can be
      * given to change the default base directory to the root test directory.
      */
-    public static void main(String... args) {
+    public static void main(String... args) throws IOException {
         String testSrc = System.getProperty("test.src");
         File baseDir = (testSrc == null) ? null : new File(testSrc);
         boolean ok = new TreePosTest().run(baseDir, args);
@@ -133,61 +133,65 @@
      * @param args command line args
      * @return true if successful or in gui mode
      */
-    boolean run(File baseDir, String... args) {
-        if (args.length == 0) {
-            usage(System.out);
-            return true;
-        }
+    boolean run(File baseDir, String... args) throws IOException {
+        try {
+            if (args.length == 0) {
+                usage(System.out);
+                return true;
+            }
 
-        List<File> files = new ArrayList<File>();
-        for (int i = 0; i < args.length; i++) {
-            String arg = args[i];
-            if (arg.equals("-encoding") && i + 1 < args.length)
-                encoding = args[++i];
-            else if (arg.equals("-gui"))
-                gui = true;
-            else if (arg.equals("-q"))
-                quiet = true;
-            else if (arg.equals("-v"))
-                verbose = true;
-            else if (arg.equals("-t") && i + 1 < args.length)
-                tags.add(args[++i]);
-            else if (arg.equals("-ef") && i + 1 < args.length)
-                excludeFiles.add(new File(baseDir, args[++i]));
-            else if (arg.equals("-et") && i + 1 < args.length)
-                excludeTags.add(args[++i]);
-            else if (arg.equals("-r")) {
-                if (excludeFiles.size() > 0)
-                    throw new Error("-r must be used before -ef");
-                File d = baseDir;
-                while (!new File(d, "TEST.ROOT").exists()) {
-                    d = d.getParentFile();
-                    if (d == null)
-                        throw new Error("cannot find TEST.ROOT");
+            List<File> files = new ArrayList<File>();
+            for (int i = 0; i < args.length; i++) {
+                String arg = args[i];
+                if (arg.equals("-encoding") && i + 1 < args.length)
+                    encoding = args[++i];
+                else if (arg.equals("-gui"))
+                    gui = true;
+                else if (arg.equals("-q"))
+                    quiet = true;
+                else if (arg.equals("-v"))
+                    verbose = true;
+                else if (arg.equals("-t") && i + 1 < args.length)
+                    tags.add(args[++i]);
+                else if (arg.equals("-ef") && i + 1 < args.length)
+                    excludeFiles.add(new File(baseDir, args[++i]));
+                else if (arg.equals("-et") && i + 1 < args.length)
+                    excludeTags.add(args[++i]);
+                else if (arg.equals("-r")) {
+                    if (excludeFiles.size() > 0)
+                        throw new Error("-r must be used before -ef");
+                    File d = baseDir;
+                    while (!new File(d, "TEST.ROOT").exists()) {
+                        d = d.getParentFile();
+                        if (d == null)
+                            throw new Error("cannot find TEST.ROOT");
+                    }
+                    baseDir = d;
                 }
-                baseDir = d;
+                else if (arg.startsWith("-"))
+                    throw new Error("unknown option: " + arg);
+                else {
+                    while (i < args.length)
+                        files.add(new File(baseDir, args[i++]));
+                }
             }
-            else if (arg.startsWith("-"))
-                throw new Error("unknown option: " + arg);
-            else {
-                while (i < args.length)
-                    files.add(new File(baseDir, args[i++]));
-            }
-        }
 
-        for (File file: files) {
-            if (file.exists())
-                test(file);
-            else
-                error("File not found: " + file);
-        }
+            for (File file: files) {
+                if (file.exists())
+                    test(file);
+                else
+                    error("File not found: " + file);
+            }
 
-        if (fileCount != 1)
-            System.err.println(fileCount + " files read");
-        if (errors > 0)
-            System.err.println(errors + " errors");
+            if (fileCount != 1)
+                System.err.println(fileCount + " files read");
+            if (errors > 0)
+                System.err.println(errors + " errors");
 
-        return (gui || errors == 0);
+            return (gui || errors == 0);
+        } finally {
+            fm.close();
+        }
     }
 
     /**
--- a/langtools/test/tools/javac/unit/T6198196.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/unit/T6198196.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -28,6 +28,7 @@
  * @author  Peter von der Ah\u00e9
  */
 
+import java.io.IOException;
 import java.util.Arrays;
 import javax.tools.*;
 
@@ -42,21 +43,25 @@
                                      + filename + ") != " + result);
         System.out.format("OK: endsWith(%s, %s) = %s%n", pathname, filename, result);
     }
-    public static void main(String[] args) {
+    public static void main(String[] args) throws IOException {
         fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null);
-        boolean windows = System.getProperty("os.name").startsWith("Windows");
-        test("/x/y/z/package-info.java", pkginf, true);
-        if (windows) {
-            test("\\x\\y\\z\\package-info.java", pkginf, true);
-            test("..\\x\\y\\z\\package-info.java", pkginf, true);
-        } else {
-            test("\\x\\y\\z\\package-info.java", pkginf, false);
-            test("..\\x\\y\\z\\package-info.java", pkginf, false);
+        try {
+            boolean windows = System.getProperty("os.name").startsWith("Windows");
+            test("/x/y/z/package-info.java", pkginf, true);
+            if (windows) {
+                test("\\x\\y\\z\\package-info.java", pkginf, true);
+                test("..\\x\\y\\z\\package-info.java", pkginf, true);
+            } else {
+                test("\\x\\y\\z\\package-info.java", pkginf, false);
+                test("..\\x\\y\\z\\package-info.java", pkginf, false);
+            }
+            test("Package-info.java", pkginf, false);
+            test("../x/y/z/package-info.java", pkginf, true);
+            test("/x/y/z/package-info.java", pkginf, true);
+            test("x/y/z/package-info.java", pkginf, true);
+            test("package-info.java", pkginf, true);
+        } finally {
+            fm.close();
         }
-        test("Package-info.java", pkginf, false);
-        test("../x/y/z/package-info.java", pkginf, true);
-        test("/x/y/z/package-info.java", pkginf, true);
-        test("x/y/z/package-info.java", pkginf, true);
-        test("package-info.java", pkginf, true);
     }
 }
--- a/langtools/test/tools/javac/varargs/6199075/T6199075.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/varargs/6199075/T6199075.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -143,20 +143,24 @@
     }
 
     void test() throws Exception {
-        for (TypeKind formal1 : TypeKind.values()) {
-            VarargsMethod m1 = new VarargsMethod(formal1);
-            for (TypeKind formal2 : TypeKind.values()) {
-                VarargsMethod m2 = new VarargsMethod(formal2);
-                for (TypeKind actual : TypeKind.values()) {
-                    for (ArgumentsArity argsArity : ArgumentsArity.values()) {
-                        compileAndCheck(m1, m2, actual, argsArity);
+        try {
+            for (TypeKind formal1 : TypeKind.values()) {
+                VarargsMethod m1 = new VarargsMethod(formal1);
+                for (TypeKind formal2 : TypeKind.values()) {
+                    VarargsMethod m2 = new VarargsMethod(formal2);
+                    for (TypeKind actual : TypeKind.values()) {
+                        for (ArgumentsArity argsArity : ArgumentsArity.values()) {
+                            compileAndCheck(m1, m2, actual, argsArity);
+                        }
                     }
                 }
             }
+
+            System.out.println("Total checks made: " + checkCount);
+            System.out.println("Bytecode checks made: " + bytecodeCheckCount);
+        } finally {
+            fm.close();
         }
-
-        System.out.println("Total checks made: " + checkCount);
-        System.out.println("Bytecode checks made: " + bytecodeCheckCount);
     }
 
     // Create a single file manager and reuse it for each compile to save time.
--- a/langtools/test/tools/javac/varargs/7043922/T7043922.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/varargs/7043922/T7043922.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -146,22 +146,26 @@
     static final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
 
     public static void main(String... args) throws Exception {
-        for (ClassKind classKind1 : ClassKind.values()) {
-            for (ConstructorKind constrKind1 : ConstructorKind.values()) {
-                if (!classKind1.isConstructorOk(constrKind1)) continue;
-                for (ClassKind classKind2 : ClassKind.values()) {
-                    for (ConstructorKind constrKind2 : ConstructorKind.values()) {
-                        if (!classKind2.isConstructorOk(constrKind2)) continue;
-                        for (ClassKind classKind3 : ClassKind.values()) {
-                            for (ConstructorKind constrKind3 : ConstructorKind.values()) {
-                                if (!classKind3.isConstructorOk(constrKind3)) continue;
-                                new T7043922(new ClassKind[] { classKind1, classKind2, classKind3 },
-                                        new ConstructorKind[] { constrKind1, constrKind2, constrKind3 }).compileAndCheck();
+        try {
+            for (ClassKind classKind1 : ClassKind.values()) {
+                for (ConstructorKind constrKind1 : ConstructorKind.values()) {
+                    if (!classKind1.isConstructorOk(constrKind1)) continue;
+                    for (ClassKind classKind2 : ClassKind.values()) {
+                        for (ConstructorKind constrKind2 : ConstructorKind.values()) {
+                            if (!classKind2.isConstructorOk(constrKind2)) continue;
+                            for (ClassKind classKind3 : ClassKind.values()) {
+                                for (ConstructorKind constrKind3 : ConstructorKind.values()) {
+                                    if (!classKind3.isConstructorOk(constrKind3)) continue;
+                                    new T7043922(new ClassKind[] { classKind1, classKind2, classKind3 },
+                                            new ConstructorKind[] { constrKind1, constrKind2, constrKind3 }).compileAndCheck();
+                                }
                             }
                         }
                     }
                 }
             }
+        } finally {
+            fm.close();
         }
     }
 
--- a/langtools/test/tools/javac/versions/Versions.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javac/versions/Versions.java	Wed Jul 05 20:06:12 2017 +0200
@@ -278,22 +278,25 @@
 
     protected boolean compile(String sourceFile, List<String>options) {
         JavaCompiler.CompilationTask jctask;
-        StandardJavaFileManager fm = javacompiler.getStandardFileManager(null, null, null);
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(sourceFile);
+        try (StandardJavaFileManager fm = javacompiler.getStandardFileManager(null, null, null)) {
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(sourceFile);
 
-        jctask = javacompiler.getTask(
-            null,    // Writer
-            fm,      // JavaFileManager
-            null,    // DiagnosticListener
-            options, // Iterable<String>
-            null,    // Iterable<String> classes
-            files);  // Iterable<? extends JavaFileObject>
+            jctask = javacompiler.getTask(
+                null,    // Writer
+                fm,      // JavaFileManager
+                null,    // DiagnosticListener
+                options, // Iterable<String>
+                null,    // Iterable<String> classes
+                files);  // Iterable<? extends JavaFileObject>
 
-        try {
-            return jctask.call();
-        } catch (IllegalStateException e) {
-            System.err.println(e);
-            return false;
+            try {
+                return jctask.call();
+            } catch (IllegalStateException e) {
+                System.err.println(e);
+                return false;
+            }
+        } catch (IOException e) {
+            throw new Error(e);
         }
     }
 
--- a/langtools/test/tools/javadoc/CheckResourceKeys.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/CheckResourceKeys.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -140,41 +140,42 @@
     Set<String> getCodeKeys() throws IOException {
         Set<String> results = new TreeSet<String>();
         JavaCompiler c = ToolProvider.getSystemJavaCompiler();
-        JavaFileManager fm = c.getStandardFileManager(null, null, null);
-        JavaFileManager.Location javadocLoc = findJavadocLocation(fm);
-        String[] pkgs = {
-            "com.sun.tools.doclets",
-            "com.sun.tools.javadoc"
-        };
-        for (String pkg: pkgs) {
-            for (JavaFileObject fo: fm.list(javadocLoc,
-                    pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) {
-                String name = fo.getName();
-                // ignore resource files
-                if (name.matches(".*resources.[A-Za-z_0-9]+\\.class.*"))
-                    continue;
-                scan(fo, results);
+        try (JavaFileManager fm = c.getStandardFileManager(null, null, null)) {
+            JavaFileManager.Location javadocLoc = findJavadocLocation(fm);
+            String[] pkgs = {
+                "com.sun.tools.doclets",
+                "com.sun.tools.javadoc"
+            };
+            for (String pkg: pkgs) {
+                for (JavaFileObject fo: fm.list(javadocLoc,
+                        pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) {
+                    String name = fo.getName();
+                    // ignore resource files
+                    if (name.matches(".*resources.[A-Za-z_0-9]+\\.class.*"))
+                        continue;
+                    scan(fo, results);
+                }
             }
-        }
 
-        // special handling for code strings synthesized in
-        // com.sun.tools.doclets.internal.toolkit.util.Util.getTypeName
-        String[] extras = {
-            "AnnotationType", "Class", "Enum", "Error", "Exception", "Interface"
-        };
-        for (String s: extras) {
-            if (results.contains("doclet." + s))
-                results.add("doclet." + s.toLowerCase());
+            // special handling for code strings synthesized in
+            // com.sun.tools.doclets.internal.toolkit.util.Util.getTypeName
+            String[] extras = {
+                "AnnotationType", "Class", "Enum", "Error", "Exception", "Interface"
+            };
+            for (String s: extras) {
+                if (results.contains("doclet." + s))
+                    results.add("doclet." + s.toLowerCase());
+            }
+
+            // special handling for code strings synthesized in
+            // com.sun.tools.javadoc.Messager
+            results.add("javadoc.error.msg");
+            results.add("javadoc.note.msg");
+            results.add("javadoc.note.pos.msg");
+            results.add("javadoc.warning.msg");
+
+            return results;
         }
-
-        // special handling for code strings synthesized in
-        // com.sun.tools.javadoc.Messager
-        results.add("javadoc.error.msg");
-        results.add("javadoc.note.msg");
-        results.add("javadoc.note.pos.msg");
-        results.add("javadoc.warning.msg");
-
-        return results;
     }
 
     // depending on how the test is run, javadoc may be on bootclasspath or classpath
--- a/langtools/test/tools/javadoc/api/basic/DocletPathTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/DocletPathTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -59,34 +59,36 @@
                 createSimpleJavaFileObject("DocletOnDocletPath", docletSrcText);
         File docletDir = getOutDir("classes");
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager cfm = compiler.getStandardFileManager(null, null, null);
-        cfm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(docletDir));
-        Iterable<? extends JavaFileObject> cfiles = Arrays.asList(docletSrc);
-        if (!compiler.getTask(null, cfm, null, null, null, cfiles).call())
-            throw new Exception("cannot compile doclet");
+        try (StandardJavaFileManager cfm = compiler.getStandardFileManager(null, null, null)) {
+            cfm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(docletDir));
+            Iterable<? extends JavaFileObject> cfiles = Arrays.asList(docletSrc);
+            if (!compiler.getTask(null, cfm, null, null, null, cfiles).call())
+                throw new Exception("cannot compile doclet");
+        }
 
         JavaFileObject srcFile = createSimpleJavaFileObject();
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir("api");
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        fm.setLocation(DocumentationTool.Location.DOCLET_PATH, Arrays.asList(docletDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        Iterable<String> options = Arrays.asList("-doclet", "DocletOnDocletPath");
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        DocumentationTask t = tool.getTask(pw, fm, null, null, options, files);
-        boolean ok = t.call();
-        String out = sw.toString();
-        System.err.println(">>" + out + "<<");
-        if (ok) {
-            if (out.contains(TEST_STRING)) {
-                System.err.println("doclet executed as expected");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir("api");
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            fm.setLocation(DocumentationTool.Location.DOCLET_PATH, Arrays.asList(docletDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            Iterable<String> options = Arrays.asList("-doclet", "DocletOnDocletPath");
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            DocumentationTask t = tool.getTask(pw, fm, null, null, options, files);
+            boolean ok = t.call();
+            String out = sw.toString();
+            System.err.println(">>" + out + "<<");
+            if (ok) {
+                if (out.contains(TEST_STRING)) {
+                    System.err.println("doclet executed as expected");
+                } else {
+                    error("test string not found in doclet output");
+                }
             } else {
-                error("test string not found in doclet output");
+                error("task failed");
             }
-        } else {
-            error("task failed");
         }
     }
 
--- a/langtools/test/tools/javadoc/api/basic/GetTask_DiagListenerTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/GetTask_DiagListenerTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -60,27 +60,28 @@
     public void testDiagListener() throws Exception {
         JavaFileObject srcFile = createSimpleJavaFileObject("pkg/C", "package pkg; public error { }");
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        DiagnosticCollector<JavaFileObject> dc = new DiagnosticCollector<JavaFileObject>();
-        DocumentationTask t = tool.getTask(null, fm, dc, null, null, files);
-        if (t.call()) {
-            throw new Exception("task succeeded unexpectedly");
-        } else {
-            List<String> diagCodes = new ArrayList<String>();
-            for (Diagnostic d: dc.getDiagnostics()) {
-                System.err.println(d);
-                diagCodes.add(d.getCode());
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            DiagnosticCollector<JavaFileObject> dc = new DiagnosticCollector<JavaFileObject>();
+            DocumentationTask t = tool.getTask(null, fm, dc, null, null, files);
+            if (t.call()) {
+                throw new Exception("task succeeded unexpectedly");
+            } else {
+                List<String> diagCodes = new ArrayList<String>();
+                for (Diagnostic d: dc.getDiagnostics()) {
+                    System.err.println(d);
+                    diagCodes.add(d.getCode());
+                }
+                List<String> expect = Arrays.asList(
+                        "javadoc.note.msg",         // Loading source file
+                        "compiler.err.expected3",   // class, interface, or enum expected
+                        "javadoc.note.msg");        // 1 error
+                if (!diagCodes.equals(expect))
+                    throw new Exception("unexpected diagnostics occurred");
+                System.err.println("diagnostics received as expected");
             }
-            List<String> expect = Arrays.asList(
-                    "javadoc.note.msg",         // Loading source file
-                    "compiler.err.expected3",   // class, interface, or enum expected
-                    "javadoc.note.msg");        // 1 error
-            if (!diagCodes.equals(expect))
-                throw new Exception("unexpected diagnostics occurred");
-            System.err.println("diagnostics received as expected");
         }
     }
 
--- a/langtools/test/tools/javadoc/api/basic/GetTask_DocletClassTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/GetTask_DocletClassTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -70,20 +70,21 @@
                 "pkg/C",
                 "package pkg; /** " + key + "*/ public class C { }");
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        DocumentationTask t = tool.getTask(null, fm, null, TestDoclet.class, null, files);
-        if (t.call()) {
-            System.err.println("task succeeded");
-            if (TestDoclet.lastCaller.equals(String.valueOf(key)))
-                System.err.println("found expected key: " + key);
-            else
-                error("Expected key not found");
-            checkFiles(outDir, Collections.<String>emptySet());
-        } else {
-            throw new Exception("task failed");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            DocumentationTask t = tool.getTask(null, fm, null, TestDoclet.class, null, files);
+            if (t.call()) {
+                System.err.println("task succeeded");
+                if (TestDoclet.lastCaller.equals(String.valueOf(key)))
+                    System.err.println("found expected key: " + key);
+                else
+                    error("Expected key not found");
+                checkFiles(outDir, Collections.<String>emptySet());
+            } else {
+                throw new Exception("task failed");
+            }
         }
     }
 
@@ -115,20 +116,21 @@
     public void testBadDoclet() throws Exception {
         JavaFileObject srcFile = createSimpleJavaFileObject();
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        DocumentationTask t = tool.getTask(null, fm, null, BadDoclet.class, null, files);
-        try {
-            t.call();
-            error("call completed without exception");
-        } catch (RuntimeException e) {
-            Throwable c = e.getCause();
-            if (c.getClass() == UnexpectedError.class)
-                System.err.println("exception caught as expected: " + c);
-            else
-                throw e;
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            DocumentationTask t = tool.getTask(null, fm, null, BadDoclet.class, null, files);
+            try {
+                t.call();
+                error("call completed without exception");
+            } catch (RuntimeException e) {
+                Throwable c = e.getCause();
+                if (c.getClass() == UnexpectedError.class)
+                    System.err.println("exception caught as expected: " + c);
+                else
+                    throw e;
+            }
         }
     }
 
--- a/langtools/test/tools/javadoc/api/basic/GetTask_FileObjectsTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/GetTask_FileObjectsTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -54,16 +54,17 @@
         File testSrc = new File(System.getProperty("test.src"));
         File srcFile = new File(testSrc, "pkg/C.java");
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(srcFile);
-        DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
-        if (t.call()) {
-            System.err.println("task succeeded");
-            checkFiles(outDir, standardExpectFiles);
-        } else {
-            throw new Exception("task failed");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(srcFile);
+            DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
+            if (t.call()) {
+                System.err.println("task succeeded");
+                checkFiles(outDir, standardExpectFiles);
+            } else {
+                throw new Exception("task failed");
+            }
         }
     }
 
@@ -75,16 +76,17 @@
     public void testMemoryFileObject() throws Exception {
         JavaFileObject srcFile = createSimpleJavaFileObject();
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
-        if (t.call()) {
-            System.err.println("task succeeded");
-            checkFiles(outDir, standardExpectFiles);
-        } else {
-            throw new Exception("task failed");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
+            if (t.call()) {
+                System.err.println("task succeeded");
+                checkFiles(outDir, standardExpectFiles);
+            } else {
+                throw new Exception("task failed");
+            }
         }
     }
 
@@ -96,15 +98,16 @@
         File testSrc = new File(System.getProperty("test.src"));
         File srcFile = new File(testSrc, "pkg/C.class");  // unacceptable file kind
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(srcFile);
-        try {
-            DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
-            error("getTask succeeded, no exception thrown");
-        } catch (IllegalArgumentException e) {
-            System.err.println("exception caught as expected: " + e);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects(srcFile);
+            try {
+                DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
+                error("getTask succeeded, no exception thrown");
+            } catch (IllegalArgumentException e) {
+                System.err.println("exception caught as expected: " + e);
+            }
         }
     }
 
@@ -114,15 +117,16 @@
     @Test
     public void testNull() throws Exception {
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList((JavaFileObject) null);
-        try {
-            DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
-            error("getTask succeeded, no exception thrown");
-        } catch (NullPointerException e) {
-            System.err.println("exception caught as expected: " + e);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList((JavaFileObject) null);
+            try {
+                DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
+                error("getTask succeeded, no exception thrown");
+            } catch (NullPointerException e) {
+                System.err.println("exception caught as expected: " + e);
+            }
         }
     }
 
--- a/langtools/test/tools/javadoc/api/basic/GetTask_OptionsTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/GetTask_OptionsTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -54,19 +54,20 @@
     public void testNoIndex() throws Exception {
         JavaFileObject srcFile = createSimpleJavaFileObject();
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        Iterable<String> options = Arrays.asList("-noindex");
-        DocumentationTask t = tool.getTask(null, fm, null, null, options, files);
-        if (t.call()) {
-            System.err.println("task succeeded");
-            Set<String> expectFiles = new TreeSet<String>(standardExpectFiles);
-            expectFiles.remove("index-all.html");
-            checkFiles(outDir, expectFiles);
-        } else {
-            error("task failed");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            Iterable<String> options = Arrays.asList("-noindex");
+            DocumentationTask t = tool.getTask(null, fm, null, null, options, files);
+            if (t.call()) {
+                System.err.println("task succeeded");
+                Set<String> expectFiles = new TreeSet<String>(standardExpectFiles);
+                expectFiles.remove("index-all.html");
+                checkFiles(outDir, expectFiles);
+            } else {
+                error("task failed");
+            }
         }
     }
 
@@ -77,16 +78,17 @@
     public void testNull() throws Exception {
         JavaFileObject srcFile = createSimpleJavaFileObject();
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<String> options = Arrays.asList((String) null);
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        try {
-            DocumentationTask t = tool.getTask(null, fm, null, null, options, files);
-            error("getTask succeeded, no exception thrown");
-        } catch (NullPointerException e) {
-            System.err.println("exception caught as expected: " + e);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<String> options = Arrays.asList((String) null);
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            try {
+                DocumentationTask t = tool.getTask(null, fm, null, null, options, files);
+                error("getTask succeeded, no exception thrown");
+            } catch (NullPointerException e) {
+                System.err.println("exception caught as expected: " + e);
+            }
         }
     }
 
--- a/langtools/test/tools/javadoc/api/basic/GetTask_WriterTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/GetTask_WriterTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -54,25 +54,26 @@
     public void testWriter() throws Exception {
         JavaFileObject srcFile = createSimpleJavaFileObject();
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        DocumentationTask t = tool.getTask(pw, fm, null, null, null, files);
-        if (t.call()) {
-            System.err.println("task succeeded");
-            checkFiles(outDir, standardExpectFiles);
-            String out = sw.toString();
-            System.err.println(">>" + out + "<<");
-            for (String f: standardExpectFiles) {
-                String f1 = f.replace('/', File.separatorChar);
-                if (f1.endsWith(".html") && !out.contains(f1))
-                    throw new Exception("expected string not found: " + f1);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            DocumentationTask t = tool.getTask(pw, fm, null, null, null, files);
+            if (t.call()) {
+                System.err.println("task succeeded");
+                checkFiles(outDir, standardExpectFiles);
+                String out = sw.toString();
+                System.err.println(">>" + out + "<<");
+                for (String f: standardExpectFiles) {
+                    String f1 = f.replace('/', File.separatorChar);
+                    if (f1.endsWith(".html") && !out.contains(f1))
+                        throw new Exception("expected string not found: " + f1);
+                }
+            } else {
+                throw new Exception("task failed");
             }
-        } else {
-            throw new Exception("task failed");
         }
     }
 }
--- a/langtools/test/tools/javadoc/api/basic/JavadocTaskImplTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/JavadocTaskImplTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -56,18 +56,19 @@
     public void testRawCall() throws Exception {
         JavaFileObject srcFile = createSimpleJavaFileObject();
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
 
-        @SuppressWarnings("rawtypes")
-        Callable t = tool.getTask(null, fm, null, null, null, files);
+            @SuppressWarnings("rawtypes")
+            Callable t = tool.getTask(null, fm, null, null, null, files);
 
-        if (t.call() == Boolean.TRUE) {
-            System.err.println("task succeeded");
-        } else {
-            throw new Exception("task failed");
+            if (t.call() == Boolean.TRUE) {
+                System.err.println("task succeeded");
+            } else {
+                throw new Exception("task failed");
+            }
         }
     }
 
@@ -77,14 +78,15 @@
         Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
         Context c = new Context();
         Messager.preRegister(c, "javadoc");
-        StandardJavaFileManager fm = new JavacFileManager(c, true, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        DocumentationTask t = new JavadocTaskImpl(c, null, null, files);
-        if (t.call()) {
-            System.err.println("task succeeded");
-        } else {
-            throw new Exception("task failed");
+        try (StandardJavaFileManager fm = new JavacFileManager(c, true, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            DocumentationTask t = new JavadocTaskImpl(c, null, null, files);
+            if (t.call()) {
+                System.err.println("task succeeded");
+            } else {
+                throw new Exception("task failed");
+            }
         }
     }
 
@@ -94,14 +96,15 @@
         Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
         Context c = new Context();
         Messager.preRegister(c, "javadoc");
-        StandardJavaFileManager fm = new JavacFileManager(c, true, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        try {
-            DocumentationTask t = new JavadocTaskImpl(c, null, null, files);;
-            error("getTask succeeded, no exception thrown");
-        } catch (NullPointerException e) {
-            System.err.println("exception caught as expected: " + e);
+        try (StandardJavaFileManager fm = new JavacFileManager(c, true, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            try {
+                DocumentationTask t = new JavadocTaskImpl(c, null, null, files);;
+                error("getTask succeeded, no exception thrown");
+            } catch (NullPointerException e) {
+                System.err.println("exception caught as expected: " + e);
+            }
         }
     }
 }
--- a/langtools/test/tools/javadoc/api/basic/TagletPathTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/TagletPathTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -62,38 +62,40 @@
         File tagletSrcFile = new File(testSrc, "taglets/UnderlineTaglet.java");
         File tagletDir = getOutDir("classes");
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager cfm = compiler.getStandardFileManager(null, null, null);
-        cfm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(tagletDir));
-        Iterable<? extends JavaFileObject> cfiles = cfm.getJavaFileObjects(tagletSrcFile);
-        if (!compiler.getTask(null, cfm, null, null, null, cfiles).call())
-            throw new Exception("cannot compile taglet");
+        try (StandardJavaFileManager cfm = compiler.getStandardFileManager(null, null, null)) {
+            cfm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(tagletDir));
+            Iterable<? extends JavaFileObject> cfiles = cfm.getJavaFileObjects(tagletSrcFile);
+            if (!compiler.getTask(null, cfm, null, null, null, cfiles).call())
+                throw new Exception("cannot compile taglet");
+        }
 
         JavaFileObject srcFile = createSimpleJavaFileObject("pkg/C", testSrcText);
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir("api");
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        fm.setLocation(DocumentationTool.Location.TAGLET_PATH, Arrays.asList(tagletDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        Iterable<String> options = Arrays.asList("-taglet", "UnderlineTaglet");
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        DocumentationTask t = tool.getTask(pw, fm, null, null, options, files);
-        boolean ok = t.call();
-        String out = sw.toString();
-        System.err.println(">>" + out + "<<");
-        if (ok) {
-            File f = new File(outDir, "pkg/C.html");
-            List<String> doc = Files.readAllLines(f.toPath(), Charset.defaultCharset());
-            for (String line: doc) {
-                if (line.contains("<u>" + TEST_STRING + "</u>")) {
-                    System.err.println("taglet executed as expected");
-                    return;
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir("api");
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            fm.setLocation(DocumentationTool.Location.TAGLET_PATH, Arrays.asList(tagletDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            Iterable<String> options = Arrays.asList("-taglet", "UnderlineTaglet");
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            DocumentationTask t = tool.getTask(pw, fm, null, null, options, files);
+            boolean ok = t.call();
+            String out = sw.toString();
+            System.err.println(">>" + out + "<<");
+            if (ok) {
+                File f = new File(outDir, "pkg/C.html");
+                List<String> doc = Files.readAllLines(f.toPath(), Charset.defaultCharset());
+                for (String line: doc) {
+                    if (line.contains("<u>" + TEST_STRING + "</u>")) {
+                        System.err.println("taglet executed as expected");
+                        return;
+                    }
                 }
+                error("expected text not found in output " + f);
+            } else {
+                error("task failed");
             }
-            error("expected text not found in output " + f);
-        } else {
-            error("task failed");
         }
     }
 
--- a/langtools/test/tools/javadoc/api/basic/Task_reuseTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/api/basic/Task_reuseTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -77,16 +77,17 @@
     private DocumentationTask getAndRunTask() throws Exception {
         JavaFileObject srcFile = createSimpleJavaFileObject();
         DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
-        StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
-        File outDir = getOutDir();
-        fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
-        Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
-        DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
-        if (t.call()) {
-            System.err.println("task succeeded");
-            return t;
-        } else {
-            throw new Exception("task failed");
+        try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
+            File outDir = getOutDir();
+            fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
+            Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
+            DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
+            if (t.call()) {
+                System.err.println("task succeeded");
+                return t;
+            } else {
+                throw new Exception("task failed");
+            }
         }
     }
 }
--- a/langtools/test/tools/javadoc/doclint/DocLintTest.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javadoc/doclint/DocLintTest.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -121,60 +121,64 @@
     void run() throws Exception {
         javadoc = ToolProvider.getSystemDocumentationTool();
         fm = javadoc.getStandardFileManager(null, null, null);
-        fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
-        file = new SimpleJavaFileObject(URI.create("Test.java"), JavaFileObject.Kind.SOURCE) {
-            @Override
-            public CharSequence getCharContent(boolean ignoreEncoding) {
-                return code;
-            }
-        };
+        try {
+            fm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(".")));
+            file = new SimpleJavaFileObject(URI.create("Test.java"), JavaFileObject.Kind.SOURCE) {
+                @Override
+                public CharSequence getCharContent(boolean ignoreEncoding) {
+                    return code;
+                }
+            };
 
-        test(Collections.<String>emptyList(),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR9A, Message.DL_WRN12A));
+            test(Collections.<String>emptyList(),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR9A, Message.DL_WRN12A));
 
-        test(Arrays.asList(rawDiags),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR9, Message.DL_WRN12));
+            test(Arrays.asList(rawDiags),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR9, Message.DL_WRN12));
+
+            test(Arrays.asList("-Xdoclint:none"),
+                    Main.Result.OK,
+                    EnumSet.of(Message.JD_WRN10, Message.JD_WRN13));
 
-        test(Arrays.asList("-Xdoclint:none"),
-                Main.Result.OK,
-                EnumSet.of(Message.JD_WRN10, Message.JD_WRN13));
+            test(Arrays.asList(rawDiags, "-Xdoclint"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR9, Message.DL_WRN12));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR9, Message.DL_WRN12));
+            test(Arrays.asList(rawDiags, "-Xdoclint:all/public"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.OPT_BADQUAL));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:all/public"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.OPT_BADQUAL));
+            test(Arrays.asList(rawDiags, "-Xdoclint:all", "-public"),
+                    Main.Result.OK,
+                    EnumSet.of(Message.DL_WRN12));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:all", "-public"),
-                Main.Result.OK,
-                EnumSet.of(Message.DL_WRN12));
+            test(Arrays.asList(rawDiags, "-Xdoclint:syntax"),
+                    Main.Result.OK,
+                    EnumSet.of(Message.DL_WRN12));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:syntax"),
-                Main.Result.OK,
-                EnumSet.of(Message.DL_WRN12));
+            test(Arrays.asList(rawDiags, "-private"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR6, Message.DL_ERR9, Message.DL_WRN12));
 
-        test(Arrays.asList(rawDiags, "-private"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR6, Message.DL_ERR9, Message.DL_WRN12));
+            test(Arrays.asList(rawDiags, "-Xdoclint:syntax", "-private"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR6, Message.DL_WRN12));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:syntax", "-private"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR6, Message.DL_WRN12));
+            test(Arrays.asList(rawDiags, "-Xdoclint:reference"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.DL_ERR9));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:reference"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.DL_ERR9));
+            test(Arrays.asList(rawDiags, "-Xdoclint:badarg"),
+                    Main.Result.ERROR,
+                    EnumSet.of(Message.OPT_BADARG));
 
-        test(Arrays.asList(rawDiags, "-Xdoclint:badarg"),
-                Main.Result.ERROR,
-                EnumSet.of(Message.OPT_BADARG));
-
-        if (errors > 0)
-            throw new Exception(errors + " errors occurred");
+            if (errors > 0)
+                throw new Exception(errors + " errors occurred");
+        } finally {
+            fm.close();
+        }
     }
 
     void test(List<String> opts, Main.Result expectResult, Set<Message> expectMessages) {
--- a/langtools/test/tools/javap/T6729471.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javap/T6729471.java	Wed Jul 05 20:06:12 2017 +0200
@@ -25,10 +25,7 @@
 /*
  * @test
  * @bug 6729471
- * @summary javap should accept class files on the command line
- * @library /tools/lib
- * @build ToolBox
- * @run main T6729471
+ * @summary javap does not output inner interfaces of an interface
  */
 
 import java.io.*;
@@ -60,26 +57,30 @@
         verify(new File(testClasses, "T6729471.class").toURI().toString(),
                 "public static void main(java.lang.String...)");
 
-        // jar url
-        // Create a temp jar
-        ToolBox tb = new ToolBox();
-        tb.new JavacTask()
-          .sources("class Foo { public void sayHello() {} }")
-          .run();
-        String foo_jar = "foo.jar";
-        tb.new JarTask(foo_jar)
-          .files("Foo.class")
-          .run();
-        File foo_jarFile = new File(foo_jar);
-
-        // Verify
+        // jar url: rt.jar
+        File java_home = new File(System.getProperty("java.home"));
+        if (java_home.getName().equals("jre"))
+            java_home = java_home.getParentFile();
+        File rt_jar = new File(new File(new File(java_home, "jre"), "lib"), "rt.jar");
         try {
-            verify("jar:" + foo_jarFile.toURL() + "!/Foo.class",
-                "public void sayHello()");
+            verify("jar:" + rt_jar.toURL() + "!/java/util/Map.class",
+                "public abstract boolean containsKey(java.lang.Object)");
         } catch (MalformedURLException e) {
             error(e.toString());
         }
 
+        // jar url: ct.sym, if it exists
+        File ct_sym = new File(new File(java_home, "lib"), "ct.sym");
+        if (ct_sym.exists()) {
+            try {
+                verify("jar:" + ct_sym.toURL() + "!/META-INF/sym/rt.jar/java/util/Map.class",
+                    "public abstract boolean containsKey(java.lang.Object)");
+            } catch (MalformedURLException e) {
+                error(e.toString());
+            }
+        } else
+            System.err.println("warning: ct.sym not found");
+
         if (errors > 0)
             throw new Error(errors + " found.");
     }
--- a/langtools/test/tools/javap/TestSuperclass.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/javap/TestSuperclass.java	Wed Jul 05 20:06:12 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -77,19 +77,20 @@
 
     public static void main(String... args) throws Exception {
         JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
-        int errors = 0;
+        try (StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
+            int errors = 0;
 
-        for (ClassKind ck: ClassKind.values()) {
-            for (GenericKind gk: GenericKind.values()) {
-                for (SuperKind sk: SuperKind.values()) {
-                    errors += new TestSuperclass(ck, gk, sk).run(comp, fm);
+            for (ClassKind ck: ClassKind.values()) {
+                for (GenericKind gk: GenericKind.values()) {
+                    for (SuperKind sk: SuperKind.values()) {
+                        errors += new TestSuperclass(ck, gk, sk).run(comp, fm);
+                    }
                 }
             }
+
+            if (errors > 0)
+                throw new Exception(errors + " errors found");
         }
-
-        if (errors > 0)
-            throw new Exception(errors + " errors found");
     }
 
     final ClassKind ck;
--- a/langtools/test/tools/sjavac/DependencyCollection.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/langtools/test/tools/sjavac/DependencyCollection.java	Wed Jul 05 20:06:12 2017 +0200
@@ -59,59 +59,60 @@
         Path src = Paths.get(ToolBox.testSrc, "test-input", "src");
 
         JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
-        StandardJavaFileManager fileManager = javac.getStandardFileManager(null, null, null);
-        SmartFileManager smartFileManager = new SmartFileManager(fileManager);
-        smartFileManager.setSymbolFileEnabled(false);
-        Iterable<? extends JavaFileObject> fileObjects =
-                fileManager.getJavaFileObjectsFromFiles(Arrays.asList(src.resolve("pkg/Test.java").toFile()));
-        JavacTaskImpl task = (JavacTaskImpl) javac.getTask(new PrintWriter(System.out),
-                                                           smartFileManager,
-                                                           null,
-                                                           Arrays.asList("-d", "classes",
-                                                                         "-sourcepath", src.toAbsolutePath().toString()),
-                                                           null,
-                                                           fileObjects);
-        DependencyCollector depsCollector = new DependencyCollector();
-        task.addTaskListener(depsCollector);
-        task.doCall();
+        try (StandardJavaFileManager fileManager = javac.getStandardFileManager(null, null, null)) {
+            SmartFileManager smartFileManager = new SmartFileManager(fileManager);
+            smartFileManager.setSymbolFileEnabled(false);
+            Iterable<? extends JavaFileObject> fileObjects =
+                    fileManager.getJavaFileObjectsFromFiles(Arrays.asList(src.resolve("pkg/Test.java").toFile()));
+            JavacTaskImpl task = (JavacTaskImpl) javac.getTask(new PrintWriter(System.out),
+                                                               smartFileManager,
+                                                               null,
+                                                               Arrays.asList("-d", "classes",
+                                                                             "-sourcepath", src.toAbsolutePath().toString()),
+                                                               null,
+                                                               fileObjects);
+            DependencyCollector depsCollector = new DependencyCollector();
+            task.addTaskListener(depsCollector);
+            task.doCall();
 
-        // Find pkg symbol
-        PackageSymbol pkg = findPkgSymbolWithName(depsCollector.getSourcePackages(), "pkg");
-        Set<PackageSymbol> foundDependencies = depsCollector.getDependenciesForPkg(pkg);
+            // Find pkg symbol
+            PackageSymbol pkg = findPkgSymbolWithName(depsCollector.getSourcePackages(), "pkg");
+            Set<PackageSymbol> foundDependencies = depsCollector.getDependenciesForPkg(pkg);
 
-        // Print dependencies
-        System.out.println("Found dependencies:");
-        foundDependencies.stream()
-                         .sorted(Comparator.comparing(DependencyCollection::extractNumber))
-                         .forEach(p -> System.out.println("    " + p));
+            // Print dependencies
+            System.out.println("Found dependencies:");
+            foundDependencies.stream()
+                             .sorted(Comparator.comparing(DependencyCollection::extractNumber))
+                             .forEach(p -> System.out.println("    " + p));
 
-        // Check result
-        Set<Integer> found = foundDependencies.stream()
-                                              .map(DependencyCollection::extractNumber)
-                                              .collect(Collectors.toSet());
-        found.remove(-1); // Dependencies with no number (java.lang etc)
-        Set<Integer> expected = new HashSet<>();
-        for (int i = 2; i <= 30; i++) {
-            if (i == 15) continue;  // Case 15 correspond to the type of a throw-away return value.
-            expected.add(i);
-        }
+            // Check result
+            Set<Integer> found = foundDependencies.stream()
+                                                  .map(DependencyCollection::extractNumber)
+                                                  .collect(Collectors.toSet());
+            found.remove(-1); // Dependencies with no number (java.lang etc)
+            Set<Integer> expected = new HashSet<>();
+            for (int i = 2; i <= 30; i++) {
+                if (i == 15) continue;  // Case 15 correspond to the type of a throw-away return value.
+                expected.add(i);
+            }
 
-        Set<Integer> missing = new HashSet<>(expected);
-        missing.removeAll(found);
-        if (missing.size() > 0) {
-            System.out.println("Missing dependencies:");
-            missing.forEach(i -> System.out.println("    Dependency " + i));
-        }
+            Set<Integer> missing = new HashSet<>(expected);
+            missing.removeAll(found);
+            if (missing.size() > 0) {
+                System.out.println("Missing dependencies:");
+                missing.forEach(i -> System.out.println("    Dependency " + i));
+            }
 
-        Set<Integer> unexpected = new HashSet<>(found);
-        unexpected.removeAll(expected);
-        if (unexpected.size() > 0) {
-            System.out.println("Unexpected dependencies found:");
-            unexpected.forEach(i -> System.out.println("    Dependency " + i));
+            Set<Integer> unexpected = new HashSet<>(found);
+            unexpected.removeAll(expected);
+            if (unexpected.size() > 0) {
+                System.out.println("Unexpected dependencies found:");
+                unexpected.forEach(i -> System.out.println("    Dependency " + i));
+            }
+
+            if (missing.size() > 0 || unexpected.size() > 0)
+                throw new AssertionError("Missing and/or unexpected dependencies found.");
         }
-
-        if (missing.size() > 0 || unexpected.size() > 0)
-            throw new AssertionError("Missing and/or unexpected dependencies found.");
     }
 
     private static PackageSymbol findPkgSymbolWithName(Set<PackageSymbol> syms, String name) {
--- a/make/CompileJavaModules.gmk	Wed Jul 05 20:05:31 2017 +0200
+++ b/make/CompileJavaModules.gmk	Wed Jul 05 20:06:12 2017 +0200
@@ -42,7 +42,7 @@
 
 ################################################################################
 
-java.base_COPY := .icu .dat .spp content-types.properties
+java.base_COPY := .icu .dat .spp content-types.properties hijrah-config-islamic-umalqura.properties
 java.base_CLEAN := intrinsic.properties
 
 java.base_EXCLUDES += java/lang/doc-files
--- a/nashorn/.hgtags	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/.hgtags	Wed Jul 05 20:06:12 2017 +0200
@@ -270,3 +270,4 @@
 4ece2dad8c37f520f1ccc1cf84870f362c8eb9d6 jdk9-b34
 63b8da4c958c3bbadfff082c547983f5daa50c0f jdk9-b35
 10fe62bc188476abb025e55f55128cbfecf24584 jdk9-b36
+dd7bbdf81a537106cfa9227d1a9a57849cb26b4d jdk9-b37
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SpillObjectCreator.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SpillObjectCreator.java	Wed Jul 05 20:06:12 2017 +0200
@@ -88,7 +88,7 @@
                     final Property property = propertyMap.findProperty(key);
                     if (property != null) {
                         // normal property key
-                        property.setCurrentType(JSType.unboxedFieldType(constantValue));
+                        property.setType(JSType.unboxedFieldType(constantValue));
                         final int slot = property.getSlot();
                         if (!OBJECT_FIELDS_ONLY && constantValue instanceof Number) {
                             jpresetValues[slot] = ObjectClassGenerator.pack((Number)constantValue);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/TypeEvaluator.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/TypeEvaluator.java	Wed Jul 05 20:06:12 2017 +0200
@@ -117,7 +117,7 @@
         }
 
         final Property property      = find.getProperty();
-        final Class<?> propertyClass = property.getCurrentType();
+        final Class<?> propertyClass = property.getType();
         if (propertyClass == null) {
             // propertyClass == null means its value is Undefined. It is probably not initialized yet, so we won't make
             // a type assumption yet.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeObject.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeObject.java	Wed Jul 05 20:06:12 2017 +0200
@@ -672,7 +672,7 @@
             for (final Property prop : properties) {
                 if (prop.isEnumerable()) {
                     final Object value = sourceObj.get(prop.getKey());
-                    prop.setCurrentType(Object.class);
+                    prop.setType(Object.class);
                     prop.setValue(sourceObj, sourceObj, value, false);
                     propList.add(prop);
                 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/AccessorProperty.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/AccessorProperty.java	Wed Jul 05 20:06:12 2017 +0200
@@ -145,13 +145,6 @@
     transient MethodHandle objectSetter;
 
     /**
-     * Current type of this object, in object only mode, this is an Object.class. In dual-fields mode
-     * null means undefined, and primitive types are allowed. The reason a special type is used for
-     * undefined, is that are no bits left to represent it in primitive types
-     */
-    private Class<?> currentType;
-
-    /**
      * Delegate constructor for bound properties. This is used for properties created by
      * {@link ScriptRuntime#mergeScope} and the Nashorn {@code Object.bindProperties} method.
      * The former is used to add a script's defined globals to the current global scope while
@@ -171,7 +164,7 @@
         this.objectSetter    = bindTo(property.objectSetter, delegate);
         property.GETTER_CACHE = new MethodHandle[NOOF_TYPES];
         // Properties created this way are bound to a delegate
-        setCurrentType(property.getCurrentType());
+        setType(property.getType());
     }
 
     /**
@@ -248,7 +241,7 @@
         objectGetter  = getter.type() != Lookup.GET_OBJECT_TYPE ? MH.asType(getter, Lookup.GET_OBJECT_TYPE) : getter;
         objectSetter  = setter != null && setter.type() != Lookup.SET_OBJECT_TYPE ? MH.asType(setter, Lookup.SET_OBJECT_TYPE) : setter;
 
-        setCurrentType(OBJECT_FIELDS_ONLY ? Object.class : getterType);
+        setType(OBJECT_FIELDS_ONLY ? Object.class : getterType);
     }
 
     /**
@@ -317,7 +310,7 @@
      */
     public AccessorProperty(final String key, final int flags, final Class<?> structure, final int slot, final Class<?> initialType) {
         this(key, flags, structure, slot);
-        setCurrentType(OBJECT_FIELDS_ONLY ? Object.class : initialType);
+        setType(OBJECT_FIELDS_ONLY ? Object.class : initialType);
     }
 
     /**
@@ -330,13 +323,13 @@
     protected AccessorProperty(final AccessorProperty property, final Class<?> newType) {
         super(property, property.getFlags());
 
-        this.GETTER_CACHE    = newType != property.getCurrentType() ? new MethodHandle[NOOF_TYPES] : property.GETTER_CACHE;
+        this.GETTER_CACHE    = newType != property.getLocalType() ? new MethodHandle[NOOF_TYPES] : property.GETTER_CACHE;
         this.primitiveGetter = property.primitiveGetter;
         this.primitiveSetter = property.primitiveSetter;
         this.objectGetter    = property.objectGetter;
         this.objectSetter    = property.objectSetter;
 
-        setCurrentType(newType);
+        setType(newType);
     }
 
     /**
@@ -345,7 +338,7 @@
      * @param property  source property
      */
     protected AccessorProperty(final AccessorProperty property) {
-        this(property, property.getCurrentType());
+        this(property, property.getLocalType());
     }
 
     /**
@@ -354,7 +347,7 @@
      * @param initialValue initial value
      */
     protected final void setInitialValue(final ScriptObject owner, final Object initialValue) {
-        setCurrentType(JSType.unboxedFieldType(initialValue));
+        setType(JSType.unboxedFieldType(initialValue));
         if (initialValue instanceof Integer) {
             invokeSetter(owner, ((Integer)initialValue).intValue());
         } else if (initialValue instanceof Long) {
@@ -370,7 +363,7 @@
      * Initialize the type of a property
      */
     protected final void initializeType() {
-        setCurrentType(OBJECT_FIELDS_ONLY ? Object.class : null);
+        setType(OBJECT_FIELDS_ONLY ? Object.class : null);
     }
 
     private void readObject(final ObjectInputStream s) throws IOException, ClassNotFoundException {
@@ -557,12 +550,12 @@
         } else {
             getter = debug(
                 createGetter(
-                    getCurrentType(),
+                    getLocalType(),
                     type,
                     primitiveGetter,
                     objectGetter,
                     INVALID_PROGRAM_POINT),
-                getCurrentType(),
+                getLocalType(),
                 type,
                 "get");
             getterCache[i] = getter;
@@ -582,18 +575,18 @@
 
         return debug(
             createGetter(
-                getCurrentType(),
+                getLocalType(),
                 type,
                 primitiveGetter,
                 objectGetter,
                 programPoint),
-            getCurrentType(),
+            getLocalType(),
             type,
             "get");
     }
 
     private MethodHandle getOptimisticPrimitiveGetter(final Class<?> type, final int programPoint) {
-        final MethodHandle g = getGetter(getCurrentType());
+        final MethodHandle g = getGetter(getLocalType());
         return MH.asType(OptimisticReturnFilters.filterOptimisticReturnValue(g, type, programPoint), g.type().changeReturnType(type));
     }
 
@@ -631,7 +624,7 @@
     }
 
     private MethodHandle generateSetter(final Class<?> forType, final Class<?> type) {
-        return debug(createSetter(forType, type, primitiveSetter, objectSetter), getCurrentType(), type, "set");
+        return debug(createSetter(forType, type, primitiveSetter, objectSetter), getLocalType(), type, "set");
     }
 
     /**
@@ -639,7 +632,7 @@
      * @return true if undefined
      */
     protected final boolean isUndefined() {
-        return getCurrentType() == null;
+        return getLocalType() == null;
     }
 
     @Override
@@ -647,7 +640,7 @@
         checkUndeclared();
 
         final int typeIndex        = getAccessorTypeIndex(type);
-        final int currentTypeIndex = getAccessorTypeIndex(getCurrentType());
+        final int currentTypeIndex = getAccessorTypeIndex(getLocalType());
 
         //if we are asking for an object setter, but are still a primitive type, we might try to box it
         MethodHandle mh;
@@ -656,13 +649,13 @@
             final PropertyMap  newMap      = getWiderMap(currentMap, newProperty);
 
             final MethodHandle widerSetter = newProperty.getSetter(type, newMap);
-            final Class<?>     ct = getCurrentType();
+            final Class<?>     ct = getLocalType();
             mh = MH.filterArguments(widerSetter, 0, MH.insertArguments(debugReplace(ct, type, currentMap, newMap) , 1, newMap));
             if (ct != null && ct.isPrimitive() && !type.isPrimitive()) {
                  mh = ObjectClassGenerator.createGuardBoxedPrimitiveSetter(ct, generateSetter(ct, ct), mh);
             }
         } else {
-            final Class<?> forType = isUndefined() ? type : getCurrentType();
+            final Class<?> forType = isUndefined() ? type : getLocalType();
             mh = generateSetter(!forType.isPrimitive() ? Object.class : forType, type);
         }
 
@@ -681,24 +674,13 @@
             return false;
         }
         // Return true for currently undefined even if non-writable/configurable to allow initialization of ES6 CONST.
-        return getCurrentType() == null || (getCurrentType() != Object.class && (isConfigurable() || isWritable()));
+        return getLocalType() == null || (getLocalType() != Object.class && (isConfigurable() || isWritable()));
     }
 
     private boolean needsInvalidator(final int typeIndex, final int currentTypeIndex) {
         return canChangeType() && typeIndex > currentTypeIndex;
     }
 
-    @Override
-    public final void setCurrentType(final Class<?> currentType) {
-        assert currentType != boolean.class : "no boolean storage support yet - fix this";
-        this.currentType = currentType == null ? null : currentType.isPrimitive() ? currentType : Object.class;
-    }
-
-    @Override
-    public Class<?> getCurrentType() {
-        return currentType;
-    }
-
     private MethodHandle debug(final MethodHandle mh, final Class<?> forType, final Class<?> type, final String tag) {
         if (!Context.DEBUG || !Global.hasInstance()) {
             return mh;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FindProperty.java	Wed Jul 05 20:06:12 2017 +0200
@@ -84,13 +84,18 @@
      * @return method handle for the getter
      */
     public MethodHandle getGetter(final Class<?> type, final int programPoint, final LinkRequest request) {
-        final MethodHandle getter;
+        MethodHandle getter;
         if (isValid(programPoint)) {
             getter = property.getOptimisticGetter(type, programPoint);
         } else {
             getter = property.getGetter(type);
         }
         if (property instanceof UserAccessorProperty) {
+            getter = MH.insertArguments(getter, 1, UserAccessorProperty.getINVOKE_UA_GETTER(type, programPoint));
+            if (isValid(programPoint) && type.isPrimitive()) {
+                getter = MH.insertArguments(getter, 1, programPoint);
+            }
+            property.setType(type);
             return insertAccessorsGetter((UserAccessorProperty) property, request, getter);
         }
         return getter;
@@ -111,7 +116,8 @@
     public MethodHandle getSetter(final Class<?> type, final boolean strict, final LinkRequest request) {
         MethodHandle setter = property.getSetter(type, getOwner().getMap());
         if (property instanceof UserAccessorProperty) {
-            setter =  MH.insertArguments(setter, 1, strict ? property.getKey() : null);
+            setter =  MH.insertArguments(setter, 1, UserAccessorProperty.getINVOKE_UA_SETTER(type), strict ? property.getKey() : null);
+            property.setType(type);
             return insertAccessorsGetter((UserAccessorProperty) property, request, setter);
         }
 
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Property.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Property.java	Wed Jul 05 20:06:12 2017 +0200
@@ -102,6 +102,13 @@
     /** Property field number or spill slot. */
     private final int slot;
 
+    /**
+     * Current type of this object, in object only mode, this is an Object.class. In dual-fields mode
+     * null means undefined, and primitive types are allowed. The reason a special type is used for
+     * undefined, is that are no bits left to represent it in primitive types
+     */
+    private Class<?> type;
+
     /** SwitchPoint that is invalidated when property is changed, optional */
     protected transient SwitchPoint builtinSwitchPoint;
 
@@ -536,7 +543,7 @@
      * <p>
      * see {@link ObjectClassGenerator#createSetter(Class, Class, MethodHandle, MethodHandle)}
      * if you are interested in the internal details of this. Note that if you
-     * are running in default mode, with {@code -Dnashorn.fields.dual=true}, disabled, the setters
+     * are running with {@code -Dnashorn.fields.objects=true}, the setters
      * will currently never change, as all properties are represented as Object field,
      * the Object fields are Initialized to {@code ScriptRuntime.UNDEFINED} and primitives are
      * boxed/unboxed upon every access, which is not necessarily optimal
@@ -569,7 +576,7 @@
 
     @Override
     public int hashCode() {
-        final Class<?> type = getCurrentType();
+        final Class<?> type = getLocalType();
         return Objects.hashCode(this.key) ^ flags ^ getSlot() ^ (type == null ? 0 : type.hashCode());
     }
 
@@ -586,7 +593,7 @@
         final Property otherProperty = (Property)other;
 
         return equalsWithoutType(otherProperty) &&
-               getCurrentType() == otherProperty.getCurrentType();
+                getLocalType() == otherProperty.getLocalType();
     }
 
     boolean equalsWithoutType(final Property otherProperty) {
@@ -615,7 +622,7 @@
      */
     public final String toStringShort() {
         final StringBuilder sb   = new StringBuilder();
-        final Class<?>      type = getCurrentType();
+        final Class<?>      type = getLocalType();
         sb.append(getKey()).append(" (").append(type(type)).append(')');
         return sb.toString();
     }
@@ -632,7 +639,7 @@
     @Override
     public String toString() {
         final StringBuilder sb   = new StringBuilder();
-        final Class<?>      type = getCurrentType();
+        final Class<?>      type = getLocalType();
 
         sb.append(indent(getKey(), 20)).
             append(" id=").
@@ -656,20 +663,40 @@
     }
 
     /**
-     * Get the current type of this field. If you are not running with dual fields enabled,
+     * Get the current type of this property. If you are running with object fields enabled,
      * this will always be Object.class. See the value representation explanation in
      * {@link Property#getSetter(Class, PropertyMap)} and {@link ObjectClassGenerator}
      * for more information.
      *
+     * <p>Note that for user accessor properties, this returns the type of the last observed
+     * value passed to or returned by a user accessor. Use {@link #getLocalType()} to always get
+     * the type of the actual value stored in the property slot.</p>
+     *
      * @return current type of property, null means undefined
      */
-    public abstract Class<?> getCurrentType();
+    public final Class<?> getType() {
+        return type;
+    }
 
     /**
-     * Reset the current type of this property
-     * @param currentType new current type
+     * Set the type of this property.
+     * @param type new type
      */
-    public abstract void setCurrentType(final Class<?> currentType);
+    public final void setType(final Class<?> type) {
+        assert type != boolean.class : "no boolean storage support yet - fix this";
+        this.type = type == null ? null : type.isPrimitive() ? type : Object.class;
+    }
+
+    /**
+     * Get the type of the value in the local property slot. This returns the same as
+     * {@link #getType()} for normal properties, but always returns {@code Object.class}
+     * for {@link UserAccessorProperty}s as their local type is a pair of accessor references.
+     *
+     * @return the local property type
+     */
+    protected Class<?> getLocalType() {
+        return getType();
+    }
 
     /**
      * Check whether this Property can ever change its type. The default is false, and if
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java	Wed Jul 05 20:06:12 2017 +0200
@@ -512,7 +512,7 @@
         assert sameType ||
                 oldProperty instanceof AccessorProperty &&
                 newProperty instanceof UserAccessorProperty :
-            "arbitrary replaceProperty attempted " + sameType + " oldProperty=" + oldProperty.getClass() + " newProperty=" + newProperty.getClass() + " [" + oldProperty.getCurrentType() + " => " + newProperty.getCurrentType() + "]";
+            "arbitrary replaceProperty attempted " + sameType + " oldProperty=" + oldProperty.getClass() + " newProperty=" + newProperty.getClass() + " [" + oldProperty.getLocalType() + " => " + newProperty.getLocalType() + "]";
 
         newMap.flags = flags;
 
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java	Wed Jul 05 20:06:12 2017 +0200
@@ -969,7 +969,7 @@
             final UserAccessorProperty uc = (UserAccessorProperty)oldProperty;
             final int slot = uc.getSlot();
 
-            assert uc.getCurrentType() == Object.class;
+            assert uc.getLocalType() == Object.class;
             if (slot >= spillLength) {
                 uc.setAccessors(this, getMap(), new UserAccessorProperty.Accessors(getter, setter));
             } else {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/SpillProperty.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/SpillProperty.java	Wed Jul 05 20:06:12 2017 +0200
@@ -161,12 +161,12 @@
      */
     public SpillProperty(final String key, final int flags, final int slot) {
         super(key, flags, slot, primitiveGetter(slot), primitiveSetter(slot), objectGetter(slot), objectSetter(slot));
-        assert !OBJECT_FIELDS_ONLY || getCurrentType() == Object.class;
+        assert !OBJECT_FIELDS_ONLY || getLocalType() == Object.class;
     }
 
     SpillProperty(final String key, final int flags, final int slot, final Class<?> initialType) {
         this(key, flags, slot);
-        setCurrentType(OBJECT_FIELDS_ONLY ? Object.class : initialType);
+        setType(OBJECT_FIELDS_ONLY ? Object.class : initialType);
     }
 
     SpillProperty(final String key, final int flags, final int slot, final ScriptObject owner, final Object initialValue) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/UserAccessorProperty.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/UserAccessorProperty.java	Wed Jul 05 20:06:12 2017 +0200
@@ -27,16 +27,16 @@
 
 import static jdk.nashorn.internal.lookup.Lookup.MH;
 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
-import static jdk.nashorn.internal.runtime.JSType.CONVERT_OBJECT_OPTIMISTIC;
-import static jdk.nashorn.internal.runtime.JSType.getAccessorTypeIndex;
 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
+import static jdk.nashorn.internal.runtime.UnwarrantedOptimismException.INVALID_PROGRAM_POINT;
+import static jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor.CALLSITE_PROGRAM_POINT_SHIFT;
 
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodType;
-import java.util.concurrent.Callable;
 import jdk.nashorn.internal.lookup.Lookup;
 import jdk.nashorn.internal.runtime.linker.Bootstrap;
+import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor;
 
 /**
  * Property with user defined getters/setters. Actual getter and setter
@@ -69,38 +69,29 @@
     private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
 
     /** Getter method handle */
-    private final static MethodHandle INVOKE_GETTER_ACCESSOR = findOwnMH_S("invokeGetterAccessor", Object.class, Accessors.class, Object.class);
+    private final static MethodHandle INVOKE_OBJECT_GETTER = findOwnMH_S("invokeObjectGetter", Object.class, Accessors.class, MethodHandle.class, Object.class);
+    private final static MethodHandle INVOKE_INT_GETTER  = findOwnMH_S("invokeIntGetter", int.class, Accessors.class, MethodHandle.class, int.class, Object.class);
+    private final static MethodHandle INVOKE_LONG_GETTER  = findOwnMH_S("invokeLongGetter", long.class, Accessors.class, MethodHandle.class, int.class, Object.class);
+    private final static MethodHandle INVOKE_NUMBER_GETTER  = findOwnMH_S("invokeNumberGetter", double.class, Accessors.class, MethodHandle.class, int.class, Object.class);
 
     /** Setter method handle */
-    private final static MethodHandle INVOKE_SETTER_ACCESSOR = findOwnMH_S("invokeSetterAccessor", void.class, Accessors.class, String.class, Object.class, Object.class);
+    private final static MethodHandle INVOKE_OBJECT_SETTER = findOwnMH_S("invokeObjectSetter", void.class, Accessors.class, MethodHandle.class, String.class, Object.class, Object.class);
+    private final static MethodHandle INVOKE_INT_SETTER = findOwnMH_S("invokeIntSetter", void.class, Accessors.class, MethodHandle.class, String.class, Object.class, int.class);
+    private final static MethodHandle INVOKE_LONG_SETTER = findOwnMH_S("invokeLongSetter", void.class, Accessors.class, MethodHandle.class, String.class, Object.class, long.class);
+    private final static MethodHandle INVOKE_NUMBER_SETTER = findOwnMH_S("invokeNumberSetter", void.class, Accessors.class, MethodHandle.class, String.class, Object.class, double.class);
 
-    /** Dynamic invoker for getter */
-    private static final Object GETTER_INVOKER_KEY = new Object();
-
-    private static MethodHandle getINVOKE_UA_GETTER() {
 
-        return Context.getGlobal().getDynamicInvoker(GETTER_INVOKER_KEY,
-                new Callable<MethodHandle>() {
-                    @Override
-                    public MethodHandle call() {
-                        return Bootstrap.createDynamicInvoker("dyn:call", Object.class,
-                            Object.class, Object.class);
-                    }
-                });
+    static MethodHandle getINVOKE_UA_GETTER(final Class<?> returnType, final int programPoint) {
+        if (UnwarrantedOptimismException.isValid(programPoint)) {
+            final int flags = NashornCallSiteDescriptor.CALLSITE_OPTIMISTIC | programPoint << CALLSITE_PROGRAM_POINT_SHIFT;
+            return Bootstrap.createDynamicInvoker("dyn:call", flags, returnType, Object.class, Object.class);
+        } else {
+            return Bootstrap.createDynamicInvoker("dyn:call", Object.class, Object.class, Object.class);
+        }
     }
 
-    /** Dynamic invoker for setter */
-    private static Object SETTER_INVOKER_KEY = new Object();
-
-    private static MethodHandle getINVOKE_UA_SETTER() {
-        return Context.getGlobal().getDynamicInvoker(SETTER_INVOKER_KEY,
-                new Callable<MethodHandle>() {
-                    @Override
-                    public MethodHandle call() {
-                        return Bootstrap.createDynamicInvoker("dyn:call", void.class,
-                            Object.class, Object.class, Object.class);
-                    }
-                });
+    static MethodHandle getINVOKE_UA_SETTER(final Class<?> valueType) {
+        return Bootstrap.createDynamicInvoker("dyn:call", void.class, Object.class, Object.class, valueType);
     }
 
     /**
@@ -158,7 +149,7 @@
     }
 
     @Override
-    public Class<?> getCurrentType() {
+    protected Class<?> getLocalType() {
         return Object.class;
     }
 
@@ -189,7 +180,13 @@
 
     @Override
     public Object getObjectValue(final ScriptObject self, final ScriptObject owner) {
-        return invokeGetterAccessor(getAccessors((owner != null) ? owner : self), self);
+        try {
+            return invokeObjectGetter(getAccessors((owner != null) ? owner : self), getINVOKE_UA_GETTER(Object.class, INVALID_PROGRAM_POINT), self);
+        } catch (final Error | RuntimeException t) {
+            throw t;
+        } catch (final Throwable t) {
+            throw new RuntimeException(t);
+        }
     }
 
     @Override
@@ -209,41 +206,33 @@
 
     @Override
     public void setValue(final ScriptObject self, final ScriptObject owner, final Object value, final boolean strict) {
-        invokeSetterAccessor(getAccessors((owner != null) ? owner : self), strict ? getKey() : null, self, value);
+        try {
+            invokeObjectSetter(getAccessors((owner != null) ? owner : self), getINVOKE_UA_SETTER(Object.class), strict ? getKey() : null, self, value);
+        } catch (final Error | RuntimeException t) {
+            throw t;
+        } catch (final Throwable t) {
+            throw new RuntimeException(t);
+        }
     }
 
     @Override
     public MethodHandle getGetter(final Class<?> type) {
         //this returns a getter on the format (Accessors, Object receiver)
-        return Lookup.filterReturnType(INVOKE_GETTER_ACCESSOR, type);
+        return Lookup.filterReturnType(INVOKE_OBJECT_GETTER, type);
     }
 
     @Override
     public MethodHandle getOptimisticGetter(final Class<?> type, final int programPoint) {
-        //fortype is always object, but in the optimistic world we have to throw
-        //unwarranted optimism exception for narrower types. We can improve this
-        //by checking for boxed types and unboxing them, but it is doubtful that
-        //this gives us any performance, as UserAccessorProperties are typically not
-        //primitives. Are there? TODO: investigate later. For now we just throw an
-        //exception for narrower types than object
-
-        if (type.isPrimitive()) {
-            final MethodHandle getter = getGetter(Object.class);
-            final MethodHandle mh =
-                    MH.asType(
-                            MH.filterReturnValue(
-                                    getter,
-                                    MH.insertArguments(
-                                            CONVERT_OBJECT_OPTIMISTIC.get(getAccessorTypeIndex(type)),
-                                            1,
-                                            programPoint)),
-                                    getter.type().changeReturnType(type));
-
-            return mh;
+        if (type == int.class) {
+            return INVOKE_INT_GETTER;
+        } else if (type == long.class) {
+            return INVOKE_LONG_GETTER;
+        } else if (type == double.class) {
+            return INVOKE_NUMBER_GETTER;
+        } else {
+            assert type == Object.class;
+            return INVOKE_OBJECT_GETTER;
         }
-
-        assert type == Object.class;
-        return getGetter(type);
     }
 
     @Override
@@ -259,7 +248,16 @@
 
     @Override
     public MethodHandle getSetter(final Class<?> type, final PropertyMap currentMap) {
-        return INVOKE_SETTER_ACCESSOR;
+        if (type == int.class) {
+            return INVOKE_INT_SETTER;
+        } else if (type == long.class) {
+            return INVOKE_LONG_SETTER;
+        } else if (type == double.class) {
+            return INVOKE_NUMBER_SETTER;
+        } else {
+            assert type == Object.class;
+            return INVOKE_OBJECT_SETTER;
+        }
     }
 
     @Override
@@ -282,31 +280,81 @@
     // getter/setter may be inherited. If so, proto is bound during lookup. In either
     // inherited or self case, slot is also bound during lookup. Actual ScriptFunction
     // to be called is retrieved everytime and applied.
-    private static Object invokeGetterAccessor(final Accessors gs, final Object self) {
+    @SuppressWarnings("unused")
+    private static Object invokeObjectGetter(final Accessors gs, final MethodHandle invoker, final Object self) throws Throwable {
         final Object func = gs.getter;
         if (func instanceof ScriptFunction) {
-            try {
-                return getINVOKE_UA_GETTER().invokeExact(func, self);
-            } catch (final Error | RuntimeException t) {
-                throw t;
-            } catch (final Throwable t) {
-                throw new RuntimeException(t);
-            }
+            return invoker.invokeExact(func, self);
         }
 
         return UNDEFINED;
     }
 
-    private static void invokeSetterAccessor(final Accessors gs, final String name, final Object self, final Object value) {
+    @SuppressWarnings("unused")
+    private static int invokeIntGetter(final Accessors gs, final MethodHandle invoker, final int programPoint, final Object self) throws Throwable {
+        final Object func = gs.getter;
+        if (func instanceof ScriptFunction) {
+            return (int) invoker.invokeExact(func, self);
+        }
+
+        throw new UnwarrantedOptimismException(UNDEFINED, programPoint);
+    }
+
+    @SuppressWarnings("unused")
+    private static long invokeLongGetter(final Accessors gs, final MethodHandle invoker, final int programPoint, final Object self) throws Throwable {
+        final Object func = gs.getter;
+        if (func instanceof ScriptFunction) {
+            return (long) invoker.invokeExact(func, self);
+        }
+
+        throw new UnwarrantedOptimismException(UNDEFINED, programPoint);
+    }
+
+    @SuppressWarnings("unused")
+    private static double invokeNumberGetter(final Accessors gs, final MethodHandle invoker, final int programPoint, final Object self) throws Throwable {
+        final Object func = gs.getter;
+        if (func instanceof ScriptFunction) {
+            return (double) invoker.invokeExact(func, self);
+        }
+
+        throw new UnwarrantedOptimismException(UNDEFINED, programPoint);
+    }
+
+    @SuppressWarnings("unused")
+    private static void invokeObjectSetter(final Accessors gs, final MethodHandle invoker, final String name, final Object self, final Object value) throws Throwable {
         final Object func = gs.setter;
         if (func instanceof ScriptFunction) {
-            try {
-                getINVOKE_UA_SETTER().invokeExact(func, self, value);
-            } catch (final Error | RuntimeException t) {
-                throw t;
-            } catch (final Throwable t) {
-                throw new RuntimeException(t);
-            }
+            invoker.invokeExact(func, self, value);
+        } else if (name != null) {
+            throw typeError("property.has.no.setter", name, ScriptRuntime.safeToString(self));
+        }
+    }
+
+    @SuppressWarnings("unused")
+    private static void invokeIntSetter(final Accessors gs, final MethodHandle invoker, final String name, final Object self, final int value) throws Throwable {
+        final Object func = gs.setter;
+        if (func instanceof ScriptFunction) {
+            invoker.invokeExact(func, self, value);
+        } else if (name != null) {
+            throw typeError("property.has.no.setter", name, ScriptRuntime.safeToString(self));
+        }
+    }
+
+    @SuppressWarnings("unused")
+    private static void invokeLongSetter(final Accessors gs, final MethodHandle invoker, final String name, final Object self, final long value) throws Throwable {
+        final Object func = gs.setter;
+        if (func instanceof ScriptFunction) {
+            invoker.invokeExact(func, self, value);
+        } else if (name != null) {
+            throw typeError("property.has.no.setter", name, ScriptRuntime.safeToString(self));
+        }
+    }
+
+    @SuppressWarnings("unused")
+    private static void invokeNumberSetter(final Accessors gs, final MethodHandle invoker, final String name, final Object self, final double value) throws Throwable {
+        final Object func = gs.setter;
+        if (func instanceof ScriptFunction) {
+            invoker.invokeExact(func, self, value);
         } else if (name != null) {
             throw typeError("property.has.no.setter", name, ScriptRuntime.safeToString(self));
         }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java	Wed Jul 05 20:06:12 2017 +0200
@@ -337,6 +337,20 @@
 
     /**
      * Returns a dynamic invoker for a specified dynamic operation using the public lookup. Similar to
+     * {@link #createDynamicInvoker(String, Class, Class...)} but with an additional parameter to
+     * set the call site flags of the dynamic invoker.
+     * @param opDesc Dynalink dynamic operation descriptor.
+     * @param flags the call site flags for the operation
+     * @param rtype the return type for the operation
+     * @param ptypes the parameter types for the operation
+     * @return MethodHandle for invoking the operation.
+     */
+    public static MethodHandle createDynamicInvoker(final String opDesc, final int flags, final Class<?> rtype, final Class<?>... ptypes) {
+        return bootstrap(MethodHandles.publicLookup(), opDesc, MethodType.methodType(rtype, ptypes), flags).dynamicInvoker();
+    }
+
+    /**
+     * Returns a dynamic invoker for a specified dynamic operation using the public lookup. Similar to
      * {@link #createDynamicInvoker(String, Class, Class...)} but with return and parameter types composed into a
      * method type in the signature. See the discussion of that method for details.
      * @param opDesc Dynalink dynamic operation descriptor.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/examples/getter-setter-micro.js	Wed Jul 05 20:06:12 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+/*
+ * A micro-benchmark for getters and setters with primitive values,
+ * alternating between ints and doubles. Introduction of primitive
+ * and optimistic user accessors in JDK-8062401 make this faster by
+ * 10x or more by allowing inlining and other optimizations to take place.
+ */
+
+var x = {
+    get m() {
+        return this._m;
+    },
+    set m(v) {
+        this._m = v;
+    },
+    get n() {
+        return this._n;
+    },
+    set n(v) {
+        this._n = v;
+    }
+};
+
+
+function bench(v1, v2, result) {
+    var start = Date.now();
+    x.n = v1;
+    for (var i = 0; i < 1e8; i++) {
+        x.m = v2;
+        if (x.m + x.n !== result) {
+            throw "wrong result";
+        }
+    }
+    print("done in", Date.now() - start, "millis");
+}
+
+for (var i = 0; i < 10; i++) {
+    bench(i, 4, 4 + i);
+}
+
+for (var i = 0; i < 10; i++) {
+    bench(i, 4.5, 4.5 + i);
+}
+
+for (var i = 0; i < 10; i++) {
+    bench(i, 5, 5 + i);
+}
+
+for (var i = 0; i < 10; i++) {
+    bench(i, 5.5, 5.5 + i);
+}
--- a/nashorn/test/script/basic/JDK-8062024.js	Wed Jul 05 20:05:31 2017 +0200
+++ b/nashorn/test/script/basic/JDK-8062024.js	Wed Jul 05 20:06:12 2017 +0200
@@ -25,6 +25,7 @@
  * JDK-8062024: Issue with date.setFullYear when time other than midnight
  *
  * @test
+ * @option -timezone=Asia/Calcutta
  * @run
  */