Merge
authorduke
Wed, 05 Jul 2017 20:37:47 +0200
changeset 31091 674722d6d0ef
parent 31090 20f60dc00878 (current diff)
parent 31087 59d2a5d94dd6 (diff)
child 31102 0c07e0fc8c43
Merge
jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java
jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java
jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationException.java
jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationProvider.java
jdk/test/sun/tools/jmap/heapconfig/LingeredApp.java
jdk/test/sun/tools/jmap/heapconfig/LingeredAppTest.java
--- a/.hgtags-top-repo	Thu Jun 11 20:19:18 2015 -0700
+++ b/.hgtags-top-repo	Wed Jul 05 20:37:47 2017 +0200
@@ -310,3 +310,4 @@
 7c31f9d7b932f7924f1258d52885b1c7c3e078c2 jdk9-b65
 dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66
 f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67
+70e4272790b6199e9ca89df2758ff9cb58ec4125 jdk9-b68
--- a/hotspot/.hgtags	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/.hgtags	Wed Jul 05 20:37:47 2017 +0200
@@ -470,3 +470,4 @@
 e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65
 197e94e0dacddd16816f101d24fc0442ab518326 jdk9-b66
 d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67
+11af3990d56c97b40318bc1f20608e86f051a3f7 jdk9-b68
--- a/hotspot/make/linux/makefiles/dtrace.make	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/make/linux/makefiles/dtrace.make	Wed Jul 05 20:37:47 2017 +0200
@@ -31,8 +31,8 @@
 REASON = "This JDK does not support SDT probes"
 else
 
-# We need a recent GCC for the default
-ifeq "$(shell expr \( $(CC_VER_MAJOR) \>= 4 \) \& \( $(CC_VER_MINOR) \>= 4 \) )" "0"
+# We need a recent GCC for the default (4.4 or later)
+ifeq "$(shell expr \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 4 \) \) \| \( $(CC_VER_MAJOR) \>= 5 \) )" "0"
 REASON = "gcc version is too old"
 else
 
--- a/hotspot/make/test/JtregNative.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/make/test/JtregNative.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -44,6 +44,7 @@
     $(HOTSPOT_TOPDIR)/test/native_sanity \
     $(HOTSPOT_TOPDIR)/test/runtime/jni/8025979 \
     $(HOTSPOT_TOPDIR)/test/runtime/jni/8033445 \
+    $(HOTSPOT_TOPDIR)/test/runtime/jni/ToStringInInterfaceTest \
     #
 
 BUILD_HOTSPOT_JTREG_OUTPUT_DIR := $(BUILD_OUTPUT)/support/test/hotspot/jtreg/native
--- a/hotspot/src/cpu/sparc/vm/sparc.ad	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad	Wed Jul 05 20:37:47 2017 +0200
@@ -3372,6 +3372,25 @@
   interface(CONST_INTER);
 %}
 
+// Integer Immediate: 0-bit
+operand immI0() %{
+  predicate(n->get_int() == 0);
+  match(ConI);
+  op_cost(0);
+
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+// Integer Immediate: 5-bit
+operand immI5() %{
+  predicate(Assembler::is_simm5(n->get_int()));
+  match(ConI);
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
 // Integer Immediate: 8-bit
 operand immI8() %{
   predicate(Assembler::is_simm8(n->get_int()));
@@ -3381,6 +3400,25 @@
   interface(CONST_INTER);
 %}
 
+// Integer Immediate: the value 10
+operand immI10() %{
+  predicate(n->get_int() == 10);
+  match(ConI);
+  op_cost(0);
+
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+// Integer Immediate: 11-bit
+operand immI11() %{
+  predicate(Assembler::is_simm11(n->get_int()));
+  match(ConI);
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
 // Integer Immediate: 13-bit
 operand immI13() %{
   predicate(Assembler::is_simm13(n->get_int()));
@@ -3410,84 +3448,6 @@
   interface(CONST_INTER);
 %}
 
-// Unsigned Integer Immediate: 12-bit (non-negative that fits in simm13)
-operand immU12() %{
-  predicate((0 <= n->get_int()) && Assembler::is_simm13(n->get_int()));
-  match(ConI);
-  op_cost(0);
-
-  format %{ %}
-  interface(CONST_INTER);
-%}
-
-// Integer Immediate: 6-bit
-operand immU6() %{
-  predicate(n->get_int() >= 0 && n->get_int() <= 63);
-  match(ConI);
-  op_cost(0);
-  format %{ %}
-  interface(CONST_INTER);
-%}
-
-// Integer Immediate: 11-bit
-operand immI11() %{
-  predicate(Assembler::is_simm11(n->get_int()));
-  match(ConI);
-  op_cost(0);
-  format %{ %}
-  interface(CONST_INTER);
-%}
-
-// Integer Immediate: 5-bit
-operand immI5() %{
-  predicate(Assembler::is_simm5(n->get_int()));
-  match(ConI);
-  op_cost(0);
-  format %{ %}
-  interface(CONST_INTER);
-%}
-
-// Int Immediate non-negative
-operand immU31()
-%{
-  predicate(n->get_int() >= 0);
-  match(ConI);
-
-  op_cost(0);
-  format %{ %}
-  interface(CONST_INTER);
-%}
-
-// Integer Immediate: 0-bit
-operand immI0() %{
-  predicate(n->get_int() == 0);
-  match(ConI);
-  op_cost(0);
-
-  format %{ %}
-  interface(CONST_INTER);
-%}
-
-// Integer Immediate: the value 10
-operand immI10() %{
-  predicate(n->get_int() == 10);
-  match(ConI);
-  op_cost(0);
-
-  format %{ %}
-  interface(CONST_INTER);
-%}
-
-// Integer Immediate: the values 0-31
-operand immU5() %{
-  predicate(n->get_int() >= 0 && n->get_int() <= 31);
-  match(ConI);
-  op_cost(0);
-
-  format %{ %}
-  interface(CONST_INTER);
-%}
-
 // Integer Immediate: the values 1-31
 operand immI_1_31() %{
   predicate(n->get_int() >= 1 && n->get_int() <= 31);
@@ -3529,7 +3489,6 @@
   format %{ %}
   interface(CONST_INTER);
 %}
-
 // Integer Immediate: the value 255
 operand immI_255() %{
   predicate( n->get_int() == 255 );
@@ -3550,6 +3509,46 @@
   interface(CONST_INTER);
 %}
 
+// Integer Immediate: the values 0-31
+operand immU5() %{
+  predicate(n->get_int() >= 0 && n->get_int() <= 31);
+  match(ConI);
+  op_cost(0);
+
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+// Integer Immediate: 6-bit
+operand immU6() %{
+  predicate(n->get_int() >= 0 && n->get_int() <= 63);
+  match(ConI);
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+// Unsigned Integer Immediate: 12-bit (non-negative that fits in simm13)
+operand immU12() %{
+  predicate((0 <= n->get_int()) && Assembler::is_simm13(n->get_int()));
+  match(ConI);
+  op_cost(0);
+
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+// Integer Immediate non-negative
+operand immU31()
+%{
+  predicate(n->get_int() >= 0);
+  match(ConI);
+
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
 // Long Immediate: the value FF
 operand immL_FF() %{
   predicate( n->get_long() == 0xFFL );
@@ -5653,17 +5652,17 @@
   ins_pipe(iload_mem);
 %}
 
-// Load Unsigned Byte (8 bit UNsigned) with 8-bit mask into Long Register
-instruct loadUB2L_immI8(iRegL dst, memory mem, immI8 mask) %{
+// Load Unsigned Byte (8 bit UNsigned) with 32-bit mask into Long Register
+instruct loadUB2L_immI(iRegL dst, memory mem, immI mask) %{
   match(Set dst (ConvI2L (AndI (LoadUB mem) mask)));
   ins_cost(MEMORY_REF_COST + DEFAULT_COST);
 
   size(2*4);
-  format %{ "LDUB   $mem,$dst\t# ubyte & 8-bit mask -> long\n\t"
-            "AND    $dst,$mask,$dst" %}
+  format %{ "LDUB   $mem,$dst\t# ubyte & 32-bit mask -> long\n\t"
+            "AND    $dst,right_n_bits($mask, 8),$dst" %}
   ins_encode %{
     __ ldub($mem$$Address, $dst$$Register);
-    __ and3($dst$$Register, $mask$$constant, $dst$$Register);
+    __ and3($dst$$Register, $mask$$constant & right_n_bits(8), $dst$$Register);
   %}
   ins_pipe(iload_mem);
 %}
@@ -5776,20 +5775,20 @@
   ins_pipe(iload_mem);
 %}
 
-// Load Unsigned Short/Char (16bit UNsigned) with a 16-bit mask into a Long Register
-instruct loadUS2L_immI16(iRegL dst, memory mem, immI16 mask, iRegL tmp) %{
+// Load Unsigned Short/Char (16bit UNsigned) with a 32-bit mask into a Long Register
+instruct loadUS2L_immI(iRegL dst, memory mem, immI mask, iRegL tmp) %{
   match(Set dst (ConvI2L (AndI (LoadUS mem) mask)));
   effect(TEMP dst, TEMP tmp);
   ins_cost(MEMORY_REF_COST + 2*DEFAULT_COST);
 
-  format %{ "LDUH   $mem,$dst\t! ushort/char & 16-bit mask -> long\n\t"
-            "SET    $mask,$tmp\n\t"
+  format %{ "LDUH   $mem,$dst\t! ushort/char & 32-bit mask -> long\n\t"
+            "SET    right_n_bits($mask, 16),$tmp\n\t"
             "AND    $dst,$tmp,$dst" %}
   ins_encode %{
     Register Rdst = $dst$$Register;
     Register Rtmp = $tmp$$Register;
     __ lduh($mem$$Address, Rdst);
-    __ set($mask$$constant, Rtmp);
+    __ set($mask$$constant & right_n_bits(16), Rtmp);
     __ and3(Rdst, Rtmp, Rdst);
   %}
   ins_pipe(iload_mem);
--- a/hotspot/src/cpu/x86/vm/x86_32.ad	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad	Wed Jul 05 20:37:47 2017 +0200
@@ -5431,18 +5431,18 @@
 %}
 
 // Load Unsigned Byte (8 bit UNsigned) with mask into Long Register
-instruct loadUB2L_immI8(eRegL dst, memory mem, immI8 mask, eFlagsReg cr) %{
+instruct loadUB2L_immI(eRegL dst, memory mem, immI mask, eFlagsReg cr) %{
   match(Set dst (ConvI2L (AndI (LoadUB mem) mask)));
   effect(KILL cr);
 
-  format %{ "MOVZX8 $dst.lo,$mem\t# ubyte & 8-bit mask -> long\n\t"
+  format %{ "MOVZX8 $dst.lo,$mem\t# ubyte & 32-bit mask -> long\n\t"
             "XOR    $dst.hi,$dst.hi\n\t"
-            "AND    $dst.lo,$mask" %}
+            "AND    $dst.lo,right_n_bits($mask, 8)" %}
   ins_encode %{
     Register Rdst = $dst$$Register;
     __ movzbl(Rdst, $mem$$Address);
     __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
-    __ andl(Rdst, $mask$$constant);
+    __ andl(Rdst, $mask$$constant & right_n_bits(8));
   %}
   ins_pipe(ialu_reg_mem);
 %}
@@ -5550,19 +5550,19 @@
   ins_pipe(ialu_reg_mem);
 %}
 
-// Load Unsigned Short/Char (16 bit UNsigned) with a 16-bit mask into Long Register
-instruct loadUS2L_immI16(eRegL dst, memory mem, immI16 mask, eFlagsReg cr) %{
+// Load Unsigned Short/Char (16 bit UNsigned) with a 32-bit mask into Long Register
+instruct loadUS2L_immI(eRegL dst, memory mem, immI mask, eFlagsReg cr) %{
   match(Set dst (ConvI2L (AndI (LoadUS mem) mask)));
   effect(KILL cr);
 
-  format %{ "MOVZX  $dst.lo, $mem\t# ushort/char & 16-bit mask -> long\n\t"
+  format %{ "MOVZX  $dst.lo, $mem\t# ushort/char & 32-bit mask -> long\n\t"
             "XOR    $dst.hi,$dst.hi\n\t"
-            "AND    $dst.lo,$mask" %}
+            "AND    $dst.lo,right_n_bits($mask, 16)" %}
   ins_encode %{
     Register Rdst = $dst$$Register;
     __ movzwl(Rdst, $mem$$Address);
     __ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
-    __ andl(Rdst, $mask$$constant);
+    __ andl(Rdst, $mask$$constant & right_n_bits(16));
   %}
   ins_pipe(ialu_reg_mem);
 %}
--- a/hotspot/src/cpu/x86/vm/x86_64.ad	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad	Wed Jul 05 20:37:47 2017 +0200
@@ -4753,17 +4753,17 @@
   ins_pipe(ialu_reg_mem);
 %}
 
-// Load Unsigned Byte (8 bit UNsigned) with a 8-bit mask into Long Register
-instruct loadUB2L_immI8(rRegL dst, memory mem, immI8 mask, rFlagsReg cr) %{
+// Load Unsigned Byte (8 bit UNsigned) with 32-bit mask into Long Register
+instruct loadUB2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{
   match(Set dst (ConvI2L (AndI (LoadUB mem) mask)));
   effect(KILL cr);
 
-  format %{ "movzbq  $dst, $mem\t# ubyte & 8-bit mask -> long\n\t"
-            "andl    $dst, $mask" %}
+  format %{ "movzbq  $dst, $mem\t# ubyte & 32-bit mask -> long\n\t"
+            "andl    $dst, right_n_bits($mask, 8)" %}
   ins_encode %{
     Register Rdst = $dst$$Register;
     __ movzbq(Rdst, $mem$$Address);
-    __ andl(Rdst, $mask$$constant);
+    __ andl(Rdst, $mask$$constant & right_n_bits(8));
   %}
   ins_pipe(ialu_reg_mem);
 %}
@@ -4863,17 +4863,17 @@
   ins_pipe(ialu_reg_mem);
 %}
 
-// Load Unsigned Short/Char (16 bit UNsigned) with mask into Long Register
-instruct loadUS2L_immI16(rRegL dst, memory mem, immI16 mask, rFlagsReg cr) %{
+// Load Unsigned Short/Char (16 bit UNsigned) with 32-bit mask into Long Register
+instruct loadUS2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{
   match(Set dst (ConvI2L (AndI (LoadUS mem) mask)));
   effect(KILL cr);
 
-  format %{ "movzwq  $dst, $mem\t# ushort/char & 16-bit mask -> long\n\t"
-            "andl    $dst, $mask" %}
+  format %{ "movzwq  $dst, $mem\t# ushort/char & 32-bit mask -> long\n\t"
+            "andl    $dst, right_n_bits($mask, 16)" %}
   ins_encode %{
     Register Rdst = $dst$$Register;
     __ movzwq(Rdst, $mem$$Address);
-    __ andl(Rdst, $mask$$constant);
+    __ andl(Rdst, $mask$$constant & right_n_bits(16));
   %}
   ins_pipe(ialu_reg_mem);
 %}
--- a/hotspot/src/os/aix/vm/os_aix.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/aix/vm/os_aix.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1267,10 +1267,6 @@
 // Note: os::abort() might be called very early during initialization, or
 // called from signal handler. Before adding something to os::abort(), make
 // sure it is async-safe and can handle partially initialized VM.
-void os::abort(bool dump_core) {
-  abort(dump_core, NULL, NULL);
-}
-
 void os::abort(bool dump_core, void* siginfo, void* context) {
   os::shutdown();
   if (dump_core) {
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1131,10 +1131,6 @@
 // Note: os::abort() might be called very early during initialization, or
 // called from signal handler. Before adding something to os::abort(), make
 // sure it is async-safe and can handle partially initialized VM.
-void os::abort(bool dump_core) {
-  abort(dump_core, NULL, NULL);
-}
-
 void os::abort(bool dump_core, void* siginfo, void* context) {
   os::shutdown();
   if (dump_core) {
--- a/hotspot/src/os/linux/vm/os_linux.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/linux/vm/os_linux.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1478,10 +1478,6 @@
 // Note: os::abort() might be called very early during initialization, or
 // called from signal handler. Before adding something to os::abort(), make
 // sure it is async-safe and can handle partially initialized VM.
-void os::abort(bool dump_core) {
-  abort(dump_core, NULL, NULL);
-}
-
 void os::abort(bool dump_core, void* siginfo, void* context) {
   os::shutdown();
   if (dump_core) {
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1520,10 +1520,6 @@
 // Note: os::abort() might be called very early during initialization, or
 // called from signal handler. Before adding something to os::abort(), make
 // sure it is async-safe and can handle partially initialized VM.
-void os::abort(bool dump_core) {
-  abort(dump_core, NULL, NULL);
-}
-
 void os::abort(bool dump_core, void* siginfo, void* context) {
   os::shutdown();
   if (dump_core) {
--- a/hotspot/src/os/windows/vm/os_windows.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/windows/vm/os_windows.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -997,7 +997,16 @@
   if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) {
     jio_snprintf(buffer, buffsz, "CreateCoredumpOnCrash is disabled from command line");
     status = false;
-  } else {
+  }
+
+#ifndef ASSERT
+  if (!os::win32::is_windows_server() && FLAG_IS_DEFAULT(CreateCoredumpOnCrash)) {
+    jio_snprintf(buffer, buffsz, "Minidumps are not enabled by default on client versions of Windows");
+    status = false;
+  }
+#endif
+
+  if (status) {
     const char* cwd = get_current_directory(NULL, 0);
     int pid = current_process_id();
     if (cwd != NULL) {
@@ -1086,10 +1095,6 @@
   win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
 }
 
-void os::abort(bool dump_core) {
-  abort(dump_core, NULL, NULL);
-}
-
 // Die immediately, no exit hook, no abort hook, no cleanup.
 void os::die() {
   win32::exit_process_or_thread(win32::EPT_PROCESS_DIE, -1);
--- a/hotspot/src/share/vm/ci/ciCallSite.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciCallSite.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -50,25 +50,6 @@
 }
 
 // ------------------------------------------------------------------
-// ciCallSite::get_context
-//
-// Return the target MethodHandle of this CallSite.
-ciKlass* ciCallSite::get_context() {
-  assert(!is_constant_call_site(), "");
-
-  VM_ENTRY_MARK;
-  oop call_site_oop = get_oop();
-  InstanceKlass* ctxk = MethodHandles::get_call_site_context(call_site_oop);
-  if (ctxk == NULL) {
-    // The call site doesn't have a context associated. Set it to the default context.
-    oop def_context_oop = java_lang_invoke_CallSite::default_context();
-    java_lang_invoke_CallSite::set_context_cas(call_site_oop, def_context_oop, /*expected=*/NULL);
-    ctxk = MethodHandles::get_call_site_context(call_site_oop);
-  }
-  return (CURRENT_ENV->get_metadata(ctxk))->as_klass();
-}
-
-// ------------------------------------------------------------------
 // ciCallSite::print
 //
 // Print debugging information about the CallSite.
--- a/hotspot/src/share/vm/ci/ciCallSite.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciCallSite.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -43,7 +43,6 @@
 
   // Return the target MethodHandle of this CallSite.
   ciMethodHandle* get_target() const;
-  ciKlass* get_context();
 
   void print();
 };
--- a/hotspot/src/share/vm/ci/ciEnv.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -709,24 +709,23 @@
   KlassHandle h_holder(THREAD, holder);
   LinkResolver::check_klass_accessability(h_accessor, h_holder, KILL_COMPILE_ON_FATAL_(NULL));
   methodHandle dest_method;
+  LinkInfo link_info(h_holder, name, sig, h_accessor, /*check_access*/true);
   switch (bc) {
   case Bytecodes::_invokestatic:
     dest_method =
-      LinkResolver::resolve_static_call_or_null(h_holder, name, sig, h_accessor);
+      LinkResolver::resolve_static_call_or_null(link_info);
     break;
   case Bytecodes::_invokespecial:
     dest_method =
-      LinkResolver::resolve_special_call_or_null(h_holder, name, sig, h_accessor);
+      LinkResolver::resolve_special_call_or_null(link_info);
     break;
   case Bytecodes::_invokeinterface:
     dest_method =
-      LinkResolver::linktime_resolve_interface_method_or_null(h_holder, name, sig,
-                                                              h_accessor, true);
+      LinkResolver::linktime_resolve_interface_method_or_null(link_info);
     break;
   case Bytecodes::_invokevirtual:
     dest_method =
-      LinkResolver::linktime_resolve_virtual_method_or_null(h_holder, name, sig,
-                                                            h_accessor, true);
+      LinkResolver::linktime_resolve_virtual_method_or_null(link_info);
     break;
   default: ShouldNotReachHere();
   }
--- a/hotspot/src/share/vm/ci/ciField.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciField.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -352,11 +352,11 @@
     }
   }
 
+  LinkInfo link_info(_holder->get_instanceKlass(),
+                     _name->get_symbol(), _signature->get_symbol(),
+                     accessing_klass->get_Klass());
   fieldDescriptor result;
-  LinkResolver::resolve_field(result, _holder->get_instanceKlass(),
-                              _name->get_symbol(), _signature->get_symbol(),
-                              accessing_klass->get_Klass(), bc, true, false,
-                              KILL_COMPILE_ON_FATAL_(false));
+  LinkResolver::resolve_field(result, link_info, bc, false, KILL_COMPILE_ON_FATAL_(false));
 
   // update the hit-cache, unless there is a problem with memory scoping:
   if (accessing_klass->is_shared() || !is_shared()) {
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -453,8 +453,12 @@
 
   if (fields == NULL) {
     // This can happen if this class (java.lang.Class) has invisible fields.
-    _nonstatic_fields = super_fields;
-    return super_fields->length();
+    if (super_fields != NULL) {
+      _nonstatic_fields = super_fields;
+      return super_fields->length();
+    } else {
+      return 0;
+    }
   }
 
   int flen = fields->length();
--- a/hotspot/src/share/vm/ci/ciMethod.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -786,6 +786,7 @@
    Symbol* h_name      = name()->get_symbol();
    Symbol* h_signature = signature()->get_symbol();
 
+   LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass, check_access);
    methodHandle m;
    // Only do exact lookup if receiver klass has been linked.  Otherwise,
    // the vtable has not been setup, and the LinkResolver will fail.
@@ -793,9 +794,9 @@
         ||
        InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
      if (holder()->is_interface()) {
-       m = LinkResolver::resolve_interface_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass, check_access);
+       m = LinkResolver::resolve_interface_call_or_null(h_recv, link_info);
      } else {
-       m = LinkResolver::resolve_virtual_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass, check_access);
+       m = LinkResolver::resolve_virtual_call_or_null(h_recv, link_info);
      }
    }
 
@@ -839,7 +840,8 @@
      Symbol* h_name = name()->get_symbol();
      Symbol* h_signature = signature()->get_symbol();
 
-     vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, h_recv, h_name, h_signature, caller_klass);
+     LinkInfo link_info(h_recv, h_name, h_signature, caller_klass);
+     vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, link_info);
      if (vtable_index == Method::nonvirtual_vtable_index) {
        // A statically bound method.  Return "no such index".
        vtable_index = Method::invalid_vtable_index;
@@ -1285,10 +1287,8 @@
     EXCEPTION_MARK;
     HandleMark hm(THREAD);
     constantPoolHandle pool (THREAD, get_Method()->constants());
-    methodHandle spec_method;
-    KlassHandle  spec_klass;
     Bytecodes::Code code = (is_static ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual);
-    LinkResolver::resolve_method_statically(spec_method, spec_klass, code, pool, refinfo_index, THREAD);
+    methodHandle spec_method = LinkResolver::resolve_method_statically(code, pool, refinfo_index, THREAD);
     if (HAS_PENDING_EXCEPTION) {
       CLEAR_PENDING_EXCEPTION;
       return false;
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -2967,47 +2967,42 @@
 
 int java_lang_invoke_CallSite::_target_offset;
 int java_lang_invoke_CallSite::_context_offset;
-int java_lang_invoke_CallSite::_default_context_offset;
 
 void java_lang_invoke_CallSite::compute_offsets() {
   Klass* k = SystemDictionary::CallSite_klass();
   if (k != NULL) {
     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
-    compute_offset(_context_offset, k, vmSymbols::context_name(), vmSymbols::sun_misc_Cleaner_signature());
-    compute_offset(_default_context_offset, k,
-                   vmSymbols::DEFAULT_CONTEXT_name(), vmSymbols::sun_misc_Cleaner_signature(),
-                   /*is_static=*/true, /*allow_super=*/false);
+    compute_offset(_context_offset, k, vmSymbols::context_name(),
+                   vmSymbols::java_lang_invoke_MethodHandleNatives_CallSiteContext_signature());
   }
 }
 
-oop java_lang_invoke_CallSite::context_volatile(oop call_site) {
-  assert(java_lang_invoke_CallSite::is_instance(call_site), "");
-
-  oop dep_oop = call_site->obj_field_volatile(_context_offset);
-  return dep_oop;
-}
-
-void java_lang_invoke_CallSite::set_context_volatile(oop call_site, oop context) {
+oop java_lang_invoke_CallSite::context(oop call_site) {
   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
-  call_site->obj_field_put_volatile(_context_offset, context);
-}
-
-bool java_lang_invoke_CallSite::set_context_cas(oop call_site, oop context, oop expected) {
-  assert(java_lang_invoke_CallSite::is_instance(call_site), "");
-  HeapWord* context_addr = call_site->obj_field_addr<HeapWord>(_context_offset);
-  oop res = oopDesc::atomic_compare_exchange_oop(context, context_addr, expected, true);
-  bool success = (res == expected);
-  if (success) {
-    update_barrier_set((void*)context_addr, context);
+
+  oop dep_oop = call_site->obj_field(_context_offset);
+  return dep_oop;
+}
+
+// Support for java_lang_invoke_MethodHandleNatives_CallSiteContext
+
+int java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset;
+
+void java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets() {
+  Klass* k = SystemDictionary::Context_klass();
+  if (k != NULL) {
+    CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
   }
-  return success;
-}
-
-oop java_lang_invoke_CallSite::default_context() {
-  InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::CallSite_klass());
-  oop def_context_oop = ik->java_mirror()->obj_field(_default_context_offset);
-  assert(!oopDesc::is_null(def_context_oop), "");
-  return def_context_oop;
+}
+
+nmethodBucket* java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(oop call_site) {
+  assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
+  return (nmethodBucket*) (address) call_site->long_field(_vmdependencies_offset);
+}
+
+void java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(oop call_site, nmethodBucket* context) {
+  assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
+  call_site->long_field_put(_vmdependencies_offset, (jlong) (address) context);
 }
 
 // Support for java_security_AccessControlContext
@@ -3403,6 +3398,7 @@
   java_lang_invoke_LambdaForm::compute_offsets();
   java_lang_invoke_MethodType::compute_offsets();
   java_lang_invoke_CallSite::compute_offsets();
+  java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets();
   java_security_AccessControlContext::compute_offsets();
   // Initialize reflection classes. The layouts of these classes
   // changed with the new reflection implementation in JDK 1.4, and
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1170,8 +1170,6 @@
 private:
   static int _target_offset;
   static int _context_offset;
-  static int _default_context_offset;
-
 
   static void compute_offsets();
 
@@ -1181,11 +1179,7 @@
   static void         set_target(          oop site, oop target);
   static void         set_target_volatile( oop site, oop target);
 
-  static oop              context_volatile(oop site);
-  static void         set_context_volatile(oop site, oop context);
-  static bool         set_context_cas     (oop site, oop context, oop expected);
-
-  static oop default_context();
+  static oop              context(oop site);
 
   // Testers
   static bool is_subclass(Klass* klass) {
@@ -1197,6 +1191,31 @@
   static int target_offset_in_bytes()           { return _target_offset; }
 };
 
+// Interface to java.lang.invoke.MethodHandleNatives$CallSiteContext objects
+
+#define CALLSITECONTEXT_INJECTED_FIELDS(macro) \
+  macro(java_lang_invoke_MethodHandleNatives_CallSiteContext, vmdependencies, intptr_signature, false)
+
+class java_lang_invoke_MethodHandleNatives_CallSiteContext : AllStatic {
+  friend class JavaClasses;
+
+private:
+  static int _vmdependencies_offset;
+
+  static void compute_offsets();
+
+public:
+  // Accessors
+  static nmethodBucket* vmdependencies(oop context);
+  static void       set_vmdependencies(oop context, nmethodBucket* bucket);
+
+  // Testers
+  static bool is_subclass(Klass* klass) {
+    return klass->is_subclass_of(SystemDictionary::Context_klass());
+  }
+  static bool is_instance(oop obj);
+};
+
 // Interface to java.security.AccessControlContext objects
 
 class java_security_AccessControlContext: AllStatic {
@@ -1406,7 +1425,8 @@
 #define ALL_INJECTED_FIELDS(macro)          \
   CLASS_INJECTED_FIELDS(macro)              \
   CLASSLOADER_INJECTED_FIELDS(macro)        \
-  MEMBERNAME_INJECTED_FIELDS(macro)
+  MEMBERNAME_INJECTED_FIELDS(macro)         \
+  CALLSITECONTEXT_INJECTED_FIELDS(macro)
 
 // Interface to hard-coded offset checking
 
--- a/hotspot/src/share/vm/classfile/javaClasses.inline.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/javaClasses.inline.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -49,6 +49,10 @@
   return obj != NULL && is_subclass(obj->klass());
 }
 
+inline bool java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(oop obj) {
+  return obj != NULL && is_subclass(obj->klass());
+}
+
 inline bool java_lang_invoke_MemberName::is_instance(oop obj) {
   return obj != NULL && is_subclass(obj->klass());
 }
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -159,6 +159,7 @@
   do_klass(MethodType_klass,                            java_lang_invoke_MethodType,               Pre                 ) \
   do_klass(BootstrapMethodError_klass,                  java_lang_BootstrapMethodError,            Pre                 ) \
   do_klass(CallSite_klass,                              java_lang_invoke_CallSite,                 Pre                 ) \
+  do_klass(Context_klass,                               java_lang_invoke_MethodHandleNatives_CallSiteContext, Pre      ) \
   do_klass(ConstantCallSite_klass,                      java_lang_invoke_ConstantCallSite,         Pre                 ) \
   do_klass(MutableCallSite_klass,                       java_lang_invoke_MutableCallSite,          Pre                 ) \
   do_klass(VolatileCallSite_klass,                      java_lang_invoke_VolatileCallSite,         Pre                 ) \
--- a/hotspot/src/share/vm/classfile/verifier.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/verifier.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -45,6 +45,8 @@
 #include "runtime/javaCalls.hpp"
 #include "runtime/orderAccess.inline.hpp"
 #include "runtime/os.hpp"
+#include "runtime/thread.hpp"
+#include "services/threadService.hpp"
 #include "utilities/bytes.hpp"
 
 #define NOFAILOVER_MAJOR_VERSION                       51
@@ -130,6 +132,16 @@
     return true;
   }
 
+  // Timer includes any side effects of class verification (resolution,
+  // etc), but not recursive calls to Verifier::verify().
+  JavaThread* jt = (JavaThread*)THREAD;
+  PerfClassTraceTime timer(ClassLoader::perf_class_verify_time(),
+                           ClassLoader::perf_class_verify_selftime(),
+                           ClassLoader::perf_classes_verified(),
+                           jt->get_thread_stat()->perf_recursion_counts_addr(),
+                           jt->get_thread_stat()->perf_timers_addr(),
+                           PerfClassTraceTime::CLASS_VERIFY);
+
   // If the class should be verified, first see if we can use the split
   // verifier.  If not, or if verification fails and FailOverToOldVerifier
   // is set, then call the inference verifier.
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -274,12 +274,14 @@
   /* internal classes known only to the JVM: */                                                   \
   template(java_lang_invoke_MemberName,               "java/lang/invoke/MemberName")              \
   template(java_lang_invoke_MethodHandleNatives,      "java/lang/invoke/MethodHandleNatives")     \
+  template(java_lang_invoke_MethodHandleNatives_CallSiteContext, "java/lang/invoke/MethodHandleNatives$CallSiteContext") \
   template(java_lang_invoke_LambdaForm,               "java/lang/invoke/LambdaForm")              \
   template(java_lang_invoke_ForceInline_signature,    "Ljava/lang/invoke/ForceInline;")           \
   template(java_lang_invoke_DontInline_signature,     "Ljava/lang/invoke/DontInline;")            \
   template(java_lang_invoke_Stable_signature,         "Ljava/lang/invoke/Stable;")                \
   template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \
   template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;")  \
+  template(java_lang_invoke_MethodHandleNatives_CallSiteContext_signature, "Ljava/lang/invoke/MethodHandleNatives$CallSiteContext;") \
   /* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */         \
   template(findMethodHandleType_name,                 "findMethodHandleType")                     \
   template(findMethodHandleType_signature,       "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \
@@ -401,7 +403,7 @@
   template(protection_domain_name,                    "protection_domain")                        \
   template(signers_name,                              "signers_name")                             \
   template(loader_data_name,                          "loader_data")                              \
-  template(dependencies_name,                         "dependencies")                             \
+  template(vmdependencies_name,                       "vmdependencies")                           \
   template(input_stream_void_signature,               "(Ljava/io/InputStream;)V")                 \
   template(getFileURL_name,                           "getFileURL")                               \
   template(getFileURL_signature,                      "(Ljava/io/File;)Ljava/net/URL;")           \
--- a/hotspot/src/share/vm/code/codeCache.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/codeCache.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1047,40 +1047,6 @@
   }
 }
 
-// Flushes compiled methods dependent on a particular CallSite
-// instance when its target is different than the given MethodHandle.
-void CodeCache::flush_dependents_on(Handle call_site, Handle method_handle) {
-  assert_lock_strong(Compile_lock);
-
-  if (number_of_nmethods_with_dependencies() == 0) return;
-
-  // CodeCache can only be updated by a thread_in_VM and they will all be
-  // stopped during the safepoint so CodeCache will be safe to update without
-  // holding the CodeCache_lock.
-
-  CallSiteDepChange changes(call_site(), method_handle());
-
-  // Compute the dependent nmethods that have a reference to a
-  // CallSite object.  We use InstanceKlass::mark_dependent_nmethod
-  // directly instead of CodeCache::mark_for_deoptimization because we
-  // want dependents on the call site class only not all classes in
-  // the ContextStream.
-  int marked = 0;
-  {
-    MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
-    InstanceKlass* ctxk = MethodHandles::get_call_site_context(call_site());
-    if (ctxk == NULL) {
-      return; // No dependencies to invalidate yet.
-    }
-    marked = ctxk->mark_dependent_nmethods(changes);
-  }
-  if (marked > 0) {
-    // At least one nmethod has been marked for deoptimization
-    VM_Deoptimize op;
-    VMThread::execute(&op);
-  }
-}
-
 #ifdef HOTSWAP
 // Flushes compiled methods dependent on dependee in the evolutionary sense
 void CodeCache::flush_evol_dependents_on(instanceKlassHandle ev_k_h) {
--- a/hotspot/src/share/vm/code/codeCache.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/codeCache.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -224,7 +224,6 @@
 
   // Flushing and deoptimization
   static void flush_dependents_on(instanceKlassHandle dependee);
-  static void flush_dependents_on(Handle call_site, Handle method_handle);
 #ifdef HOTSWAP
   // Flushing and deoptimization in case of evolution
   static void flush_evol_dependents_on(instanceKlassHandle dependee);
--- a/hotspot/src/share/vm/code/dependencies.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/dependencies.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -117,9 +117,7 @@
 }
 
 void Dependencies::assert_call_site_target_value(ciCallSite* call_site, ciMethodHandle* method_handle) {
-  ciKlass* ctxk = call_site->get_context();
-  check_ctxk(ctxk);
-  assert_common_3(call_site_target_value, ctxk, call_site, method_handle);
+  assert_common_2(call_site_target_value, call_site, method_handle);
 }
 
 // Helper function.  If we are adding a new dep. under ctxk2,
@@ -175,7 +173,6 @@
       }
     }
   } else {
-    assert(dep_implicit_context_arg(dept) == 0, "sanity");
     if (note_dep_seen(dept, x0) && note_dep_seen(dept, x1)) {
       // look in this bucket for redundant assertions
       const int stride = 2;
@@ -389,7 +386,7 @@
   3, // unique_concrete_subtypes_2 ctxk, k1, k2
   3, // unique_concrete_methods_2 ctxk, m1, m2
   1, // no_finalizable_subclasses ctxk
-  3  // call_site_target_value ctxk, call_site, method_handle
+  2  // call_site_target_value call_site, method_handle
 };
 
 const char* Dependencies::dep_name(Dependencies::DepType dept) {
@@ -1515,16 +1512,11 @@
   return find_finalizable_subclass(search_at);
 }
 
-Klass* Dependencies::check_call_site_target_value(Klass* recorded_ctxk, oop call_site, oop method_handle, CallSiteDepChange* changes) {
+Klass* Dependencies::check_call_site_target_value(oop call_site, oop method_handle, CallSiteDepChange* changes) {
+  assert(!oopDesc::is_null(call_site), "sanity");
+  assert(!oopDesc::is_null(method_handle), "sanity");
   assert(call_site->is_a(SystemDictionary::CallSite_klass()),     "sanity");
-  assert(!oopDesc::is_null(method_handle), "sanity");
 
-  Klass* call_site_ctxk = MethodHandles::get_call_site_context(call_site);
-  assert(!Klass::is_null(call_site_ctxk), "call site context should be initialized already");
-  if (recorded_ctxk != call_site_ctxk) {
-    // Stale context
-    return recorded_ctxk;
-  }
   if (changes == NULL) {
     // Validate all CallSites
     if (java_lang_invoke_CallSite::target(call_site) != method_handle)
@@ -1599,7 +1591,7 @@
   Klass* witness = NULL;
   switch (type()) {
   case call_site_target_value:
-    witness = check_call_site_target_value(context_type(), argument_oop(1), argument_oop(2), changes);
+    witness = check_call_site_target_value(argument_oop(0), argument_oop(1), changes);
     break;
   default:
     witness = NULL;
--- a/hotspot/src/share/vm/code/dependencies.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/dependencies.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -173,7 +173,7 @@
     non_klass_types     = (1 << call_site_target_value),
     klass_types         = all_types & ~non_klass_types,
 
-    non_ctxk_types      = (1 << evol_method),
+    non_ctxk_types      = (1 << evol_method) | (1 << call_site_target_value),
     implicit_ctxk_types = 0,
     explicit_ctxk_types = all_types & ~(non_ctxk_types | implicit_ctxk_types),
 
@@ -330,7 +330,7 @@
   static Klass* check_exclusive_concrete_methods(Klass* ctxk, Method* m1, Method* m2,
                                                    KlassDepChange* changes = NULL);
   static Klass* check_has_no_finalizable_subclasses(Klass* ctxk, KlassDepChange* changes = NULL);
-  static Klass* check_call_site_target_value(Klass* recorded_ctxk, oop call_site, oop method_handle, CallSiteDepChange* changes = NULL);
+  static Klass* check_call_site_target_value(oop call_site, oop method_handle, CallSiteDepChange* changes = NULL);
   // A returned Klass* is NULL if the dependency assertion is still
   // valid.  A non-NULL Klass* is a 'witness' to the assertion
   // failure, a point in the class hierarchy where the assertion has
@@ -496,7 +496,7 @@
     bool next();
 
     DepType type()               { return _type; }
-    bool is_oop_argument(int i)  { return type() == call_site_target_value && i > 0; }
+    bool is_oop_argument(int i)  { return type() == call_site_target_value; }
     uintptr_t get_identifier(int i);
 
     int argument_count()         { return dep_args(type()); }
--- a/hotspot/src/share/vm/code/nmethod.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/nmethod.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -565,13 +565,18 @@
       // the number of methods compiled.  For applications with a lot
       // classes the slow way is too slow.
       for (Dependencies::DepStream deps(nm); deps.next(); ) {
-        Klass* klass = deps.context_type();
-        if (klass == NULL) {
-          continue;  // ignore things like evol_method
+        if (deps.type() == Dependencies::call_site_target_value) {
+          // CallSite dependencies are managed on per-CallSite instance basis.
+          oop call_site = deps.argument_oop(0);
+          MethodHandles::add_dependent_nmethod(call_site, nm);
+        } else {
+          Klass* klass = deps.context_type();
+          if (klass == NULL) {
+            continue;  // ignore things like evol_method
+          }
+          // record this nmethod as dependent on this klass
+          InstanceKlass::cast(klass)->add_dependent_nmethod(nm);
         }
-
-        // record this nmethod as dependent on this klass
-        InstanceKlass::cast(klass)->add_dependent_nmethod(nm);
       }
       NOT_PRODUCT(nmethod_stats.note_nmethod(nm));
       if (PrintAssembly || CompilerOracle::has_option_string(method, "PrintAssembly")) {
@@ -1464,13 +1469,20 @@
   if (!has_flushed_dependencies()) {
     set_has_flushed_dependencies();
     for (Dependencies::DepStream deps(this); deps.next(); ) {
-      Klass* klass = deps.context_type();
-      if (klass == NULL)  continue;  // ignore things like evol_method
-
-      // During GC the is_alive closure is non-NULL, and is used to
-      // determine liveness of dependees that need to be updated.
-      if (is_alive == NULL || klass->is_loader_alive(is_alive)) {
-        InstanceKlass::cast(klass)->remove_dependent_nmethod(this);
+      if (deps.type() == Dependencies::call_site_target_value) {
+        // CallSite dependencies are managed on per-CallSite instance basis.
+        oop call_site = deps.argument_oop(0);
+        MethodHandles::remove_dependent_nmethod(call_site, this);
+      } else {
+        Klass* klass = deps.context_type();
+        if (klass == NULL) {
+          continue;  // ignore things like evol_method
+        }
+        // During GC the is_alive closure is non-NULL, and is used to
+        // determine liveness of dependees that need to be updated.
+        if (is_alive == NULL || klass->is_loader_alive(is_alive)) {
+          InstanceKlass::cast(klass)->remove_dependent_nmethod(this);
+        }
       }
     }
   }
--- a/hotspot/src/share/vm/gc/cms/vmCMSOperations.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/cms/vmCMSOperations.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -254,9 +254,9 @@
   if (_gc_cause != GCCause::_gc_locker &&
       gch->total_full_collections_completed() <= _full_gc_count_before) {
     // maybe we should change the condition to test _gc_cause ==
-    // GCCause::_java_lang_system_gc, instead of
-    // _gc_cause != GCCause::_gc_locker
-    assert(_gc_cause == GCCause::_java_lang_system_gc,
+    // GCCause::_java_lang_system_gc or GCCause::_dcmd_gc_run,
+    // instead of _gc_cause != GCCause::_gc_locker
+    assert(GCCause::is_user_requested_gc(_gc_cause),
            "the only way to get here if this was a System.gc()-induced GC");
     assert(ExplicitGCInvokesConcurrent, "Error");
     // Now, wait for witnessing concurrent gc cycle to complete,
--- a/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -43,7 +43,7 @@
 }
 
 // Run a task; returns when the task is done, or the workers yield,
-// or the task is aborted, or the work gang is terminated via stop().
+// or the task is aborted.
 // A task that has been yielded can be continued via this interface
 // by using the same task repeatedly as the argument to the call.
 // It is expected that the YieldingFlexibleGangTask carries the appropriate
@@ -297,16 +297,9 @@
   WorkData data;
   int id;
   while (true) {
-    // Check if there is work to do or if we have been asked
-    // to terminate
+    // Check if there is work to do.
     gang()->internal_worker_poll(&data);
-    if (data.terminate()) {
-      // We have been asked to terminate.
-      assert(gang()->task() == NULL, "No task binding");
-      // set_status(TERMINATED);
-      return;
-    } else if (data.task() != NULL &&
-               data.sequence_number() != previous_sequence_number) {
+    if (data.task() != NULL && data.sequence_number() != previous_sequence_number) {
       // There is work to be done.
       // First check if we need to become active or if there
       // are already the requisite number of workers
--- a/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -176,7 +176,7 @@
   GangWorker* allocate_worker(uint which);
 
   // Run a task; returns when the task is done, or the workers yield,
-  // or the task is aborted, or the work gang is terminated via stop().
+  // or the task is aborted.
   // A task that has been yielded can be continued via this same interface
   // by using the same task repeatedly as the argument to the call.
   // It is expected that the YieldingFlexibleGangTask carries the appropriate
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1183,7 +1183,7 @@
     IsGCActiveMark x;
 
     // Timing
-    assert(gc_cause() != GCCause::_java_lang_system_gc || explicit_gc, "invariant");
+    assert(!GCCause::is_user_requested_gc(gc_cause()) || explicit_gc, "invariant");
     TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
 
     {
@@ -2199,6 +2199,7 @@
   switch (cause) {
     case GCCause::_gc_locker:               return GCLockerInvokesConcurrent;
     case GCCause::_java_lang_system_gc:     return ExplicitGCInvokesConcurrent;
+    case GCCause::_dcmd_gc_run:             return ExplicitGCInvokesConcurrent;
     case GCCause::_g1_humongous_allocation: return true;
     case GCCause::_update_allocation_context_stats_inc: return true;
     case GCCause::_wb_conc_mark:            return true;
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -324,7 +324,8 @@
   // explicitly started if:
   // (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or
   // (b) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent.
-  // (c) cause == _g1_humongous_allocation
+  // (c) cause == _dcmd_gc_run and +ExplicitGCInvokesConcurrent.
+  // (d) cause == _g1_humongous_allocation
   bool should_do_concurrent_full_gc(GCCause::Cause cause);
 
   // Keeps track of how many "old marking cycles" (i.e., Full GCs or
--- a/hotspot/src/share/vm/gc/g1/vm_operations_g1.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/g1/vm_operations_g1.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -168,7 +168,7 @@
   // +ExplicitGCInvokesConcurrent, we have to wait here for the cycle
   // that just started (or maybe one that was already in progress) to
   // finish.
-  if (_gc_cause == GCCause::_java_lang_system_gc &&
+  if (GCCause::is_user_requested_gc(_gc_cause) &&
       _should_initiate_conc_mark) {
     assert(ExplicitGCInvokesConcurrent,
            "the only way to be here is if ExplicitGCInvokesConcurrent is set");
--- a/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -130,7 +130,7 @@
   // Update the pause time.
   _major_timer.stop();
 
-  if (gc_cause != GCCause::_java_lang_system_gc ||
+  if (!GCCause::is_user_requested_gc(gc_cause) ||
       UseAdaptiveSizePolicyWithSystemGC) {
     double major_pause_in_seconds = _major_timer.seconds();
     double major_pause_in_ms = major_pause_in_seconds * MILLIUNITS;
--- a/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -272,7 +272,7 @@
       // Don't check if the size_policy is ready here.  Let
       // the size_policy check that internally.
       if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
-          ((gc_cause != GCCause::_java_lang_system_gc) ||
+          (!GCCause::is_user_requested_gc(gc_cause) ||
             UseAdaptiveSizePolicyWithSystemGC)) {
         // Swap the survivor spaces if from_space is empty. The
         // resize_young_gen() called below is normally used after
--- a/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -2053,7 +2053,7 @@
     marking_phase(vmthread_cm, maximum_heap_compaction, &_gc_tracer);
 
     bool max_on_system_gc = UseMaximumCompactionOnSystemGC
-      && gc_cause == GCCause::_java_lang_system_gc;
+      && GCCause::is_user_requested_gc(gc_cause);
     summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc);
 
     COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity"));
@@ -2089,7 +2089,7 @@
       // Don't check if the size_policy is ready here.  Let
       // the size_policy check that internally.
       if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
-          ((gc_cause != GCCause::_java_lang_system_gc) ||
+          (!GCCause::is_user_requested_gc(gc_cause) ||
             UseAdaptiveSizePolicyWithSystemGC)) {
         // Swap the survivor spaces if from_space is empty. The
         // resize_young_gen() called below is normally used after
--- a/hotspot/src/share/vm/gc/parallel/psScavenge.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/parallel/psScavenge.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -290,7 +290,7 @@
 
   AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
 
-  if ((gc_cause != GCCause::_java_lang_system_gc) ||
+  if (!GCCause::is_user_requested_gc(gc_cause) ||
        UseAdaptiveSizePolicyWithSystemGC) {
     // Gather the feedback data for eden occupancy.
     young_gen->eden_space()->accumulate_statistics();
--- a/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -960,7 +960,7 @@
                             GCCause::to_string(gch->gc_cause()));
       }
       assert(gch->gc_cause() == GCCause::_scavenge_alot ||
-             (gch->gc_cause() == GCCause::_java_lang_system_gc && UseConcMarkSweepGC && ExplicitGCInvokesConcurrent) ||
+             (GCCause::is_user_requested_gc(gch->gc_cause()) && UseConcMarkSweepGC && ExplicitGCInvokesConcurrent) ||
              !gch->incremental_collection_failed(),
              "Twice in a row");
       seen_incremental_collection_failed = false;
--- a/hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -244,7 +244,7 @@
   // Update the pause time.
   _minor_timer.stop();
 
-  if (gc_cause != GCCause::_java_lang_system_gc ||
+  if (!GCCause::is_user_requested_gc(gc_cause) ||
       UseAdaptiveSizePolicyWithSystemGC) {
     double minor_pause_in_seconds = _minor_timer.seconds();
     double minor_pause_in_ms = minor_pause_in_seconds * MILLIUNITS;
--- a/hotspot/src/share/vm/gc/shared/gcCause.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/gcCause.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -103,6 +103,9 @@
     case _last_ditch_collection:
       return "Last ditch collection";
 
+    case _dcmd_gc_run:
+      return "Diagnostic Command";
+
     case _last_gc_cause:
       return "ILLEGAL VALUE - last gc cause - ILLEGAL VALUE";
 
--- a/hotspot/src/share/vm/gc/shared/gcCause.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/gcCause.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -74,12 +74,15 @@
     _g1_humongous_allocation,
 
     _last_ditch_collection,
+
+    _dcmd_gc_run,
+
     _last_gc_cause
   };
 
   inline static bool is_user_requested_gc(GCCause::Cause cause) {
     return (cause == GCCause::_java_lang_system_gc ||
-            cause == GCCause::_jvmti_force_gc);
+            cause == GCCause::_dcmd_gc_run);
   }
 
   inline static bool is_serviceability_requested_gc(GCCause::Cause
--- a/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -304,9 +304,16 @@
 }
 
 bool GenCollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
-  return UseConcMarkSweepGC &&
-         ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) ||
-          (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
+  if (!UseConcMarkSweepGC) {
+    return false;
+  }
+
+  switch (cause) {
+    case GCCause::_gc_locker:           return GCLockerInvokesConcurrent;
+    case GCCause::_java_lang_system_gc:
+    case GCCause::_dcmd_gc_run:         return ExplicitGCInvokesConcurrent;
+    default:                            return false;
+  }
 }
 
 void GenCollectedHeap::collect_generation(Generation* gen, bool full, size_t size,
--- a/hotspot/src/share/vm/gc/shared/workgroup.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/workgroup.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -47,7 +47,6 @@
                          /* allow_vm_block */ are_GC_task_threads,
                                               Monitor::_safepoint_check_sometimes);
   assert(monitor() != NULL, "Failed to allocate monitor");
-  _terminate = false;
   _task = NULL;
   _sequence_number = 0;
   _started_workers = 0;
@@ -106,18 +105,6 @@
   return true;
 }
 
-AbstractWorkGang::~AbstractWorkGang() {
-  if (TraceWorkGang) {
-    tty->print_cr("Destructing work gang %s", name());
-  }
-  stop();   // stop all the workers
-  for (uint worker = 0; worker < total_workers(); worker += 1) {
-    delete gang_worker(worker);
-  }
-  delete gang_workers();
-  delete monitor();
-}
-
 GangWorker* AbstractWorkGang::gang_worker(uint i) const {
   // Array index bounds checking.
   GangWorker* result = NULL;
@@ -175,28 +162,9 @@
   WorkGang::run_task(task, (uint) active_workers());
 }
 
-void AbstractWorkGang::stop() {
-  // Tell all workers to terminate, then wait for them to become inactive.
-  MutexLockerEx ml(monitor(), Mutex::_no_safepoint_check_flag);
-  if (TraceWorkGang) {
-    tty->print_cr("Stopping work gang %s task %s", name(), task()->name());
-  }
-  _task = NULL;
-  _terminate = true;
-  monitor()->notify_all();
-  while (finished_workers() < active_workers()) {
-    if (TraceWorkGang) {
-      tty->print_cr("Waiting in work gang %s: %u/%u finished",
-                    name(), finished_workers(), active_workers());
-    }
-    monitor()->wait(/* no_safepoint_check */ true);
-  }
-}
-
 void AbstractWorkGang::internal_worker_poll(WorkData* data) const {
   assert(monitor()->owned_by_self(), "worker_poll is an internal method");
   assert(data != NULL, "worker data is null");
-  data->set_terminate(terminate());
   data->set_task(task());
   data->set_sequence_number(sequence_number());
 }
@@ -259,7 +227,7 @@
 void GangWorker::loop() {
   int previous_sequence_number = 0;
   Monitor* gang_monitor = gang()->monitor();
-  for ( ; /* !terminate() */; ) {
+  for ( ; ; ) {
     WorkData data;
     int part;  // Initialized below.
     {
@@ -272,8 +240,6 @@
       if (TraceWorkGang) {
         tty->print("Polled outside for work in gang %s worker %u",
                    gang()->name(), id());
-        tty->print("  terminate: %s",
-                   data.terminate() ? "true" : "false");
         tty->print("  sequence: %d (prev: %d)",
                    data.sequence_number(), previous_sequence_number);
         if (data.task() != NULL) {
@@ -283,13 +249,7 @@
         }
         tty->cr();
       }
-      for ( ; /* break or return */; ) {
-        // Terminate if requested.
-        if (data.terminate()) {
-          gang()->internal_note_finish();
-          gang_monitor->notify_all();
-          return;
-        }
+      for ( ; /* break */; ) {
         // Check for new work.
         if ((data.task() != NULL) &&
             (data.sequence_number() != previous_sequence_number)) {
@@ -306,8 +266,6 @@
         if (TraceWorkGang) {
           tty->print("Polled inside for work in gang %s worker %u",
                      gang()->name(), id());
-          tty->print("  terminate: %s",
-                     data.terminate() ? "true" : "false");
           tty->print("  sequence: %d (prev: %d)",
                      data.sequence_number(), previous_sequence_number);
           if (data.task() != NULL) {
--- a/hotspot/src/share/vm/gc/shared/workgroup.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/workgroup.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -103,16 +103,15 @@
 // An abstract class representing a gang of workers.
 // You subclass this to supply an implementation of run_task().
 class AbstractWorkGang: public CHeapObj<mtInternal> {
-  // Here's the public interface to this class.
+protected:
+  // Work gangs are never deleted, so no need to cleanup.
+  ~AbstractWorkGang() { ShouldNotReachHere(); }
 public:
-  // Constructor and destructor.
+  // Constructor.
   AbstractWorkGang(const char* name, bool are_GC_task_threads,
                    bool are_ConcurrentGC_threads);
-  ~AbstractWorkGang();
   // Run a task, returns when the task is done (or terminated).
   virtual void run_task(AbstractGangTask* task) = 0;
-  // Stop and terminate all workers.
-  virtual void stop();
   // Return true if more workers should be applied to the task.
   virtual bool needs_more_workers() const { return true; }
 public:
@@ -129,8 +128,6 @@
   Monitor*  _monitor;
   // The count of the number of workers in the gang.
   uint _total_workers;
-  // Whether the workers should terminate.
-  bool _terminate;
   // The array of worker threads for this gang.
   // This is only needed for cleaning up.
   GangWorker** _gang_workers;
@@ -153,9 +150,6 @@
   virtual uint active_workers() const {
     return _total_workers;
   }
-  bool terminate() const {
-    return _terminate;
-  }
   GangWorker** gang_workers() const {
     return _gang_workers;
   }
@@ -205,21 +199,16 @@
 class WorkData: public StackObj {
   // This would be a struct, but I want accessor methods.
 private:
-  bool              _terminate;
   AbstractGangTask* _task;
   int               _sequence_number;
 public:
   // Constructor and destructor
   WorkData() {
-    _terminate       = false;
     _task            = NULL;
     _sequence_number = 0;
   }
   ~WorkData() {
   }
-  // Accessors and modifiers
-  bool terminate()                       const { return _terminate;  }
-  void set_terminate(bool value)               { _terminate = value; }
   AbstractGangTask* task()               const { return _task; }
   void set_task(AbstractGangTask* value)       { _task = value; }
   int sequence_number()                  const { return _sequence_number; }
--- a/hotspot/src/share/vm/interpreter/bytecode.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/interpreter/bytecode.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -147,13 +147,10 @@
 
 
 methodHandle Bytecode_invoke::static_target(TRAPS) {
-  methodHandle m;
-  KlassHandle resolved_klass;
   constantPoolHandle constants(THREAD, this->constants());
 
   Bytecodes::Code bc = invoke_code();
-  LinkResolver::resolve_method_statically(m, resolved_klass, bc, constants, index(), CHECK_(methodHandle()));
-  return m;
+  return LinkResolver::resolve_method_statically(bc, constants, index(), THREAD);
 }
 
 Handle Bytecode_invoke::appendix(TRAPS) {
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -52,13 +52,17 @@
 // Implementation of CallInfo
 
 
-void CallInfo::set_static(KlassHandle resolved_klass, methodHandle resolved_method, TRAPS) {
+void CallInfo::set_static(KlassHandle resolved_klass, const methodHandle& resolved_method, TRAPS) {
   int vtable_index = Method::nonvirtual_vtable_index;
   set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
 }
 
 
-void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int itable_index, TRAPS) {
+void CallInfo::set_interface(KlassHandle resolved_klass,
+                             KlassHandle selected_klass,
+                             const methodHandle& resolved_method,
+                             const methodHandle& selected_method,
+                             int itable_index, TRAPS) {
   // This is only called for interface methods. If the resolved_method
   // comes from java/lang/Object, it can be the subject of a virtual call, so
   // we should pick the vtable index from the resolved method.
@@ -68,7 +72,11 @@
   set_common(resolved_klass, selected_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
 }
 
-void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
+void CallInfo::set_virtual(KlassHandle resolved_klass,
+                           KlassHandle selected_klass,
+                           const methodHandle& resolved_method,
+                           const methodHandle& selected_method,
+                           int vtable_index, TRAPS) {
   assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index");
   assert(vtable_index < 0 || !resolved_method->has_vtable_index() || vtable_index == resolved_method->vtable_index(), "");
   CallKind kind = (vtable_index >= 0 && !resolved_method->can_be_statically_bound() ? CallInfo::vtable_call : CallInfo::direct_call);
@@ -76,7 +84,9 @@
   assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call");
 }
 
-void CallInfo::set_handle(methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS) {
+void CallInfo::set_handle(const methodHandle& resolved_method,
+                          Handle resolved_appendix,
+                          Handle resolved_method_type, TRAPS) {
   if (resolved_method.is_null()) {
     THROW_MSG(vmSymbols::java_lang_InternalError(), "resolved method is null");
   }
@@ -93,8 +103,8 @@
 
 void CallInfo::set_common(KlassHandle resolved_klass,
                           KlassHandle selected_klass,
-                          methodHandle resolved_method,
-                          methodHandle selected_method,
+                          const methodHandle& resolved_method,
+                          const methodHandle& selected_method,
                           CallKind kind,
                           int index,
                           TRAPS) {
@@ -210,8 +220,52 @@
 }
 #endif //ASSERT
 
+#ifndef PRODUCT
+void CallInfo::print() {
+  ResourceMark rm;
+  const char* kindstr = "unknown";
+  switch (_call_kind) {
+  case direct_call: kindstr = "direct"; break;
+  case vtable_call: kindstr = "vtable"; break;
+  case itable_call: kindstr = "itable"; break;
+  }
+  tty->print_cr("Call %s@%d %s", kindstr, _call_index,
+                _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
+}
+#endif
 
+//------------------------------------------------------------------------------------------------------------------------
+// Implementation of LinkInfo
 
+LinkInfo::LinkInfo(constantPoolHandle pool, int index, TRAPS) {
+   // resolve klass
+  Klass* result = pool->klass_ref_at(index, CHECK);
+  _resolved_klass = KlassHandle(THREAD, result);
+
+  // Get name, signature, and static klass
+  _name          = pool->name_ref_at(index);
+  _signature     = pool->signature_ref_at(index);
+  _current_klass = KlassHandle(THREAD, pool->pool_holder());
+
+  // Coming from the constant pool always checks access
+  _check_access  = true;
+}
+
+char* LinkInfo::method_string() const {
+  return Method::name_and_sig_as_C_string(_resolved_klass(), _name, _signature);
+}
+
+#ifndef PRODUCT
+void LinkInfo::print() {
+  ResourceMark rm;
+  tty->print_cr("Link resolved_klass=%s name=%s signature=%s current_klass=%s check_access=%s",
+                _resolved_klass->name()->as_C_string(),
+                _name->as_C_string(),
+                _signature->as_C_string(),
+                _current_klass.is_null() ? "(none)" : _current_klass->name()->as_C_string(),
+                _check_access ? "true" : "false");
+}
+#endif // PRODUCT
 //------------------------------------------------------------------------------------------------------------------------
 // Klass resolution
 
@@ -231,11 +285,6 @@
   }
 }
 
-void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
-  Klass* result_oop = pool->klass_ref_at(index, CHECK);
-  result = KlassHandle(THREAD, result_oop);
-}
-
 //------------------------------------------------------------------------------------------------------------------------
 // Method resolution
 //
@@ -243,76 +292,84 @@
 
 // Look up method in klasses, including static methods
 // Then look up local default methods
-void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS) {
+methodHandle LinkResolver::lookup_method_in_klasses(const LinkInfo& link_info,
+                                                    bool checkpolymorphism,
+                                                    bool in_imethod_resolve, TRAPS) {
+  KlassHandle klass = link_info.resolved_klass();
+  Symbol* name = link_info.name();
+  Symbol* signature = link_info.signature();
+
   // Ignore overpasses so statics can be found during resolution
-  Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass);
+  Method* result = klass->uncached_lookup_method(name, signature, Klass::skip_overpass);
 
   if (klass->oop_is_array()) {
     // Only consider klass and super klass for arrays
-    result = methodHandle(THREAD, result_oop);
-    return;
+    return methodHandle(THREAD, result);
   }
 
   // JDK 8, JVMS 5.4.3.4: Interface method resolution should
   // ignore static and non-public methods of java.lang.Object,
   // like clone, finalize, registerNatives.
   if (in_imethod_resolve &&
-      result_oop != NULL &&
+      result != NULL &&
       klass->is_interface() &&
-      (result_oop->is_static() || !result_oop->is_public()) &&
-      result_oop->method_holder() == SystemDictionary::Object_klass()) {
-    result_oop = NULL;
+      (result->is_static() || !result->is_public()) &&
+      result->method_holder() == SystemDictionary::Object_klass()) {
+    result = NULL;
   }
 
   // Before considering default methods, check for an overpass in the
   // current class if a method has not been found.
-  if (result_oop == NULL) {
-    result_oop = InstanceKlass::cast(klass())->find_method(name, signature);
+  if (result == NULL) {
+    result = InstanceKlass::cast(klass())->find_method(name, signature);
   }
 
-  if (result_oop == NULL) {
+  if (result == NULL) {
     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
     if (default_methods != NULL) {
-      result_oop = InstanceKlass::find_method(default_methods, name, signature);
+      result = InstanceKlass::find_method(default_methods, name, signature);
     }
   }
 
-  if (checkpolymorphism && result_oop != NULL) {
-    vmIntrinsics::ID iid = result_oop->intrinsic_id();
+  if (checkpolymorphism && result != NULL) {
+    vmIntrinsics::ID iid = result->intrinsic_id();
     if (MethodHandles::is_signature_polymorphic(iid)) {
       // Do not link directly to these.  The VM must produce a synthetic one using lookup_polymorphic_method.
-      return;
+      return NULL;
     }
   }
-  result = methodHandle(THREAD, result_oop);
+  return methodHandle(THREAD, result);
 }
 
 // returns first instance method
 // Looks up method in classes, then looks up local default methods
-void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
-  Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::find_overpass);
-  result = methodHandle(THREAD, result_oop);
-  while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
-    KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
-    result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::find_overpass));
+methodHandle LinkResolver::lookup_instance_method_in_klasses(KlassHandle klass,
+                                                             Symbol* name,
+                                                             Symbol* signature, TRAPS) {
+  Method* result = klass->uncached_lookup_method(name, signature, Klass::find_overpass);
+
+  while (result != NULL && result->is_static() && result->method_holder()->super() != NULL) {
+    Klass* super_klass = result->method_holder()->super();
+    result = super_klass->uncached_lookup_method(name, signature, Klass::find_overpass);
   }
 
   if (klass->oop_is_array()) {
     // Only consider klass and super klass for arrays
-    return;
+    return methodHandle(THREAD, result);
   }
 
-  if (result.is_null()) {
+  if (result == NULL) {
     Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
     if (default_methods != NULL) {
-      result = methodHandle(InstanceKlass::find_method(default_methods, name, signature));
-      assert(result.is_null() || !result->is_static(), "static defaults not allowed");
+      result = InstanceKlass::find_method(default_methods, name, signature);
+      assert(result == NULL || !result->is_static(), "static defaults not allowed");
     }
   }
+  return methodHandle(THREAD, result);
 }
 
 int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
-                                          methodHandle resolved_method) {
+                                                   const methodHandle& resolved_method) {
 
   int vtable_index = Method::invalid_vtable_index;
   Symbol* name = resolved_method->name();
@@ -336,21 +393,26 @@
   return vtable_index;
 }
 
-void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
-  InstanceKlass *ik = InstanceKlass::cast(klass());
+methodHandle LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info, TRAPS) {
+  InstanceKlass *ik = InstanceKlass::cast(cp_info.resolved_klass()());
 
   // Specify 'true' in order to skip default methods when searching the
   // interfaces.  Function lookup_method_in_klasses() already looked for
   // the method in the default methods table.
-  result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, Klass::skip_defaults));
+  return methodHandle(THREAD,
+    ik->lookup_method_in_all_interfaces(cp_info.name(), cp_info.signature(),
+    Klass::skip_defaults));
 }
 
-void LinkResolver::lookup_polymorphic_method(methodHandle& result,
-                                             KlassHandle klass, Symbol* name, Symbol* full_signature,
-                                             KlassHandle current_klass,
+methodHandle LinkResolver::lookup_polymorphic_method(
+                                             const LinkInfo& link_info,
                                              Handle *appendix_result_or_null,
                                              Handle *method_type_result,
                                              TRAPS) {
+  KlassHandle klass = link_info.resolved_klass();
+  Symbol* name = link_info.name();
+  Symbol* full_signature = link_info.signature();
+
   vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
   if (TraceMethodHandles) {
     ResourceMark rm(THREAD);
@@ -365,7 +427,7 @@
       // Do not erase last argument type (MemberName) if it is a static linkTo method.
       bool keep_last_arg = MethodHandles::is_signature_polymorphic_static(iid);
       TempNewSymbol basic_signature =
-        MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg, CHECK);
+        MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg, CHECK_NULL);
       if (TraceMethodHandles) {
         ResourceMark rm(THREAD);
         tty->print_cr("lookup_polymorphic_method %s %s => basic %s",
@@ -373,9 +435,9 @@
                       full_signature->as_C_string(),
                       basic_signature->as_C_string());
       }
-      result = SystemDictionary::find_method_handle_intrinsic(iid,
+      methodHandle result = SystemDictionary::find_method_handle_intrinsic(iid,
                                                               basic_signature,
-                                                              CHECK);
+                                                              CHECK_NULL);
       if (result.not_null()) {
         assert(result->is_method_handle_intrinsic(), "MH.invokeBasic or MH.linkTo* intrinsic");
         assert(result->intrinsic_id() != vmIntrinsics::_invokeGeneric, "wrong place to find this");
@@ -384,8 +446,8 @@
           tty->print("lookup_polymorphic_method => intrinsic ");
           result->print_on(tty);
         }
-        return;
       }
+      return result;
     } else if (iid == vmIntrinsics::_invokeGeneric
                && !THREAD->is_Compiler_thread()
                && appendix_result_or_null != NULL) {
@@ -399,18 +461,19 @@
                                             Handle(),
                                             Handle(),
                                             true,
-                                            CHECK);
+                                            CHECK_NULL);
         }
       }
 
       Handle appendix;
       Handle method_type;
-      result = SystemDictionary::find_method_handle_invoker(name,
+      methodHandle result = SystemDictionary::find_method_handle_invoker(
+                                                            name,
                                                             full_signature,
-                                                            current_klass,
+                                                            link_info.current_klass(),
                                                             &appendix,
                                                             &method_type,
-                                                            CHECK);
+                                                            CHECK_NULL);
       if (TraceMethodHandles) {
         tty->print("lookup_polymorphic_method => (via Java) ");
         result->print_on(tty);
@@ -423,7 +486,7 @@
         ResourceMark rm(THREAD);
 
         TempNewSymbol basic_signature =
-          MethodHandles::lookup_basic_type_signature(full_signature, CHECK);
+          MethodHandles::lookup_basic_type_signature(full_signature, CHECK_NULL);
         int actual_size_of_params = result->size_of_parameters();
         int expected_size_of_params = ArgumentSizeComputer(basic_signature).size();
         // +1 for MethodHandle.this, +1 for trailing MethodType
@@ -441,16 +504,17 @@
         assert(appendix_result_or_null != NULL, "");
         (*appendix_result_or_null) = appendix;
         (*method_type_result)      = method_type;
-        return;
       }
+      return result;
     }
   }
+  return NULL;
 }
 
 void LinkResolver::check_method_accessability(KlassHandle ref_klass,
                                               KlassHandle resolved_klass,
                                               KlassHandle sel_klass,
-                                              methodHandle sel_method,
+                                              const methodHandle& sel_method,
                                               TRAPS) {
 
   AccessFlags flags = sel_method->access_flags();
@@ -493,8 +557,8 @@
   }
 }
 
-void LinkResolver::resolve_method_statically(methodHandle& resolved_method, KlassHandle& resolved_klass,
-                                             Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS) {
+methodHandle LinkResolver::resolve_method_statically(Bytecodes::Code code,
+                                                     constantPoolHandle pool, int index, TRAPS) {
   // This method is used only
   // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call),
   // and
@@ -502,49 +566,108 @@
   // It appears to fail when applied to an invokeinterface call site.
   // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
   // resolve klass
+  KlassHandle resolved_klass;
   if (code == Bytecodes::_invokedynamic) {
     resolved_klass = SystemDictionary::MethodHandle_klass();
     Symbol* method_name = vmSymbols::invoke_name();
     Symbol* method_signature = pool->signature_ref_at(index);
     KlassHandle  current_klass(THREAD, pool->pool_holder());
-    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, false, CHECK);
-    return;
+    LinkInfo link_info(resolved_klass, method_name, method_signature, current_klass);
+    return resolve_method(link_info, /*require_methodref*/false, THREAD);
   }
 
-  resolve_klass(resolved_klass, pool, index, CHECK);
-
-  Symbol*  method_name       = pool->name_ref_at(index);
-  Symbol*  method_signature  = pool->signature_ref_at(index);
-  KlassHandle  current_klass(THREAD, pool->pool_holder());
+  LinkInfo link_info(pool, index, CHECK_NULL);
+  resolved_klass = link_info.resolved_klass();
 
   if (pool->has_preresolution()
       || (resolved_klass() == SystemDictionary::MethodHandle_klass() &&
-          MethodHandles::is_signature_polymorphic_name(resolved_klass(), method_name))) {
-    Method* result_oop = ConstantPool::method_at_if_loaded(pool, index);
-    if (result_oop != NULL) {
-      resolved_method = methodHandle(THREAD, result_oop);
-      return;
+          MethodHandles::is_signature_polymorphic_name(resolved_klass(), link_info.name()))) {
+    Method* result = ConstantPool::method_at_if_loaded(pool, index);
+    if (result != NULL) {
+      return methodHandle(THREAD, result);
     }
   }
 
   if (code == Bytecodes::_invokeinterface) {
-    resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+    return resolve_interface_method(link_info, true, THREAD);
   } else if (code == Bytecodes::_invokevirtual) {
-    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+    return resolve_method(link_info, /*require_methodref*/true, THREAD);
   } else if (!resolved_klass->is_interface()) {
-    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, false, CHECK);
+    return resolve_method(link_info, /*require_methodref*/false, THREAD);
   } else {
     bool nostatics = (code == Bytecodes::_invokestatic) ? false : true;
-    resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, nostatics, CHECK);
+    return resolve_interface_method(link_info, nostatics, THREAD);
   }
 }
 
-void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
-                                  Symbol* method_name, Symbol* method_signature,
-                                  KlassHandle current_klass, bool check_access,
-                                  bool require_methodref, TRAPS) {
+// Check and print a loader constraint violation message for method or interface method
+void LinkResolver::check_method_loader_constraints(const LinkInfo& link_info,
+                                                   const methodHandle& resolved_method,
+                                                   const char* method_type, TRAPS) {
+  Handle current_loader(THREAD, link_info.current_klass()->class_loader());
+  Handle resolved_loader(THREAD, resolved_method->method_holder()->class_loader());
+
+  ResourceMark rm(THREAD);
+  Symbol* failed_type_symbol =
+    SystemDictionary::check_signature_loaders(link_info.signature(), current_loader,
+                                              resolved_loader, true, CHECK);
+  if (failed_type_symbol != NULL) {
+    const char* msg = "loader constraint violation: when resolving %s"
+      " \"%s\" the class loader (instance of %s) of the current class, %s,"
+      " and the class loader (instance of %s) for the method's defining class, %s, have"
+      " different Class objects for the type %s used in the signature";
+    char* sig = link_info.method_string();
+    const char* loader1_name = SystemDictionary::loader_name(current_loader());
+    char* current = link_info.current_klass()->name()->as_C_string();
+    const char* loader2_name = SystemDictionary::loader_name(resolved_loader());
+    char* target = resolved_method->method_holder()->name()->as_C_string();
+    char* failed_type_name = failed_type_symbol->as_C_string();
+    size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1_name) +
+      strlen(current) + strlen(loader2_name) + strlen(target) +
+      strlen(failed_type_name) + strlen(method_type) + 1;
+    char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
+    jio_snprintf(buf, buflen, msg, method_type, sig, loader1_name, current, loader2_name,
+                 target, failed_type_name);
+    THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
+  }
+}
+
+void LinkResolver::check_field_loader_constraints(Symbol* field, Symbol* sig,
+                                                  KlassHandle current_klass,
+                                                  KlassHandle sel_klass, TRAPS) {
+  Handle ref_loader(THREAD, current_klass->class_loader());
+  Handle sel_loader(THREAD, sel_klass->class_loader());
+
+  ResourceMark rm(THREAD);  // needed for check_signature_loaders
+  Symbol* failed_type_symbol =
+    SystemDictionary::check_signature_loaders(sig,
+                                              ref_loader, sel_loader,
+                                              false,
+                                              CHECK);
+  if (failed_type_symbol != NULL) {
+    const char* msg = "loader constraint violation: when resolving field"
+      " \"%s\" the class loader (instance of %s) of the referring class, "
+      "%s, and the class loader (instance of %s) for the field's resolved "
+      "type, %s, have different Class objects for that type";
+    char* field_name = field->as_C_string();
+    const char* loader1_name = SystemDictionary::loader_name(ref_loader());
+    char* sel = sel_klass->name()->as_C_string();
+    const char* loader2_name = SystemDictionary::loader_name(sel_loader());
+    char* failed_type_name = failed_type_symbol->as_C_string();
+    size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1_name) +
+                    strlen(sel) + strlen(loader2_name) + strlen(failed_type_name) + 1;
+    char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
+    jio_snprintf(buf, buflen, msg, field_name, loader1_name, sel, loader2_name,
+                     failed_type_name);
+    THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
+  }
+}
+
+methodHandle LinkResolver::resolve_method(const LinkInfo& link_info,
+                                          bool require_methodref, TRAPS) {
 
   Handle nested_exception;
+  KlassHandle resolved_klass = link_info.resolved_klass();
 
   // 1. check if methodref required, that resolved_klass is not interfacemethodref
   if (require_methodref && resolved_klass->is_interface()) {
@@ -552,20 +675,19 @@
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
         resolved_klass()->external_name());
-    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
   // 2. lookup method in resolved klass and its super klasses
-  lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK);
+  methodHandle resolved_method = lookup_method_in_klasses(link_info, true, false, CHECK_NULL);
 
   if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { // not found in the class hierarchy
     // 3. lookup method in all the interfaces implemented by the resolved klass
-    lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+    resolved_method = lookup_method_in_interfaces(link_info, CHECK_NULL);
 
     if (resolved_method.is_null()) {
       // JSR 292:  see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
-      lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
-                                current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
+      resolved_method = lookup_polymorphic_method(link_info, (Handle*)NULL, (Handle*)NULL, THREAD);
       if (HAS_PENDING_EXCEPTION) {
         nested_exception = Handle(THREAD, PENDING_EXCEPTION);
         CLEAR_PENDING_EXCEPTION;
@@ -576,15 +698,16 @@
   if (resolved_method.is_null()) {
     // 4. method lookup failed
     ResourceMark rm(THREAD);
-    THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
+    THROW_MSG_CAUSE_(vmSymbols::java_lang_NoSuchMethodError(),
                     Method::name_and_sig_as_C_string(resolved_klass(),
-                                                            method_name,
-                                                            method_signature),
-                    nested_exception);
+                                                     link_info.name(),
+                                                     link_info.signature()),
+                    nested_exception, NULL);
   }
 
   // 5. access checks, access checking may be turned off when calling from within the VM.
-  if (check_access) {
+  KlassHandle current_klass = link_info.current_klass();
+  if (link_info.check_access()) {
     assert(current_klass.not_null() , "current_klass should not be null");
 
     // check if method can be accessed by the referring class
@@ -592,76 +715,50 @@
                                resolved_klass,
                                KlassHandle(THREAD, resolved_method->method_holder()),
                                resolved_method,
-                               CHECK);
+                               CHECK_NULL);
 
     // check loader constraints
-    Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
-    Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
-    {
-      ResourceMark rm(THREAD);
-      Symbol* failed_type_symbol =
-        SystemDictionary::check_signature_loaders(method_signature, loader,
-                                                  class_loader, true, CHECK);
-      if (failed_type_symbol != NULL) {
-        const char* msg = "loader constraint violation: when resolving method"
-          " \"%s\" the class loader (instance of %s) of the current class, %s,"
-          " and the class loader (instance of %s) for the method's defining class, %s, have"
-          " different Class objects for the type %s used in the signature";
-        char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
-        const char* loader1 = SystemDictionary::loader_name(loader());
-        char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
-        const char* loader2 = SystemDictionary::loader_name(class_loader());
-        char* target = InstanceKlass::cast(resolved_method->method_holder())
-                       ->name()->as_C_string();
-        char* failed_type_name = failed_type_symbol->as_C_string();
-        size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
-          strlen(current) + strlen(loader2) + strlen(target) +
-          strlen(failed_type_name) + 1;
-        char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
-        jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
-                     target, failed_type_name);
-        THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
-      }
-    }
+    check_method_loader_constraints(link_info, resolved_method, "method", CHECK_NULL);
   }
+
+  return resolved_method;
 }
 
-void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
-                                            KlassHandle resolved_klass,
-                                            Symbol* method_name,
-                                            Symbol* method_signature,
-                                            KlassHandle current_klass,
-                                            bool check_access,
-                                            bool nostatics, TRAPS) {
+methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info,
+                                                    bool nostatics, TRAPS) {
+
+  KlassHandle resolved_klass = link_info.resolved_klass();
 
   // check if klass is interface
   if (!resolved_klass->is_interface()) {
     ResourceMark rm(THREAD);
     char buf[200];
     jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass()->external_name());
-    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
   // lookup method in this interface or its super, java.lang.Object
   // JDK8: also look for static methods
-  lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, false, true, CHECK);
+  methodHandle resolved_method = lookup_method_in_klasses(link_info, false, true, CHECK_NULL);
 
   if (resolved_method.is_null() && !resolved_klass->oop_is_array()) {
     // lookup method in all the super-interfaces
-    lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+    resolved_method = lookup_method_in_interfaces(link_info, CHECK_NULL);
   }
 
   if (resolved_method.is_null()) {
     // no method found
     ResourceMark rm(THREAD);
-    THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
-              Method::name_and_sig_as_C_string(resolved_klass(),
-                                                      method_name,
-                                                      method_signature));
+    THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(),
+                   Method::name_and_sig_as_C_string(resolved_klass(),
+                                                    link_info.name(),
+                                                    link_info.signature()));
   }
 
-  if (check_access) {
+  if (link_info.check_access()) {
     // JDK8 adds non-public interface methods, and accessability check requirement
+    KlassHandle current_klass = link_info.current_klass();
+
     assert(current_klass.not_null() , "current_klass should not be null");
 
     // check if method can be accessed by the referring class
@@ -669,38 +766,9 @@
                                resolved_klass,
                                KlassHandle(THREAD, resolved_method->method_holder()),
                                resolved_method,
-                               CHECK);
+                               CHECK_NULL);
 
-    HandleMark hm(THREAD);
-    Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
-    Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
-    {
-      ResourceMark rm(THREAD);
-      Symbol* failed_type_symbol =
-        SystemDictionary::check_signature_loaders(method_signature, loader,
-                                                  class_loader, true, CHECK);
-      if (failed_type_symbol != NULL) {
-        const char* msg = "loader constraint violation: when resolving "
-          "interface method \"%s\" the class loader (instance of %s) of the "
-          "current class, %s, and the class loader (instance of %s) for "
-          "the method's defining class, %s, have different Class objects for the type %s "
-          "used in the signature";
-        char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
-        const char* loader1 = SystemDictionary::loader_name(loader());
-        char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
-        const char* loader2 = SystemDictionary::loader_name(class_loader());
-        char* target = InstanceKlass::cast(resolved_method->method_holder())
-                       ->name()->as_C_string();
-        char* failed_type_name = failed_type_symbol->as_C_string();
-        size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
-          strlen(current) + strlen(loader2) + strlen(target) +
-          strlen(failed_type_name) + 1;
-        char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
-        jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
-                     target, failed_type_name);
-        THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
-      }
-    }
+    check_method_loader_constraints(link_info, resolved_method, "interface method", CHECK_NULL);
   }
 
   if (nostatics && resolved_method->is_static()) {
@@ -709,28 +777,16 @@
     jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
                  Method::name_and_sig_as_C_string(resolved_klass(),
                  resolved_method->name(), resolved_method->signature()));
-    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
   if (TraceItables && Verbose) {
-    ResourceMark rm(THREAD);
-    tty->print("invokeinterface resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
-                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
-                   (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
-                   Method::name_and_sig_as_C_string(resolved_klass(),
-                                                    resolved_method->name(),
-                                                    resolved_method->signature()),
-                   resolved_method->method_holder()->internal_name()
-                  );
-    resolved_method->access_flags().print_on(tty);
-    if (resolved_method->is_default_method()) {
-      tty->print("default ");
-    }
-    if (resolved_method->is_overpass()) {
-      tty->print("overpass");
-    }
+    trace_method_resolution("invokeinterface resolved method: caller-class",
+                            link_info.current_klass(), resolved_klass, resolved_method);
     tty->cr();
   }
+
+  return resolved_method;
 }
 
 //------------------------------------------------------------------------------------------------------------------------
@@ -739,7 +795,7 @@
 void LinkResolver::check_field_accessability(KlassHandle ref_klass,
                                              KlassHandle resolved_klass,
                                              KlassHandle sel_klass,
-                                             fieldDescriptor& fd,
+                                             const fieldDescriptor& fd,
                                              TRAPS) {
   if (!Reflection::verify_field_access(ref_klass(),
                                        resolved_klass(),
@@ -759,30 +815,27 @@
   }
 }
 
-void LinkResolver::resolve_field_access(fieldDescriptor& result, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
-  // Load these early in case the resolve of the containing klass fails
-  Symbol* field = pool->name_ref_at(index);
-  Symbol* sig   = pool->signature_ref_at(index);
-
-  // resolve specified klass
-  KlassHandle resolved_klass;
-  resolve_klass(resolved_klass, pool, index, CHECK);
-
-  KlassHandle  current_klass(THREAD, pool->pool_holder());
-  resolve_field(result, resolved_klass, field, sig, current_klass, byte, true, true, CHECK);
+void LinkResolver::resolve_field_access(fieldDescriptor& fd, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
+  LinkInfo link_info(pool, index, CHECK);
+  resolve_field(fd, link_info, byte, true, CHECK);
 }
 
-void LinkResolver::resolve_field(fieldDescriptor& fd, KlassHandle resolved_klass, Symbol* field, Symbol* sig,
-                                 KlassHandle current_klass, Bytecodes::Code byte, bool check_access, bool initialize_class,
+void LinkResolver::resolve_field(fieldDescriptor& fd,
+                                 const LinkInfo& link_info,
+                                 Bytecodes::Code byte, bool initialize_class,
                                  TRAPS) {
   assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
          byte == Bytecodes::_getfield  || byte == Bytecodes::_putfield  ||
          byte == Bytecodes::_nofast_getfield  || byte == Bytecodes::_nofast_putfield  ||
-         (byte == Bytecodes::_nop && !check_access), "bad field access bytecode");
+         (byte == Bytecodes::_nop && !link_info.check_access()), "bad field access bytecode");
 
   bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
   bool is_put    = (byte == Bytecodes::_putfield  || byte == Bytecodes::_putstatic || byte == Bytecodes::_nofast_putfield);
   // Check if there's a resolved klass containing the field
+  KlassHandle resolved_klass = link_info.resolved_klass();
+  Symbol* field = link_info.name();
+  Symbol* sig = link_info.signature();
+
   if (resolved_klass.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
@@ -796,11 +849,12 @@
     THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
   }
 
-  if (!check_access)
+  if (!link_info.check_access())
     // Access checking may be turned off when calling from within the VM.
     return;
 
   // check access
+  KlassHandle current_klass = link_info.current_klass();
   check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
 
   // check for errors
@@ -827,34 +881,7 @@
   }
 
   if (sel_klass() != current_klass()) {
-    HandleMark hm(THREAD);
-    Handle ref_loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
-    Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
-    {
-      ResourceMark rm(THREAD);
-      Symbol* failed_type_symbol =
-        SystemDictionary::check_signature_loaders(sig,
-                                                  ref_loader, sel_loader,
-                                                  false,
-                                                  CHECK);
-      if (failed_type_symbol != NULL) {
-        const char* msg = "loader constraint violation: when resolving field"
-          " \"%s\" the class loader (instance of %s) of the referring class, "
-          "%s, and the class loader (instance of %s) for the field's resolved "
-          "type, %s, have different Class objects for that type";
-        char* field_name = field->as_C_string();
-        const char* loader1 = SystemDictionary::loader_name(ref_loader());
-        char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
-        const char* loader2 = SystemDictionary::loader_name(sel_loader());
-        char* failed_type_name = failed_type_symbol->as_C_string();
-        size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
-          strlen(sel) + strlen(loader2) + strlen(failed_type_name) + 1;
-        char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
-        jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
-                     failed_type_name);
-        THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
-      }
-    }
+    check_field_loader_constraints(field, sig, current_klass, sel_klass, CHECK);
   }
 
   // return information. note that the klass is set to the actual klass containing the
@@ -873,32 +900,38 @@
 // recv_klass         the receiver klass
 
 
-void LinkResolver::resolve_static_call(CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name,
-                                       Symbol* method_signature, KlassHandle current_klass,
-                                       bool check_access, bool initialize_class, TRAPS) {
-  methodHandle resolved_method;
-  linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
-  resolved_klass = KlassHandle(THREAD, resolved_method->method_holder());
+void LinkResolver::resolve_static_call(CallInfo& result,
+                                       const LinkInfo& link_info,
+                                       bool initialize_class, TRAPS) {
+  methodHandle resolved_method = linktime_resolve_static_method(link_info, CHECK);
 
+  // The resolved class can change as a result of this resolution.
+  KlassHandle resolved_klass = KlassHandle(THREAD, resolved_method->method_holder());
+
+  Method* save_resolved_method = resolved_method();
   // Initialize klass (this should only happen if everything is ok)
   if (initialize_class && resolved_klass->should_be_initialized()) {
     resolved_klass->initialize(CHECK);
-    linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
+    // Use updated LinkInfo (to reresolve with resolved_klass as method_holder?)
+    LinkInfo new_info(resolved_klass, link_info.name(), link_info.signature(),
+                      link_info.current_klass(), link_info.check_access());
+    resolved_method = linktime_resolve_static_method(new_info, CHECK);
   }
 
+  assert(save_resolved_method == resolved_method(), "does this change?");
   // setup result
   result.set_static(resolved_klass, resolved_method, CHECK);
 }
 
 // throws linktime exceptions
-void LinkResolver::linktime_resolve_static_method(methodHandle& resolved_method, KlassHandle resolved_klass,
-                                                  Symbol* method_name, Symbol* method_signature,
-                                                  KlassHandle current_klass, bool check_access, TRAPS) {
+methodHandle LinkResolver::linktime_resolve_static_method(const LinkInfo& link_info, TRAPS) {
 
+  KlassHandle resolved_klass = link_info.resolved_klass();
+  methodHandle resolved_method;
   if (!resolved_klass->is_interface()) {
-    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
+    resolved_method = resolve_method(link_info, /*require_methodref*/false, CHECK_NULL);
   } else {
-    resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
+    resolved_method = resolve_interface_method(link_info, /*nostatics*/false, CHECK_NULL);
   }
   assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
 
@@ -909,22 +942,25 @@
     jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
                                                       resolved_method->name(),
                                                       resolved_method->signature()));
-    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
+  return resolved_method;
 }
 
 
-void LinkResolver::resolve_special_call(CallInfo& result, KlassHandle resolved_klass, Symbol* method_name,
-                                        Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
-  methodHandle resolved_method;
-  linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
-  runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
+void LinkResolver::resolve_special_call(CallInfo& result,
+                                        const LinkInfo& link_info,
+                                        TRAPS) {
+  methodHandle resolved_method = linktime_resolve_special_method(link_info, CHECK);
+  runtime_resolve_special_method(result, resolved_method,
+                                 link_info.resolved_klass(),
+                                 link_info.current_klass(),
+                                 link_info.check_access(), CHECK);
 }
 
 // throws linktime exceptions
-void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method, KlassHandle resolved_klass,
-                                                   Symbol* method_name, Symbol* method_signature,
-                                                   KlassHandle current_klass, bool check_access, TRAPS) {
+methodHandle LinkResolver::linktime_resolve_special_method(const LinkInfo& link_info,
+                                                           TRAPS) {
 
   // Invokespecial is called for multiple special reasons:
   // <init>
@@ -932,11 +968,13 @@
   // superclass.method, which can also resolve to a default method
   // and the selected method is recalculated relative to the direct superclass
   // superinterface.method, which explicitly does not check shadowing
+  KlassHandle resolved_klass = link_info.resolved_klass();
+  methodHandle resolved_method;
 
   if (!resolved_klass->is_interface()) {
-    resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
+    resolved_method = resolve_method(link_info, /*require_methodref*/false, CHECK_NULL);
   } else {
-    resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
+    resolved_method = resolve_interface_method(link_info, /*nostatics*/true, CHECK_NULL);
   }
 
   // check if method name is <init>, that it is found in same klass as static type
@@ -951,10 +989,11 @@
       resolved_method->name()->as_C_string(),
       resolved_method->signature()->as_C_string()
     );
-    return;
+    return NULL;
   }
 
   // check if invokespecial's interface method reference is in an indirect superinterface
+  KlassHandle current_klass = link_info.current_klass();
   if (!current_klass.is_null() && resolved_klass->is_interface()) {
     Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ?
                                   current_klass() :
@@ -973,7 +1012,7 @@
                                                          resolved_method->name(),
                                                          resolved_method->signature()),
                    current_klass->external_name());
-      THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+      THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
     }
   }
 
@@ -984,35 +1023,26 @@
     jio_snprintf(buf, sizeof(buf),
                  "Expecting non-static method %s",
                  Method::name_and_sig_as_C_string(resolved_klass(),
-                                                         resolved_method->name(),
-                                                         resolved_method->signature()));
-    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+                                                  resolved_method->name(),
+                                                  resolved_method->signature()));
+    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
   if (TraceItables && Verbose) {
-    ResourceMark rm(THREAD);
-    tty->print("invokespecial resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
-                (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
-                (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
-                Method::name_and_sig_as_C_string(resolved_klass(),
-                                                 resolved_method->name(),
-                                                 resolved_method->signature()),
-                resolved_method->method_holder()->internal_name()
-               );
-    resolved_method->access_flags().print_on(tty);
-    if (resolved_method->is_default_method()) {
-      tty->print("default ");
-    }
-    if (resolved_method->is_overpass()) {
-      tty->print("overpass");
-    }
+    trace_method_resolution("invokespecial resolved method: caller-class:",
+                            current_klass, resolved_klass, resolved_method);
     tty->cr();
   }
+
+  return resolved_method;
 }
 
 // throws runtime exceptions
-void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
-                                                  KlassHandle current_klass, bool check_access, TRAPS) {
+void LinkResolver::runtime_resolve_special_method(CallInfo& result,
+                                                  const methodHandle& resolved_method,
+                                                  KlassHandle resolved_klass,
+                                                  KlassHandle current_klass,
+                                                  bool check_access, TRAPS) {
 
   // resolved method is selected method unless we have an old-style lookup
   // for a superclass method
@@ -1037,7 +1067,7 @@
         resolved_method->name() != vmSymbols::object_initializer_name()) {
       // Lookup super method
       KlassHandle super_klass(THREAD, current_klass->super());
-      lookup_instance_method_in_klasses(sel_method, super_klass,
+      sel_method = lookup_instance_method_in_klasses(super_klass,
                            resolved_method->name(),
                            resolved_method->signature(), CHECK);
       // check if found
@@ -1066,26 +1096,13 @@
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
               Method::name_and_sig_as_C_string(resolved_klass(),
-                                                      sel_method->name(),
-                                                      sel_method->signature()));
+                                               sel_method->name(),
+                                               sel_method->signature()));
   }
 
   if (TraceItables && Verbose) {
-    ResourceMark rm(THREAD);
-    tty->print("invokespecial selected method: resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
-                 (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
-                 Method::name_and_sig_as_C_string(resolved_klass(),
-                                                  sel_method->name(),
-                                                  sel_method->signature()),
-                 sel_method->method_holder()->internal_name()
-                );
-    sel_method->access_flags().print_on(tty);
-    if (sel_method->is_default_method()) {
-      tty->print("default ");
-    }
-    if (sel_method->is_overpass()) {
-      tty->print("overpass");
-    }
+    trace_method_resolution("invokespecial selected method: resolved-class:",
+                            resolved_klass, resolved_klass, sel_method);
     tty->cr();
   }
 
@@ -1093,25 +1110,29 @@
   result.set_static(resolved_klass, sel_method, CHECK);
 }
 
-void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass, KlassHandle resolved_klass,
-                                        Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
-                                        bool check_access, bool check_null_and_abstract, TRAPS) {
-  methodHandle resolved_method;
-  linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
-  runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
+void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass,
+                                        const LinkInfo& link_info,
+                                        bool check_null_and_abstract, TRAPS) {
+  methodHandle resolved_method = linktime_resolve_virtual_method(link_info, CHECK);
+  runtime_resolve_virtual_method(result, resolved_method,
+                                 link_info.resolved_klass(),
+                                 recv, receiver_klass,
+                                 check_null_and_abstract, CHECK);
 }
 
 // throws linktime exceptions
-void LinkResolver::linktime_resolve_virtual_method(methodHandle &resolved_method, KlassHandle resolved_klass,
-                                                   Symbol* method_name, Symbol* method_signature,
-                                                   KlassHandle current_klass, bool check_access, TRAPS) {
+methodHandle LinkResolver::linktime_resolve_virtual_method(const LinkInfo& link_info,
+                                                           TRAPS) {
   // normal method resolution
-  resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
+  methodHandle resolved_method = resolve_method(link_info, /*require_methodref*/true, CHECK_NULL);
 
   assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
 
   // check if private interface method
+  KlassHandle resolved_klass = link_info.resolved_klass();
+  KlassHandle current_klass = link_info.current_klass();
+
   if (resolved_klass->is_interface() && resolved_method->is_private()) {
     ResourceMark rm(THREAD);
     char buf[200];
@@ -1120,7 +1141,7 @@
                                                   resolved_method->name(),
                                                   resolved_method->signature()),
                    (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
-    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
   // check if not static
@@ -1130,33 +1151,21 @@
     jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
                                                                                                              resolved_method->name(),
                                                                                                              resolved_method->signature()));
-    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+    THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
   }
 
   if (PrintVtables && Verbose) {
-    ResourceMark rm(THREAD);
-    tty->print("invokevirtual resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
-                   (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
-                   (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
-                   Method::name_and_sig_as_C_string(resolved_klass(),
-                                                    resolved_method->name(),
-                                                    resolved_method->signature()),
-                   resolved_method->method_holder()->internal_name()
-                  );
-    resolved_method->access_flags().print_on(tty);
-    if (resolved_method->is_default_method()) {
-      tty->print("default ");
-    }
-    if (resolved_method->is_overpass()) {
-      tty->print("overpass");
-    }
+    trace_method_resolution("invokevirtual resolved method: caller-class:",
+                            current_klass, resolved_klass, resolved_method);
     tty->cr();
   }
+
+  return resolved_method;
 }
 
 // throws runtime exceptions
 void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
-                                                  methodHandle resolved_method,
+                                                  const methodHandle& resolved_method,
                                                   KlassHandle resolved_klass,
                                                   Handle recv,
                                                   KlassHandle recv_klass,
@@ -1227,50 +1236,40 @@
   }
 
   if (PrintVtables && Verbose) {
-    ResourceMark rm(THREAD);
-    tty->print("invokevirtual selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, vtable_index:%d, access_flags: ",
-                   (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
-                   (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
-                   Method::name_and_sig_as_C_string(resolved_klass(),
-                                                    resolved_method->name(),
-                                                    resolved_method->signature()),
-                   selected_method->method_holder()->internal_name(),
-                   vtable_index
-                  );
-    selected_method->access_flags().print_on(tty);
-    if (selected_method->is_default_method()) {
-      tty->print("default ");
-    }
-    if (selected_method->is_overpass()) {
-      tty->print("overpass");
-    }
-    tty->cr();
+    trace_method_resolution("invokevirtual selected method: receiver-class:",
+                            recv_klass, resolved_klass, selected_method);
+    tty->print_cr("vtable_index:%d", vtable_index);
   }
   // setup result
   result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
 }
 
-void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass,
-                                          Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
-                                          bool check_access, bool check_null_and_abstract, TRAPS) {
-  methodHandle resolved_method;
-  linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
-  runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
+void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass,
+                                          const LinkInfo& link_info,
+                                          bool check_null_and_abstract, TRAPS) {
+  // throws linktime exceptions
+  methodHandle resolved_method = linktime_resolve_interface_method(link_info, CHECK);
+  runtime_resolve_interface_method(result, resolved_method,link_info.resolved_klass(),
+                                   recv, recv_klass, check_null_and_abstract, CHECK);
 }
 
-// throws linktime exceptions
-void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name,
-                                                     Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
+methodHandle LinkResolver::linktime_resolve_interface_method(const LinkInfo& link_info,
+                                                             TRAPS) {
   // normal interface method resolution
-  resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
-
+  methodHandle resolved_method = resolve_interface_method(link_info, true, CHECK_NULL);
   assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
   assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
+
+  return resolved_method;
 }
 
 // throws runtime exceptions
-void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
-                                                    Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
+void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
+                                                    const methodHandle& resolved_method,
+                                                    KlassHandle resolved_klass,
+                                                    Handle recv,
+                                                    KlassHandle recv_klass,
+                                                    bool check_null_and_abstract, TRAPS) {
   // check if receiver exists
   if (check_null_and_abstract && recv.is_null()) {
     THROW(vmSymbols::java_lang_NullPointerException());
@@ -1298,12 +1297,11 @@
   }
 
   // do lookup based on receiver klass
-  methodHandle sel_method;
   // This search must match the linktime preparation search for itable initialization
   // to correctly enforce loader constraints for interface method inheritance
-  lookup_instance_method_in_klasses(sel_method, recv_klass,
-            resolved_method->name(),
-            resolved_method->signature(), CHECK);
+  methodHandle sel_method = lookup_instance_method_in_klasses(recv_klass,
+                                                  resolved_method->name(),
+                                                  resolved_method->signature(), CHECK);
   if (sel_method.is_null() && !check_null_and_abstract) {
     // In theory this is a harmless placeholder value, but
     // in practice leaving in null affects the nsk default method tests.
@@ -1314,9 +1312,9 @@
   if (sel_method.is_null()) {
     ResourceMark rm(THREAD);
     THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
-              Method::name_and_sig_as_C_string(recv_klass(),
-                                                      resolved_method->name(),
-                                                      resolved_method->signature()));
+                   Method::name_and_sig_as_C_string(recv_klass(),
+                                                    resolved_method->name(),
+                                                    resolved_method->signature()));
   }
   // check access
   // Throw Illegal Access Error if sel_method is not public.
@@ -1337,22 +1335,8 @@
   }
 
   if (TraceItables && Verbose) {
-    ResourceMark rm(THREAD);
-    tty->print("invokeinterface selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
-                   (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
-                   (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
-                   Method::name_and_sig_as_C_string(resolved_klass(),
-                                                    resolved_method->name(),
-                                                    resolved_method->signature()),
-                   sel_method->method_holder()->internal_name()
-                  );
-    sel_method->access_flags().print_on(tty);
-    if (sel_method->is_default_method()) {
-      tty->print("default ");
-    }
-    if (sel_method->is_overpass()) {
-      tty->print("overpass");
-    }
+    trace_method_resolution("invokeinterface selected method: receiver-class",
+                            recv_klass, resolved_klass, sel_method);
     tty->cr();
   }
   // setup result
@@ -1368,14 +1352,9 @@
 
 
 methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
-                                                 KlassHandle resolved_klass,
-                                                 Symbol* method_name,
-                                                 Symbol* method_signature,
-                                                 KlassHandle current_klass,
-                                                 bool check_access) {
+                                                 const LinkInfo& link_info) {
   EXCEPTION_MARK;
-  methodHandle method_result;
-  linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
+  methodHandle method_result = linktime_resolve_interface_method(link_info, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     CLEAR_PENDING_EXCEPTION;
     return methodHandle();
@@ -1385,14 +1364,9 @@
 }
 
 methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
-                                                 KlassHandle resolved_klass,
-                                                 Symbol* method_name,
-                                                 Symbol* method_signature,
-                                                 KlassHandle current_klass,
-                                                 bool check_access) {
+                                                 const LinkInfo& link_info) {
   EXCEPTION_MARK;
-  methodHandle method_result;
-  linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
+  methodHandle method_result = linktime_resolve_virtual_method(link_info, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     CLEAR_PENDING_EXCEPTION;
     return methodHandle();
@@ -1403,14 +1377,10 @@
 
 methodHandle LinkResolver::resolve_virtual_call_or_null(
                                                  KlassHandle receiver_klass,
-                                                 KlassHandle resolved_klass,
-                                                 Symbol* name,
-                                                 Symbol* signature,
-                                                 KlassHandle current_klass,
-                                                 bool check_access) {
+                                                 const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
-  resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, check_access, false, THREAD);
+  resolve_virtual_call(info, Handle(), receiver_klass, link_info, false, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     CLEAR_PENDING_EXCEPTION;
     return methodHandle();
@@ -1420,14 +1390,10 @@
 
 methodHandle LinkResolver::resolve_interface_call_or_null(
                                                  KlassHandle receiver_klass,
-                                                 KlassHandle resolved_klass,
-                                                 Symbol* name,
-                                                 Symbol* signature,
-                                                 KlassHandle current_klass,
-                                                 bool check_access) {
+                                                 const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
-  resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, check_access, false, THREAD);
+  resolve_interface_call(info, Handle(), receiver_klass, link_info, false, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     CLEAR_PENDING_EXCEPTION;
     return methodHandle();
@@ -1435,15 +1401,12 @@
   return info.selected_method();
 }
 
-int LinkResolver::resolve_virtual_vtable_index(
-                                               KlassHandle receiver_klass,
-                                               KlassHandle resolved_klass,
-                                               Symbol* name,
-                                               Symbol* signature,
-                                               KlassHandle current_klass) {
+int LinkResolver::resolve_virtual_vtable_index(KlassHandle receiver_klass,
+                                               const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
-  resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
+  resolve_virtual_call(info, Handle(), receiver_klass, link_info,
+                       /*check_null_or_abstract*/false, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     CLEAR_PENDING_EXCEPTION;
     return Method::invalid_vtable_index;
@@ -1451,15 +1414,10 @@
   return info.vtable_index();
 }
 
-methodHandle LinkResolver::resolve_static_call_or_null(
-                                                  KlassHandle resolved_klass,
-                                                  Symbol* name,
-                                                  Symbol* signature,
-                                                  KlassHandle current_klass,
-                                                  bool check_access) {
+methodHandle LinkResolver::resolve_static_call_or_null(const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
-  resolve_static_call(info, resolved_klass, name, signature, current_klass, check_access, false, THREAD);
+  resolve_static_call(info, link_info, /*initialize_class*/false, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     CLEAR_PENDING_EXCEPTION;
     return methodHandle();
@@ -1467,15 +1425,10 @@
   return info.selected_method();
 }
 
-methodHandle LinkResolver::resolve_special_call_or_null(
-                                                  KlassHandle resolved_klass,
-                                                  Symbol* name,
-                                                  Symbol* signature,
-                                                  KlassHandle current_klass,
-                                                  bool check_access) {
+methodHandle LinkResolver::resolve_special_call_or_null(const LinkInfo& link_info) {
   EXCEPTION_MARK;
   CallInfo info;
-  resolve_special_call(info, resolved_klass, name, signature, current_klass, check_access, THREAD);
+  resolve_special_call(info, link_info, THREAD);
   if (HAS_PENDING_EXCEPTION) {
     CLEAR_PENDING_EXCEPTION;
     return methodHandle();
@@ -1500,35 +1453,15 @@
   return;
 }
 
-void LinkResolver::resolve_pool(KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature,
-                                KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
-   // resolve klass
-  resolve_klass(resolved_klass, pool, index, CHECK);
-
-  // Get name, signature, and static klass
-  method_name      = pool->name_ref_at(index);
-  method_signature = pool->signature_ref_at(index);
-  current_klass    = KlassHandle(THREAD, pool->pool_holder());
-}
-
-
 void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
-  KlassHandle  resolved_klass;
-  Symbol* method_name = NULL;
-  Symbol* method_signature = NULL;
-  KlassHandle  current_klass;
-  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
-  resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+  LinkInfo link_info(pool, index, CHECK);
+  resolve_static_call(result, link_info, /*initialize_class*/true, CHECK);
 }
 
 
 void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
-  KlassHandle  resolved_klass;
-  Symbol* method_name = NULL;
-  Symbol* method_signature = NULL;
-  KlassHandle  current_klass;
-  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
-  resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
+  LinkInfo link_info(pool, index, CHECK);
+  resolve_special_call(result, link_info, CHECK);
 }
 
 
@@ -1536,54 +1469,40 @@
                                           constantPoolHandle pool, int index,
                                           TRAPS) {
 
-  KlassHandle  resolved_klass;
-  Symbol* method_name = NULL;
-  Symbol* method_signature = NULL;
-  KlassHandle  current_klass;
-  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
+  LinkInfo link_info(pool, index, CHECK);
   KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
-  resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+  resolve_virtual_call(result, recv, recvrKlass, link_info, /*check_null_or_abstract*/true, CHECK);
 }
 
 
 void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
-  KlassHandle  resolved_klass;
-  Symbol* method_name = NULL;
-  Symbol* method_signature = NULL;
-  KlassHandle  current_klass;
-  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
+  LinkInfo link_info(pool, index, CHECK);
   KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
-  resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+  resolve_interface_call(result, recv, recvrKlass, link_info, true, CHECK);
 }
 
 
 void LinkResolver::resolve_invokehandle(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
   // This guy is reached from InterpreterRuntime::resolve_invokehandle.
-  KlassHandle  resolved_klass;
-  Symbol* method_name = NULL;
-  Symbol* method_signature = NULL;
-  KlassHandle  current_klass;
-  resolve_pool(resolved_klass, method_name,  method_signature, current_klass, pool, index, CHECK);
+  LinkInfo link_info(pool, index, CHECK);
   if (TraceMethodHandles) {
     ResourceMark rm(THREAD);
-    tty->print_cr("resolve_invokehandle %s %s", method_name->as_C_string(), method_signature->as_C_string());
+    tty->print_cr("resolve_invokehandle %s %s", link_info.name()->as_C_string(),
+                  link_info.signature()->as_C_string());
   }
-  resolve_handle_call(result, resolved_klass, method_name, method_signature, current_klass, CHECK);
+  resolve_handle_call(result, link_info, CHECK);
 }
 
-void LinkResolver::resolve_handle_call(CallInfo& result, KlassHandle resolved_klass,
-                                       Symbol* method_name, Symbol* method_signature,
-                                       KlassHandle current_klass,
+void LinkResolver::resolve_handle_call(CallInfo& result,
+                                       const LinkInfo& link_info,
                                        TRAPS) {
   // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
-  assert(resolved_klass() == SystemDictionary::MethodHandle_klass(), "");
-  assert(MethodHandles::is_signature_polymorphic_name(method_name), "");
-  methodHandle resolved_method;
+  assert(link_info.resolved_klass()() == SystemDictionary::MethodHandle_klass(), "");
+  assert(MethodHandles::is_signature_polymorphic_name(link_info.name()), "");
   Handle       resolved_appendix;
   Handle       resolved_method_type;
-  lookup_polymorphic_method(resolved_method, resolved_klass,
-                            method_name, method_signature,
-                            current_klass, &resolved_appendix, &resolved_method_type, CHECK);
+  methodHandle resolved_method = lookup_polymorphic_method(link_info,
+                                       &resolved_appendix, &resolved_method_type, CHECK);
   result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK);
 }
 
@@ -1609,7 +1528,6 @@
 }
 
 void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
-  //resolve_pool(<resolved_klass>, method_name, method_signature, current_klass, pool, index, CHECK);
   Symbol* method_name       = pool->name_ref_at(index);
   Symbol* method_signature  = pool->signature_ref_at(index);
   KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
@@ -1667,19 +1585,27 @@
   wrap_invokedynamic_exception(CHECK);
 }
 
-//------------------------------------------------------------------------------------------------------------------------
 #ifndef PRODUCT
-
-void CallInfo::print() {
+void LinkResolver::trace_method_resolution(const char* prefix,
+                                           KlassHandle klass,
+                                           KlassHandle resolved_klass,
+                                           const methodHandle& method) {
   ResourceMark rm;
-  const char* kindstr = "unknown";
-  switch (_call_kind) {
-  case direct_call: kindstr = "direct"; break;
-  case vtable_call: kindstr = "vtable"; break;
-  case itable_call: kindstr = "itable"; break;
+  tty->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
+             prefix,
+             (klass.is_null() ? "<NULL>" : klass->internal_name()),
+             (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
+             Method::name_and_sig_as_C_string(resolved_klass(),
+                                              method->name(),
+                                              method->signature()),
+             method->method_holder()->internal_name()
+             );
+  method->access_flags().print_on(tty);
+  if (method->is_default_method()) {
+    tty->print("default ");
   }
-  tty->print_cr("Call %s@%d %s", kindstr, _call_index,
-                _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
+  if (method->is_overpass()) {
+    tty->print("overpass ");
+  }
 }
-
-#endif
+#endif // PRODUCT
--- a/hotspot/src/share/vm/interpreter/linkResolver.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -36,7 +36,7 @@
 // that method. If the info is invalid, the link has not been resolved
 // successfully.
 
-class CallInfo VALUE_OBJ_CLASS_SPEC {
+class CallInfo : public StackObj {
  public:
   // Ways that a method call might be selected (or not) based on receiver type.
   // Note that an invokevirtual instruction might be linked with no_dispatch,
@@ -58,11 +58,22 @@
   Handle       _resolved_appendix;      // extra argument in constant pool (if CPCE::has_appendix)
   Handle       _resolved_method_type;   // MethodType (for invokedynamic and invokehandle call sites)
 
-  void         set_static(   KlassHandle resolved_klass,                             methodHandle resolved_method                                                       , TRAPS);
-  void         set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int itable_index       , TRAPS);
-  void         set_virtual(  KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index       , TRAPS);
-  void         set_handle(                                                           methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS);
-  void         set_common(   KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, CallKind kind, int index, TRAPS);
+  void set_static(KlassHandle resolved_klass, const methodHandle& resolved_method, TRAPS);
+  void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass,
+                     const methodHandle& resolved_method,
+                     const methodHandle& selected_method,
+                     int itable_index, TRAPS);
+  void set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass,
+                   const methodHandle& resolved_method,
+                   const methodHandle& selected_method,
+                   int vtable_index, TRAPS);
+  void set_handle(const methodHandle& resolved_method,
+                  Handle resolved_appendix, Handle resolved_method_type, TRAPS);
+  void set_common(KlassHandle resolved_klass, KlassHandle selected_klass,
+                  const methodHandle& resolved_method,
+                  const methodHandle& selected_method,
+                  CallKind kind,
+                  int index, TRAPS);
 
   friend class LinkResolver;
 
@@ -113,6 +124,37 @@
   void         print()  PRODUCT_RETURN;
 };
 
+
+// Condensed information from constant pool to use to resolve the method or field.
+//   resolved_klass = specified class (i.e., static receiver class)
+//   current_klass  = sending method holder (i.e., class containing the method
+//                    containing the call being resolved)
+class LinkInfo : public StackObj {
+  Symbol*     _name;            // extracted from JVM_CONSTANT_NameAndType
+  Symbol*     _signature;
+  KlassHandle _resolved_klass;  // class that the constant pool entry points to
+  KlassHandle _current_klass;   // class that owns the constant pool
+  bool        _check_access;
+ public:
+  LinkInfo(constantPoolHandle pool, int index, TRAPS);
+  // Condensed information from other call sites within the vm.
+  LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
+           KlassHandle current_klass, bool check_access = true) :
+    _resolved_klass(resolved_klass),
+    _name(name), _signature(signature), _current_klass(current_klass),
+    _check_access(check_access) {}
+
+  // accessors
+  Symbol* name() const               { return _name; }
+  Symbol* signature() const          { return _signature; }
+  KlassHandle resolved_klass() const { return _resolved_klass; }
+  KlassHandle current_klass() const  { return _current_klass; }
+  bool check_access() const          { return _check_access; }
+  char* method_string() const;
+
+  void         print()  PRODUCT_RETURN;
+};
+
 // Link information for getfield/putfield & getstatic/putstatic bytecodes
 // is represented using a fieldDescriptor.
 
@@ -124,85 +166,136 @@
   friend class klassItable;
 
  private:
-  static void lookup_method_in_klasses          (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS);
-  static void lookup_instance_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
-  static void lookup_method_in_interfaces       (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
-  static void lookup_polymorphic_method         (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature,
-                                                 KlassHandle current_klass, Handle *appendix_result_or_null, Handle *method_type_result, TRAPS);
+
+  static methodHandle lookup_method_in_klasses(const LinkInfo& link_info,
+                                               bool checkpolymorphism,
+                                               bool in_imethod_resolve, TRAPS);
+  static methodHandle lookup_method_in_interfaces(const LinkInfo& link_info, TRAPS);
+  static methodHandle lookup_polymorphic_method(const LinkInfo& link_info,
+                                                Handle *appendix_result_or_null,
+                                                Handle *method_type_result, TRAPS);
+  // Not Linktime so doesn't take LinkInfo
+  static methodHandle lookup_instance_method_in_klasses (
+                                       KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
 
-  static void resolve_klass           (KlassHandle& result, constantPoolHandle  pool, int index, TRAPS);
+  // Similar loader constraint checking functions that throw
+  // LinkageError with descriptive message.
+  static void check_method_loader_constraints(const LinkInfo& link_info,
+                                              const methodHandle& resolved_method,
+                                              const char* method_type, TRAPS);
+  static void check_field_loader_constraints(Symbol* field, Symbol* sig,
+                                             KlassHandle current_klass,
+                                             KlassHandle sel_klass, TRAPS);
 
-  static void resolve_pool  (KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature, KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS);
+  static methodHandle resolve_interface_method(const LinkInfo& link_info, bool nostatics, TRAPS);
+  static methodHandle resolve_method          (const LinkInfo& link_info, bool require_methodref, TRAPS);
 
-  static void resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool nostatics, TRAPS);
-  static void resolve_method          (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool require_methodref, TRAPS);
+  static methodHandle linktime_resolve_static_method    (const LinkInfo& link_info, TRAPS);
+  static methodHandle linktime_resolve_special_method   (const LinkInfo& link_info, TRAPS);
+  static methodHandle linktime_resolve_virtual_method   (const LinkInfo& link_info, TRAPS);
+  static methodHandle linktime_resolve_interface_method (const LinkInfo& link_info, TRAPS);
 
-  static void linktime_resolve_static_method    (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
-  static void linktime_resolve_special_method   (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
-  static void linktime_resolve_virtual_method   (methodHandle &resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature,KlassHandle current_klass, bool check_access, TRAPS);
-  static void linktime_resolve_interface_method (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
+  static void runtime_resolve_special_method    (CallInfo& result,
+                                                 const methodHandle& resolved_method,
+                                                 KlassHandle resolved_klass,
+                                                 KlassHandle current_klass,
+                                                 bool check_access, TRAPS);
+  static void runtime_resolve_virtual_method    (CallInfo& result,
+                                                 const methodHandle& resolved_method,
+                                                 KlassHandle resolved_klass,
+                                                 Handle recv,
+                                                 KlassHandle recv_klass,
+                                                 bool check_null_and_abstract, TRAPS);
+  static void runtime_resolve_interface_method  (CallInfo& result,
+                                                 const methodHandle& resolved_method,
+                                                 KlassHandle resolved_klass,
+                                                 Handle recv,
+                                                 KlassHandle recv_klass,
+                                                 bool check_null_and_abstract, TRAPS);
 
-  static void runtime_resolve_special_method    (CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass, KlassHandle current_klass, bool check_access, TRAPS);
-  static void runtime_resolve_virtual_method    (CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass, Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS);
-  static void runtime_resolve_interface_method  (CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass, Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS);
+  static void check_field_accessability(KlassHandle ref_klass,
+                                        KlassHandle resolved_klass,
+                                        KlassHandle sel_klass,
+                                        const fieldDescriptor& fd, TRAPS);
+  static void check_method_accessability(KlassHandle ref_klass,
+                                         KlassHandle resolved_klass,
+                                         KlassHandle sel_klass,
+                                         const methodHandle& sel_method, TRAPS);
 
-  static void check_field_accessability   (KlassHandle ref_klass, KlassHandle resolved_klass, KlassHandle sel_klass, fieldDescriptor& fd, TRAPS);
-  static void check_method_accessability  (KlassHandle ref_klass, KlassHandle resolved_klass, KlassHandle sel_klass, methodHandle sel_method, TRAPS);
-
+  // runtime resolving from constant pool
+  static void resolve_invokestatic   (CallInfo& result,
+                                      constantPoolHandle pool, int index, TRAPS);
+  static void resolve_invokespecial  (CallInfo& result,
+                                      constantPoolHandle pool, int index, TRAPS);
+  static void resolve_invokevirtual  (CallInfo& result, Handle recv,
+                                      constantPoolHandle pool, int index, TRAPS);
+  static void resolve_invokeinterface(CallInfo& result, Handle recv,
+                                      constantPoolHandle pool, int index, TRAPS);
+  static void resolve_invokedynamic  (CallInfo& result,
+                                      constantPoolHandle pool, int index, TRAPS);
+  static void resolve_invokehandle   (CallInfo& result,
+                                      constantPoolHandle pool, int index, TRAPS);
  public:
   // constant pool resolving
   static void check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS);
 
-  // static resolving calls (will not run any Java code); used only from Bytecode_invoke::static_target
-  static void resolve_method_statically(methodHandle& method_result, KlassHandle& klass_result,
-                                        Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS);
+  // static resolving calls (will not run any Java code);
+  // used only from Bytecode_invoke::static_target
+  static methodHandle resolve_method_statically(Bytecodes::Code code,
+                                                constantPoolHandle pool,
+                                                int index, TRAPS);
 
-  // runtime/static resolving for fields
-  static void resolve_field_access(fieldDescriptor& result, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS);
-  static void resolve_field(fieldDescriptor& result, KlassHandle resolved_klass, Symbol* field_name, Symbol* field_signature,
-                            KlassHandle current_klass, Bytecodes::Code access_kind, bool check_access, bool initialize_class, TRAPS);
-
-  // source of access_kind codes:
-  static Bytecodes::Code field_access_kind(bool is_static, bool is_put) {
-    return (is_static
-            ? (is_put ? Bytecodes::_putstatic : Bytecodes::_getstatic)
-            : (is_put ? Bytecodes::_putfield  : Bytecodes::_getfield ));
-  }
+  static void resolve_field_access(fieldDescriptor& result,
+                                   constantPoolHandle pool,
+                                   int index, Bytecodes::Code byte, TRAPS);
+  static void resolve_field(fieldDescriptor& result, const LinkInfo& link_info,
+                            Bytecodes::Code access_kind,
+                            bool initialize_class, TRAPS);
 
-  // runtime resolving:
-  //   resolved_klass = specified class (i.e., static receiver class)
-  //   current_klass  = sending method holder (i.e., class containing the method containing the call being resolved)
-  static void resolve_static_call   (CallInfo& result,              KlassHandle& resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool initialize_klass, TRAPS);
-  static void resolve_special_call  (CallInfo& result,              KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
-  static void resolve_virtual_call  (CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS);
-  static void resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS);
-  static void resolve_handle_call   (CallInfo& result,                                      KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, TRAPS);
-  static void resolve_dynamic_call  (CallInfo& result,                                      Handle bootstrap_specifier, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, TRAPS);
+  static void resolve_static_call   (CallInfo& result,
+                                     const LinkInfo& link_info,
+                                     bool initialize_klass, TRAPS);
+  static void resolve_special_call  (CallInfo& result,
+                                     const LinkInfo& link_info,
+                                     TRAPS);
+  static void resolve_virtual_call  (CallInfo& result, Handle recv, KlassHandle recv_klass,
+                                     const LinkInfo& link_info,
+                                     bool check_null_and_abstract, TRAPS);
+  static void resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass,
+                                     const LinkInfo& link_info,
+                                     bool check_null_and_abstract, TRAPS);
+  static void resolve_handle_call   (CallInfo& result,
+                                     const LinkInfo& link_info, TRAPS);
+  static void resolve_dynamic_call  (CallInfo& result, Handle bootstrap_specifier,
+                                     Symbol* method_name, Symbol* method_signature,
+                                     KlassHandle current_klass, TRAPS);
 
-  // same as above for compile-time resolution; but returns null handle instead of throwing an exception on error
-  // also, does not initialize klass (i.e., no side effects)
-  static methodHandle resolve_virtual_call_or_null  (KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access = true);
-  static methodHandle resolve_interface_call_or_null(KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access = true);
-  static methodHandle resolve_static_call_or_null   (KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access = true);
-  static methodHandle resolve_special_call_or_null  (KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access = true);
-  static int vtable_index_of_interface_method(KlassHandle klass, methodHandle resolved_method);
+  // same as above for compile-time resolution; but returns null handle instead of throwing
+  // an exception on error also, does not initialize klass (i.e., no side effects)
+  static methodHandle resolve_virtual_call_or_null  (KlassHandle receiver_klass,
+                                                     const LinkInfo& link_info);
+  static methodHandle resolve_interface_call_or_null(KlassHandle receiver_klass,
+                                                     const LinkInfo& link_info);
+  static methodHandle resolve_static_call_or_null   (const LinkInfo& link_info);
+  static methodHandle resolve_special_call_or_null  (const LinkInfo& link_info);
+
+  static int vtable_index_of_interface_method(KlassHandle klass, const methodHandle& resolved_method);
 
   // same as above for compile-time resolution; returns vtable_index if current_klass if linked
-  static int resolve_virtual_vtable_index  (KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass);
+  static int resolve_virtual_vtable_index  (KlassHandle receiver_klass,
+                                            const LinkInfo& link_info);
 
   // static resolving for compiler (does not throw exceptions, returns null handle if unsuccessful)
-  static methodHandle linktime_resolve_virtual_method_or_null  (KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access);
-  static methodHandle linktime_resolve_interface_method_or_null(KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access);
+  static methodHandle linktime_resolve_virtual_method_or_null  (const LinkInfo& link_info);
+  static methodHandle linktime_resolve_interface_method_or_null(const LinkInfo& link_info);
 
   // runtime resolving from constant pool
-  static void resolve_invokestatic   (CallInfo& result,              constantPoolHandle pool, int index, TRAPS);
-  static void resolve_invokespecial  (CallInfo& result,              constantPoolHandle pool, int index, TRAPS);
-  static void resolve_invokevirtual  (CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS);
-  static void resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS);
-  static void resolve_invokedynamic  (CallInfo& result,              constantPoolHandle pool, int index, TRAPS);
-  static void resolve_invokehandle   (CallInfo& result,              constantPoolHandle pool, int index, TRAPS);
-
-  static void resolve_invoke         (CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS);
+  static void resolve_invoke(CallInfo& result, Handle recv,
+                             constantPoolHandle pool, int index,
+                             Bytecodes::Code byte, TRAPS);
+ private:
+  static void trace_method_resolution(const char* prefix, KlassHandle klass,
+                                      KlassHandle resolved_klass,
+                                      const methodHandle& method) PRODUCT_RETURN;
 };
-
 #endif // SHARE_VM_INTERPRETER_LINKRESOLVER_HPP
--- a/hotspot/src/share/vm/memory/metaspace.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/memory/metaspace.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -614,8 +614,7 @@
   Metachunk* _chunks_in_use[NumberOfInUseLists];
   Metachunk* _current_chunk;
 
-  // Number of small chunks to allocate to a manager
-  // If class space manager, small chunks are unlimited
+  // Maximum number of small chunks to allocate to a SpaceManager
   static uint const _small_chunk_limit;
 
   // Sum of all space in allocated chunks
@@ -730,6 +729,8 @@
   // Block allocation and deallocation.
   // Allocates a block from the current chunk
   MetaWord* allocate(size_t word_size);
+  // Allocates a block from a small chunk
+  MetaWord* get_small_chunk_and_allocate(size_t word_size);
 
   // Helper for allocations
   MetaWord* allocate_work(size_t word_size);
@@ -2011,9 +2012,8 @@
 size_t SpaceManager::calc_chunk_size(size_t word_size) {
 
   // Decide between a small chunk and a medium chunk.  Up to
-  // _small_chunk_limit small chunks can be allocated but
-  // once a medium chunk has been allocated, no more small
-  // chunks will be allocated.
+  // _small_chunk_limit small chunks can be allocated.
+  // After that a medium chunk is preferred.
   size_t chunk_word_size;
   if (chunks_in_use(MediumIndex) == NULL &&
       sum_count_in_chunks_in_use(SmallIndex) < _small_chunk_limit) {
@@ -2081,7 +2081,7 @@
                             word_size, words_used, words_left);
   }
 
-  // Get another chunk out of the virtual space
+  // Get another chunk
   size_t grow_chunks_by_words = calc_chunk_size(word_size);
   Metachunk* next = get_new_chunk(word_size, grow_chunks_by_words);
 
@@ -2412,6 +2412,43 @@
   return next;
 }
 
+/*
+ * The policy is to allocate up to _small_chunk_limit small chunks
+ * after which only medium chunks are allocated.  This is done to
+ * reduce fragmentation.  In some cases, this can result in a lot
+ * of small chunks being allocated to the point where it's not
+ * possible to expand.  If this happens, there may be no medium chunks
+ * available and OOME would be thrown.  Instead of doing that,
+ * if the allocation request size fits in a small chunk, an attempt
+ * will be made to allocate a small chunk.
+ */
+MetaWord* SpaceManager::get_small_chunk_and_allocate(size_t word_size) {
+  if (word_size + Metachunk::overhead() > small_chunk_size()) {
+    return NULL;
+  }
+
+  MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag);
+  MutexLockerEx cl1(expand_lock(), Mutex::_no_safepoint_check_flag);
+
+  Metachunk* chunk = chunk_manager()->chunk_freelist_allocate(small_chunk_size());
+
+  MetaWord* mem = NULL;
+
+  if (chunk != NULL) {
+    // Add chunk to the in-use chunk list and do an allocation from it.
+    // Add to this manager's list of chunks in use.
+    add_chunk(chunk, false);
+    mem = chunk->allocate(word_size);
+
+    inc_used_metrics(word_size);
+
+    // Track metaspace memory usage statistic.
+    track_metaspace_memory_usage();
+  }
+
+  return mem;
+}
+
 MetaWord* SpaceManager::allocate(size_t word_size) {
   MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag);
 
@@ -3560,7 +3597,18 @@
   }
 
   if (result == NULL) {
-    report_metadata_oome(loader_data, word_size, type, mdtype, CHECK_NULL);
+    SpaceManager* sm;
+    if (is_class_space_allocation(mdtype)) {
+      sm = loader_data->metaspace_non_null()->class_vsm();
+    } else {
+      sm = loader_data->metaspace_non_null()->vsm();
+    }
+
+    result = sm->get_small_chunk_and_allocate(word_size);
+
+    if (result == NULL) {
+      report_metadata_oome(loader_data, word_size, type, mdtype, CHECK_NULL);
+    }
   }
 
   // Zero initialize.
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -622,14 +622,6 @@
     if (!this_k->is_linked()) {
       if (!this_k->is_rewritten()) {
         {
-          // Timer includes any side effects of class verification (resolution,
-          // etc), but not recursive entry into verify_code().
-          PerfClassTraceTime timer(ClassLoader::perf_class_verify_time(),
-                                   ClassLoader::perf_class_verify_selftime(),
-                                   ClassLoader::perf_classes_verified(),
-                                   jt->get_thread_stat()->perf_recursion_counts_addr(),
-                                   jt->get_thread_stat()->perf_timers_addr(),
-                                   PerfClassTraceTime::CLASS_VERIFY);
           bool verify_ok = verify_code(this_k, throw_verifyerror, THREAD);
           if (!verify_ok) {
             return false;
@@ -1830,11 +1822,10 @@
 // are dependent on the changes that were passed in and mark them for
 // deoptimization.  Returns the number of nmethods found.
 //
-int InstanceKlass::mark_dependent_nmethods(DepChange& changes) {
+int nmethodBucket::mark_dependent_nmethods(nmethodBucket* deps, DepChange& changes) {
   assert_locked_or_safepoint(CodeCache_lock);
   int found = 0;
-  nmethodBucket* b = _dependencies;
-  while (b != NULL) {
+  for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
     nmethod* nm = b->get_nmethod();
     // since dependencies aren't removed until an nmethod becomes a zombie,
     // the dependency list may contain nmethods which aren't alive.
@@ -1842,7 +1833,6 @@
       if (TraceDependencies) {
         ResourceMark rm;
         tty->print_cr("Marked for deoptimization");
-        tty->print_cr("  context = %s", this->external_name());
         changes.print();
         nm->print();
         nm->print_dependencies();
@@ -1850,36 +1840,119 @@
       nm->mark_for_deoptimization();
       found++;
     }
-    b = b->next();
   }
   return found;
 }
 
+//
+// Add an nmethodBucket to the list of dependencies for this nmethod.
+// It's possible that an nmethod has multiple dependencies on this klass
+// so a count is kept for each bucket to guarantee that creation and
+// deletion of dependencies is consistent. Returns new head of the list.
+//
+nmethodBucket* nmethodBucket::add_dependent_nmethod(nmethodBucket* deps, nmethod* nm) {
+  assert_locked_or_safepoint(CodeCache_lock);
+  for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
+    if (nm == b->get_nmethod()) {
+      b->increment();
+      return deps;
+    }
+  }
+  return new nmethodBucket(nm, deps);
+}
+
+//
+// Decrement count of the nmethod in the dependency list and remove
+// the bucket completely when the count goes to 0.  This method must
+// find a corresponding bucket otherwise there's a bug in the
+// recording of dependencies. Returns true if the bucket is ready for reclamation.
+//
+bool nmethodBucket::remove_dependent_nmethod(nmethodBucket* deps, nmethod* nm) {
+  assert_locked_or_safepoint(CodeCache_lock);
+
+  for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
+    if (nm == b->get_nmethod()) {
+      int val = b->decrement();
+      guarantee(val >= 0, err_msg("Underflow: %d", val));
+      return (val == 0);
+    }
+  }
+#ifdef ASSERT
+  tty->print_raw_cr("### can't find dependent nmethod");
+  nm->print();
+#endif // ASSERT
+  ShouldNotReachHere();
+  return false;
+}
+
+//
+// Reclaim all unused buckets. Returns new head of the list.
+//
+nmethodBucket* nmethodBucket::clean_dependent_nmethods(nmethodBucket* deps) {
+  nmethodBucket* first = deps;
+  nmethodBucket* last = NULL;
+  nmethodBucket* b = first;
+
+  while (b != NULL) {
+    assert(b->count() >= 0, err_msg("bucket count: %d", b->count()));
+    nmethodBucket* next = b->next();
+    if (b->count() == 0) {
+      if (last == NULL) {
+        first = next;
+      } else {
+        last->set_next(next);
+      }
+      delete b;
+      // last stays the same.
+    } else {
+      last = b;
+    }
+    b = next;
+  }
+  return first;
+}
+
+#ifndef PRODUCT
+void nmethodBucket::print_dependent_nmethods(nmethodBucket* deps, bool verbose) {
+  int idx = 0;
+  for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
+    nmethod* nm = b->get_nmethod();
+    tty->print("[%d] count=%d { ", idx++, b->count());
+    if (!verbose) {
+      nm->print_on(tty, "nmethod");
+      tty->print_cr(" } ");
+    } else {
+      nm->print();
+      nm->print_dependencies();
+      tty->print_cr("--- } ");
+    }
+  }
+}
+
+bool nmethodBucket::is_dependent_nmethod(nmethodBucket* deps, nmethod* nm) {
+  for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
+    if (nm == b->get_nmethod()) {
+#ifdef ASSERT
+      int count = b->count();
+      assert(count >= 0, err_msg("count shouldn't be negative: %d", count));
+#endif
+      return true;
+    }
+  }
+  return false;
+}
+#endif //PRODUCT
+
+int InstanceKlass::mark_dependent_nmethods(DepChange& changes) {
+  assert_locked_or_safepoint(CodeCache_lock);
+  return nmethodBucket::mark_dependent_nmethods(_dependencies, changes);
+}
+
 void InstanceKlass::clean_dependent_nmethods() {
   assert_locked_or_safepoint(CodeCache_lock);
 
   if (has_unloaded_dependent()) {
-    nmethodBucket* b = _dependencies;
-    nmethodBucket* last = NULL;
-    while (b != NULL) {
-      assert(b->count() >= 0, err_msg("bucket count: %d", b->count()));
-
-      nmethodBucket* next = b->next();
-
-      if (b->count() == 0) {
-        if (last == NULL) {
-          _dependencies = next;
-        } else {
-          last->set_next(next);
-        }
-        delete b;
-        // last stays the same.
-      } else {
-        last = b;
-      }
-
-      b = next;
-    }
+    _dependencies = nmethodBucket::clean_dependent_nmethods(_dependencies);
     set_has_unloaded_dependent(false);
   }
 #ifdef ASSERT
@@ -1893,90 +1966,26 @@
 #endif
 }
 
-//
-// Add an nmethodBucket to the list of dependencies for this nmethod.
-// It's possible that an nmethod has multiple dependencies on this klass
-// so a count is kept for each bucket to guarantee that creation and
-// deletion of dependencies is consistent.
-//
 void InstanceKlass::add_dependent_nmethod(nmethod* nm) {
   assert_locked_or_safepoint(CodeCache_lock);
-  nmethodBucket* b = _dependencies;
-  nmethodBucket* last = NULL;
-  while (b != NULL) {
-    if (nm == b->get_nmethod()) {
-      b->increment();
-      return;
-    }
-    b = b->next();
-  }
-  _dependencies = new nmethodBucket(nm, _dependencies);
+  _dependencies = nmethodBucket::add_dependent_nmethod(_dependencies, nm);
 }
 
-
-//
-// Decrement count of the nmethod in the dependency list and remove
-// the bucket competely when the count goes to 0.  This method must
-// find a corresponding bucket otherwise there's a bug in the
-// recording of dependecies.
-//
 void InstanceKlass::remove_dependent_nmethod(nmethod* nm) {
   assert_locked_or_safepoint(CodeCache_lock);
-  nmethodBucket* b = _dependencies;
-  nmethodBucket* last = NULL;
-  while (b != NULL) {
-    if (nm == b->get_nmethod()) {
-      int val = b->decrement();
-      guarantee(val >= 0, err_msg("Underflow: %d", val));
-      if (val == 0) {
-        set_has_unloaded_dependent(true);
-      }
-      return;
-    }
-    last = b;
-    b = b->next();
+
+  if (nmethodBucket::remove_dependent_nmethod(_dependencies, nm)) {
+    set_has_unloaded_dependent(true);
   }
-#ifdef ASSERT
-  tty->print_cr("### %s can't find dependent nmethod:", this->external_name());
-  nm->print();
-#endif // ASSERT
-  ShouldNotReachHere();
 }
 
-
 #ifndef PRODUCT
 void InstanceKlass::print_dependent_nmethods(bool verbose) {
-  nmethodBucket* b = _dependencies;
-  int idx = 0;
-  while (b != NULL) {
-    nmethod* nm = b->get_nmethod();
-    tty->print("[%d] count=%d { ", idx++, b->count());
-    if (!verbose) {
-      nm->print_on(tty, "nmethod");
-      tty->print_cr(" } ");
-    } else {
-      nm->print();
-      nm->print_dependencies();
-      tty->print_cr("--- } ");
-    }
-    b = b->next();
-  }
+  nmethodBucket::print_dependent_nmethods(_dependencies, verbose);
 }
 
-
 bool InstanceKlass::is_dependent_nmethod(nmethod* nm) {
-  nmethodBucket* b = _dependencies;
-  while (b != NULL) {
-    if (nm == b->get_nmethod()) {
-#ifdef ASSERT
-      int count = b->count();
-      assert(count >= 0, err_msg("count shouldn't be negative: %d", count));
-#endif
-      return true;
-    }
-    b = b->next();
-  }
-  return false;
+  return nmethodBucket::is_dependent_nmethod(_dependencies, nm);
 }
 #endif //PRODUCT
 
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1290,6 +1290,15 @@
   nmethodBucket* next()                   { return _next; }
   void set_next(nmethodBucket* b)         { _next = b; }
   nmethod* get_nmethod()                  { return _nmethod; }
+
+  static int mark_dependent_nmethods(nmethodBucket* deps, DepChange& changes);
+  static nmethodBucket* add_dependent_nmethod(nmethodBucket* deps, nmethod* nm);
+  static bool remove_dependent_nmethod(nmethodBucket* deps, nmethod* nm);
+  static nmethodBucket* clean_dependent_nmethods(nmethodBucket* deps);
+#ifndef PRODUCT
+  static void print_dependent_nmethods(nmethodBucket* deps, bool verbose);
+  static bool is_dependent_nmethod(nmethodBucket* deps, nmethod* nm);
+#endif //PRODUCT
 };
 
 // An iterator that's used to access the inner classes indices in the
--- a/hotspot/src/share/vm/oops/klassVtable.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1136,7 +1136,7 @@
     if (m->has_itable_index()) {
       // This search must match the runtime resolution, i.e. selection search for invokeinterface
       // to correctly enforce loader constraints for interface method inheritance
-      LinkResolver::lookup_instance_method_in_klasses(target, _klass, m->name(), m->signature(), CHECK);
+      target = LinkResolver::lookup_instance_method_in_klasses(_klass, m->name(), m->signature(), CHECK);
     }
     if (target == NULL || !target->is_public() || target->is_abstract()) {
       // Entry does not resolve. Leave it empty for AbstractMethodError.
--- a/hotspot/src/share/vm/opto/arraycopynode.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/arraycopynode.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -599,10 +599,14 @@
 }
 
 bool ArrayCopyNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
-  const TypeOopPtr* dest_t = phase->type(in(ArrayCopyNode::Dest))->is_oopptr();
+  Node* dest = in(ArrayCopyNode::Dest);
+  if (dest->is_top()) {
+    return false;
+  }
+  const TypeOopPtr* dest_t = phase->type(dest)->is_oopptr();
   assert(!dest_t->is_known_instance() || _dest_type->is_known_instance(), "result of EA not recorded");
-  const TypeOopPtr* src_t = phase->type(in(ArrayCopyNode::Src))->is_oopptr();
-  assert(!src_t->is_known_instance() || _src_type->is_known_instance(), "result of EA not recorded");
+  assert(in(ArrayCopyNode::Src)->is_top() || !phase->type(in(ArrayCopyNode::Src))->is_oopptr()->is_known_instance() ||
+         _src_type->is_known_instance(), "result of EA not recorded");
 
   if (_dest_type != TypeOopPtr::BOTTOM || t_oop->is_known_instance()) {
     assert(_dest_type == TypeOopPtr::BOTTOM || _dest_type->is_known_instance(), "result of EA is known instance");
--- a/hotspot/src/share/vm/opto/callnode.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/callnode.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1946,7 +1946,7 @@
         }
       }
     }
-    if (may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) {
+    if (!dest->is_top() && may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) {
       return true;
     }
     return false;
--- a/hotspot/src/share/vm/opto/graphKit.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1457,18 +1457,18 @@
 // factory methods in "int adr_idx"
 Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
                           int adr_idx,
-                          MemNode::MemOrd mo, bool require_atomic_access) {
+                          MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency, bool require_atomic_access) {
   assert(adr_idx != Compile::AliasIdxTop, "use other make_load factory" );
   const TypePtr* adr_type = NULL; // debug-mode-only argument
   debug_only(adr_type = C->get_adr_type(adr_idx));
   Node* mem = memory(adr_idx);
   Node* ld;
   if (require_atomic_access && bt == T_LONG) {
-    ld = LoadLNode::make_atomic(ctl, mem, adr, adr_type, t, mo);
+    ld = LoadLNode::make_atomic(ctl, mem, adr, adr_type, t, mo, control_dependency);
   } else if (require_atomic_access && bt == T_DOUBLE) {
-    ld = LoadDNode::make_atomic(ctl, mem, adr, adr_type, t, mo);
+    ld = LoadDNode::make_atomic(ctl, mem, adr, adr_type, t, mo, control_dependency);
   } else {
-    ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, mo);
+    ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, mo, control_dependency);
   }
   ld = _gvn.transform(ld);
   if ((bt == T_OBJECT) && C->do_escape_analysis() || C->eliminate_boxing()) {
--- a/hotspot/src/share/vm/opto/graphKit.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -512,21 +512,24 @@
   // adapted the `do_put_xxx' and `do_get_xxx' procedures for the case
   // of volatile fields.
   Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
-                  MemNode::MemOrd mo, bool require_atomic_access = false) {
+                  MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
+                  bool require_atomic_access = false) {
     // This version computes alias_index from bottom_type
     return make_load(ctl, adr, t, bt, adr->bottom_type()->is_ptr(),
-                     mo, require_atomic_access);
+                     mo, control_dependency, require_atomic_access);
   }
   Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, const TypePtr* adr_type,
-                  MemNode::MemOrd mo, bool require_atomic_access = false) {
+                  MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
+                  bool require_atomic_access = false) {
     // This version computes alias_index from an address type
     assert(adr_type != NULL, "use other make_load factory");
     return make_load(ctl, adr, t, bt, C->get_alias_index(adr_type),
-                     mo, require_atomic_access);
+                     mo, control_dependency, require_atomic_access);
   }
   // This is the base version which is given an alias index.
   Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, int adr_idx,
-                  MemNode::MemOrd mo, bool require_atomic_access = false);
+                  MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
+                  bool require_atomic_access = false);
 
   // Create & transform a StoreNode and store the effect into the
   // parser's memory state.
--- a/hotspot/src/share/vm/opto/library_call.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/library_call.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -2631,7 +2631,9 @@
 
   if (!is_store) {
     MemNode::MemOrd mo = is_volatile ? MemNode::acquire : MemNode::unordered;
-    Node* p = make_load(control(), adr, value_type, type, adr_type, mo, is_volatile);
+    // To be valid, unsafe loads may depend on other conditions than
+    // the one that guards them: pin the Load node
+    Node* p = make_load(control(), adr, value_type, type, adr_type, mo, LoadNode::Pinned, is_volatile);
     // load value
     switch (type) {
     case T_BOOLEAN:
@@ -5488,7 +5490,7 @@
   }
   // Build the load.
   MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered;
-  Node* loadedField = make_load(NULL, adr, type, bt, adr_type, mo, is_vol);
+  Node* loadedField = make_load(NULL, adr, type, bt, adr_type, mo, LoadNode::DependsOnlyOnTest, is_vol);
   // If reference is volatile, prevent following memory ops from
   // floating up past the volatile read.  Also prevents commoning
   // another volatile read.
--- a/hotspot/src/share/vm/opto/loopPredicate.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/loopPredicate.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -437,7 +437,13 @@
           }
         }
         if (all_inputs_invariant) {
-          _invariant.set(n->_idx); // I am a invariant too
+          // If n's control is a predicate that was moved out of the
+          // loop, it was marked invariant but n is only invariant if
+          // it depends only on that test. Otherwise, unless that test
+          // is out of the loop, it's not invariant.
+          if (n->is_CFG() || n->depends_only_on_test() || n->in(0) == NULL || !_phase->is_member(_lpt, n->in(0))) {
+            _invariant.set(n->_idx); // I am a invariant too
+          }
         }
       } else { // process next input
         _stack.set_index(idx + 1);
--- a/hotspot/src/share/vm/opto/loopTransform.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1582,13 +1582,36 @@
           if (opc != ReductionNode::opcode(opc, def_node->bottom_type()->basic_type())) {
             if (!def_node->is_reduction()) { // Not marked yet
               // To be a reduction, the arithmetic node must have the phi as input and provide a def to it
+              bool ok = false;
               for (unsigned j = 1; j < def_node->req(); j++) {
                 Node* in = def_node->in(j);
                 if (in == phi) {
-                  def_node->add_flag(Node::Flag_is_reduction);
+                  ok = true;
                   break;
                 }
               }
+
+              // do nothing if we did not match the initial criteria
+              if (ok == false) {
+                continue;
+              }
+
+              // The result of the reduction must not be used in the loop
+              for (DUIterator_Fast imax, i = def_node->fast_outs(imax); i < imax && ok; i++) {
+                Node* u = def_node->fast_out(i);
+                if (has_ctrl(u) && !loop->is_member(get_loop(get_ctrl(u)))) {
+                  continue;
+                }
+                if (u == phi) {
+                  continue;
+                }
+                ok = false;
+              }
+
+              // iff the uses conform
+              if (ok) {
+                def_node->add_flag(Node::Flag_is_reduction);
+              }
             }
           }
         }
--- a/hotspot/src/share/vm/opto/loopopts.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/loopopts.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -718,7 +718,7 @@
   }
 
   // Use same limit as split_if_with_blocks_post
-  if( C->unique() > 35000 ) return n; // Method too big
+  if( C->live_nodes() > 35000 ) return n; // Method too big
 
   // Split 'n' through the merge point if it is profitable
   Node *phi = split_thru_phi( n, n_blk, policy );
@@ -802,7 +802,7 @@
   // Cloning Cmp through Phi's involves the split-if transform.
   // FastLock is not used by an If
   if( n->is_Cmp() && !n->is_FastLock() ) {
-    if( C->unique() > 35000 ) return; // Method too big
+    if( C->live_nodes() > 35000 ) return; // Method too big
 
     // Do not do 'split-if' if irreducible loops are present.
     if( _has_irreducible_loops )
--- a/hotspot/src/share/vm/opto/matcher.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/matcher.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -844,7 +844,7 @@
   MachNode *spillCP = match_tree(new LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
 #endif
   MachNode *spillI  = match_tree(new LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered));
-  MachNode *spillL  = match_tree(new LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false));
+  MachNode *spillL  = match_tree(new LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered, LoadNode::DependsOnlyOnTest, false));
   MachNode *spillF  = match_tree(new LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered));
   MachNode *spillD  = match_tree(new LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered));
   MachNode *spillP  = match_tree(new LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
--- a/hotspot/src/share/vm/opto/memnode.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/memnode.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -784,6 +784,9 @@
     // standard dump does this in Verbose and WizardMode
     st->print(" #"); _type->dump_on(st);
   }
+  if (!_depends_only_on_test) {
+    st->print(" (does not depend only on test)");
+  }
 }
 #endif
 
@@ -800,7 +803,7 @@
 
 //----------------------------LoadNode::make-----------------------------------
 // Polymorphic factory method:
-Node *LoadNode::make(PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const TypePtr* adr_type, const Type *rt, BasicType bt, MemOrd mo) {
+Node *LoadNode::make(PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const TypePtr* adr_type, const Type *rt, BasicType bt, MemOrd mo, ControlDependency control_dependency) {
   Compile* C = gvn.C;
 
   // sanity check the alias category against the created node type
@@ -816,39 +819,39 @@
           rt->isa_oopptr() || is_immutable_value(adr),
           "raw memory operations should have control edge");
   switch (bt) {
-  case T_BOOLEAN: return new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(),  mo);
-  case T_BYTE:    return new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(),  mo);
-  case T_INT:     return new LoadINode (ctl, mem, adr, adr_type, rt->is_int(),  mo);
-  case T_CHAR:    return new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(),  mo);
-  case T_SHORT:   return new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(),  mo);
-  case T_LONG:    return new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo);
-  case T_FLOAT:   return new LoadFNode (ctl, mem, adr, adr_type, rt,            mo);
-  case T_DOUBLE:  return new LoadDNode (ctl, mem, adr, adr_type, rt,            mo);
-  case T_ADDRESS: return new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(),  mo);
+  case T_BOOLEAN: return new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency);
+  case T_BYTE:    return new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency);
+  case T_INT:     return new LoadINode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency);
+  case T_CHAR:    return new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency);
+  case T_SHORT:   return new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(),  mo, control_dependency);
+  case T_LONG:    return new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo, control_dependency);
+  case T_FLOAT:   return new LoadFNode (ctl, mem, adr, adr_type, rt,            mo, control_dependency);
+  case T_DOUBLE:  return new LoadDNode (ctl, mem, adr, adr_type, rt,            mo, control_dependency);
+  case T_ADDRESS: return new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(),  mo, control_dependency);
   case T_OBJECT:
 #ifdef _LP64
     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
-      Node* load  = gvn.transform(new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo));
+      Node* load  = gvn.transform(new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo, control_dependency));
       return new DecodeNNode(load, load->bottom_type()->make_ptr());
     } else
 #endif
     {
       assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop");
-      return new LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo);
+      return new LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo, control_dependency);
     }
   }
   ShouldNotReachHere();
   return (LoadNode*)NULL;
 }
 
-LoadLNode* LoadLNode::make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) {
+LoadLNode* LoadLNode::make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo, ControlDependency control_dependency) {
   bool require_atomic = true;
-  return new LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic);
+  return new LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, control_dependency, require_atomic);
 }
 
-LoadDNode* LoadDNode::make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) {
+LoadDNode* LoadDNode::make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo, ControlDependency control_dependency) {
   bool require_atomic = true;
-  return new LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic);
+  return new LoadDNode(ctl, mem, adr, adr_type, rt, mo, control_dependency, require_atomic);
 }
 
 
--- a/hotspot/src/share/vm/opto/memnode.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/memnode.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -137,7 +137,33 @@
 //------------------------------LoadNode---------------------------------------
 // Load value; requires Memory and Address
 class LoadNode : public MemNode {
+public:
+  // Some loads (from unsafe) should be pinned: they don't depend only
+  // on the dominating test.  The boolean field _depends_only_on_test
+  // below records whether that node depends only on the dominating
+  // test.
+  // Methods used to build LoadNodes pass an argument of type enum
+  // ControlDependency instead of a boolean because those methods
+  // typically have multiple boolean parameters with default values:
+  // passing the wrong boolean to one of these parameters by mistake
+  // goes easily unnoticed. Using an enum, the compiler can check that
+  // the type of a value and the type of the parameter match.
+  enum ControlDependency {
+    Pinned,
+    DependsOnlyOnTest
+  };
 private:
+  // LoadNode::hash() doesn't take the _depends_only_on_test field
+  // into account: If the graph already has a non-pinned LoadNode and
+  // we add a pinned LoadNode with the same inputs, it's safe for GVN
+  // to replace the pinned LoadNode with the non-pinned LoadNode,
+  // otherwise it wouldn't be safe to have a non pinned LoadNode with
+  // those inputs in the first place. If the graph already has a
+  // pinned LoadNode and we add a non pinned LoadNode with the same
+  // inputs, it's safe (but suboptimal) for GVN to replace the
+  // non-pinned LoadNode by the pinned LoadNode.
+  bool _depends_only_on_test;
+
   // On platforms with weak memory ordering (e.g., PPC, Ia64) we distinguish
   // loads that can be reordered, and such requiring acquire semantics to
   // adhere to the Java specification.  The required behaviour is stored in
@@ -154,8 +180,8 @@
   virtual Node* find_previous_arraycopy(PhaseTransform* phase, Node* ld_alloc, Node*& mem, bool can_see_stored_value) const;
 public:
 
-  LoadNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt, MemOrd mo)
-    : MemNode(c,mem,adr,at), _type(rt), _mo(mo) {
+  LoadNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt, MemOrd mo, ControlDependency control_dependency)
+    : MemNode(c,mem,adr,at), _type(rt), _mo(mo), _depends_only_on_test(control_dependency == DependsOnlyOnTest) {
     init_class_id(Class_Load);
   }
   inline bool is_unordered() const { return !is_acquire(); }
@@ -166,7 +192,8 @@
 
   // Polymorphic factory method:
    static Node* make(PhaseGVN& gvn, Node *c, Node *mem, Node *adr,
-                     const TypePtr* at, const Type *rt, BasicType bt, MemOrd mo);
+                     const TypePtr* at, const Type *rt, BasicType bt,
+                     MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest);
 
   virtual uint hash()   const;  // Check the type
 
@@ -234,16 +261,15 @@
   // which produce results (new raw memory state) inside of loops preventing all
   // manner of other optimizations).  Basically, it's ugly but so is the alternative.
   // See comment in macro.cpp, around line 125 expand_allocate_common().
-  virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; }
-
+  virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM && _depends_only_on_test; }
 };
 
 //------------------------------LoadBNode--------------------------------------
 // Load a byte (8bits signed) from memory
 class LoadBNode : public LoadNode {
 public:
-  LoadBNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo)
-    : LoadNode(c, mem, adr, at, ti, mo) {}
+  LoadBNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegI; }
   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -256,8 +282,8 @@
 // Load a unsigned byte (8bits unsigned) from memory
 class LoadUBNode : public LoadNode {
 public:
-  LoadUBNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt* ti, MemOrd mo)
-    : LoadNode(c, mem, adr, at, ti, mo) {}
+  LoadUBNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt* ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegI; }
   virtual Node* Ideal(PhaseGVN *phase, bool can_reshape);
@@ -270,8 +296,8 @@
 // Load an unsigned short/char (16bits unsigned) from memory
 class LoadUSNode : public LoadNode {
 public:
-  LoadUSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo)
-    : LoadNode(c, mem, adr, at, ti, mo) {}
+  LoadUSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegI; }
   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -284,8 +310,8 @@
 // Load a short (16bits signed) from memory
 class LoadSNode : public LoadNode {
 public:
-  LoadSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo)
-    : LoadNode(c, mem, adr, at, ti, mo) {}
+  LoadSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegI; }
   virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -298,8 +324,8 @@
 // Load an integer from memory
 class LoadINode : public LoadNode {
 public:
-  LoadINode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo)
-    : LoadNode(c, mem, adr, at, ti, mo) {}
+  LoadINode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegI; }
   virtual int store_Opcode() const { return Op_StoreI; }
@@ -331,15 +357,15 @@
 
 public:
   LoadLNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeLong *tl,
-            MemOrd mo, bool require_atomic_access = false)
-    : LoadNode(c, mem, adr, at, tl, mo), _require_atomic_access(require_atomic_access) {}
+            MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest, bool require_atomic_access = false)
+    : LoadNode(c, mem, adr, at, tl, mo, control_dependency), _require_atomic_access(require_atomic_access) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegL; }
   virtual int store_Opcode() const { return Op_StoreL; }
   virtual BasicType memory_type() const { return T_LONG; }
   bool require_atomic_access() const { return _require_atomic_access; }
   static LoadLNode* make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type,
-                                const Type* rt, MemOrd mo);
+                                const Type* rt, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest);
 #ifndef PRODUCT
   virtual void dump_spec(outputStream *st) const {
     LoadNode::dump_spec(st);
@@ -352,8 +378,8 @@
 // Load a long from unaligned memory
 class LoadL_unalignedNode : public LoadLNode {
 public:
-  LoadL_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo)
-    : LoadLNode(c, mem, adr, at, TypeLong::LONG, mo) {}
+  LoadL_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadLNode(c, mem, adr, at, TypeLong::LONG, mo, control_dependency) {}
   virtual int Opcode() const;
 };
 
@@ -361,8 +387,8 @@
 // Load a float (64 bits) from memory
 class LoadFNode : public LoadNode {
 public:
-  LoadFNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, MemOrd mo)
-    : LoadNode(c, mem, adr, at, t, mo) {}
+  LoadFNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, t, mo, control_dependency) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegF; }
   virtual int store_Opcode() const { return Op_StoreF; }
@@ -382,15 +408,15 @@
 
 public:
   LoadDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t,
-            MemOrd mo, bool require_atomic_access = false)
-    : LoadNode(c, mem, adr, at, t, mo), _require_atomic_access(require_atomic_access) {}
+            MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest, bool require_atomic_access = false)
+    : LoadNode(c, mem, adr, at, t, mo, control_dependency), _require_atomic_access(require_atomic_access) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegD; }
   virtual int store_Opcode() const { return Op_StoreD; }
   virtual BasicType memory_type() const { return T_DOUBLE; }
   bool require_atomic_access() const { return _require_atomic_access; }
   static LoadDNode* make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type,
-                                const Type* rt, MemOrd mo);
+                                const Type* rt, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest);
 #ifndef PRODUCT
   virtual void dump_spec(outputStream *st) const {
     LoadNode::dump_spec(st);
@@ -403,8 +429,8 @@
 // Load a double from unaligned memory
 class LoadD_unalignedNode : public LoadDNode {
 public:
-  LoadD_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo)
-    : LoadDNode(c, mem, adr, at, Type::DOUBLE, mo) {}
+  LoadD_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadDNode(c, mem, adr, at, Type::DOUBLE, mo, control_dependency) {}
   virtual int Opcode() const;
 };
 
@@ -412,8 +438,8 @@
 // Load a pointer from memory (either object or array)
 class LoadPNode : public LoadNode {
 public:
-  LoadPNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t, MemOrd mo)
-    : LoadNode(c, mem, adr, at, t, mo) {}
+  LoadPNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, t, mo, control_dependency) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegP; }
   virtual int store_Opcode() const { return Op_StoreP; }
@@ -425,8 +451,8 @@
 // Load a narrow oop from memory (either object or array)
 class LoadNNode : public LoadNode {
 public:
-  LoadNNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const Type* t, MemOrd mo)
-    : LoadNode(c, mem, adr, at, t, mo) {}
+  LoadNNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const Type* t, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, t, mo, control_dependency) {}
   virtual int Opcode() const;
   virtual uint ideal_reg() const { return Op_RegN; }
   virtual int store_Opcode() const { return Op_StoreN; }
--- a/hotspot/src/share/vm/opto/parse3.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/parse3.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -235,7 +235,7 @@
   //
   MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered;
   bool needs_atomic_access = is_vol || AlwaysAtomicAccesses;
-  Node* ld = make_load(NULL, adr, type, bt, adr_type, mo, needs_atomic_access);
+  Node* ld = make_load(NULL, adr, type, bt, adr_type, mo, LoadNode::DependsOnlyOnTest, needs_atomic_access);
 
   // Adjust Java stack
   if (type2size[bt] == 1)
--- a/hotspot/src/share/vm/opto/phaseX.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/phaseX.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1573,11 +1573,12 @@
       set_type(n, t);
       for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
         Node* m = n->fast_out(i);   // Get user
-        if( m->is_Region() ) {  // New path to Region?  Must recheck Phis too
+        if (m->is_Region()) {  // New path to Region?  Must recheck Phis too
           for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) {
             Node* p = m->fast_out(i2); // Propagate changes to uses
-            if( p->bottom_type() != type(p) ) // If not already bottomed out
+            if (p->bottom_type() != type(p)) { // If not already bottomed out
               worklist.push(p); // Propagate change to user
+            }
           }
         }
         // If we changed the receiver type to a call, we need to revisit
@@ -1587,12 +1588,31 @@
         if (m->is_Call()) {
           for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) {
             Node* p = m->fast_out(i2);  // Propagate changes to uses
-            if (p->is_Proj() && p->as_Proj()->_con == TypeFunc::Control && p->outcnt() == 1)
+            if (p->is_Proj() && p->as_Proj()->_con == TypeFunc::Control && p->outcnt() == 1) {
               worklist.push(p->unique_out());
+            }
           }
         }
-        if( m->bottom_type() != type(m) ) // If not already bottomed out
+        if (m->bottom_type() != type(m)) { // If not already bottomed out
           worklist.push(m);     // Propagate change to user
+        }
+
+        // CmpU nodes can get their type information from two nodes up in the
+        // graph (instead of from the nodes immediately above). Make sure they
+        // are added to the worklist if nodes they depend on are updated, since
+        // they could be missed and get wrong types otherwise.
+        uint m_op = m->Opcode();
+        if (m_op == Op_AddI || m_op == Op_SubI) {
+          for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) {
+            Node* p = m->fast_out(i2); // Propagate changes to uses
+            if (p->Opcode() == Op_CmpU) {
+              // Got a CmpU which might need the new type information from node n.
+              if(p->bottom_type() != type(p)) { // If not already bottomed out
+                worklist.push(p); // Propagate change to user
+              }
+            }
+          }
+        }
       }
     }
   }
--- a/hotspot/src/share/vm/opto/superword.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/superword.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1631,7 +1631,7 @@
         }
         Node* adr = low_adr->in(MemNode::Address);
         const TypePtr* atyp = n->adr_type();
-        vn = LoadVectorNode::make(opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n));
+        vn = LoadVectorNode::make(opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n), control_dependency(p));
         vlen_in_bytes = vn->as_LoadVector()->memory_size();
       } else if (n->is_Store()) {
         // Promote value to be stored to vector
@@ -2280,6 +2280,19 @@
   return n;
 }
 
+LoadNode::ControlDependency SuperWord::control_dependency(Node_List* p) {
+  LoadNode::ControlDependency dep = LoadNode::DependsOnlyOnTest;
+  for (uint i = 0; i < p->size(); i++) {
+    Node* n = p->at(i);
+    assert(n->is_Load(), "only meaningful for loads");
+    if (!n->depends_only_on_test()) {
+      dep = LoadNode::Pinned;
+    }
+  }
+  return dep;
+}
+
+
 //----------------------------align_initial_loop_index---------------------------
 // Adjust pre-loop limit so that in main loop, a load/store reference
 // to align_to_ref will be a position zero in the vector.
--- a/hotspot/src/share/vm/opto/superword.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/superword.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -428,6 +428,7 @@
   Node* executed_first(Node_List* p);
   // Return the node executed last in pack p.
   Node* executed_last(Node_List* p);
+  static LoadNode::ControlDependency control_dependency(Node_List* p);
   // Alignment within a vector memory reference
   int memory_alignment(MemNode* s, int iv_adjust);
   // (Start, end] half-open range defining which operands are vector
--- a/hotspot/src/share/vm/opto/vectornode.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/vectornode.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -406,9 +406,11 @@
 
 // Return the vector version of a scalar load node.
 LoadVectorNode* LoadVectorNode::make(int opc, Node* ctl, Node* mem,
-                                     Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) {
+                                     Node* adr, const TypePtr* atyp,
+                                     uint vlen, BasicType bt,
+                                     ControlDependency control_dependency) {
   const TypeVect* vt = TypeVect::make(bt, vlen);
-  return new LoadVectorNode(ctl, mem, adr, atyp, vt);
+  return new LoadVectorNode(ctl, mem, adr, atyp, vt, control_dependency);
 }
 
 // Return the vector version of a scalar store node.
--- a/hotspot/src/share/vm/opto/vectornode.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/vectornode.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -454,8 +454,8 @@
 // Load Vector from memory
 class LoadVectorNode : public LoadNode {
  public:
-  LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt)
-    : LoadNode(c, mem, adr, at, vt, MemNode::unordered) {
+  LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt, ControlDependency control_dependency = LoadNode::DependsOnlyOnTest)
+    : LoadNode(c, mem, adr, at, vt, MemNode::unordered, control_dependency) {
     init_class_id(Class_LoadVector);
   }
 
@@ -471,7 +471,9 @@
   virtual int store_Opcode() const { return Op_StoreVector; }
 
   static LoadVectorNode* make(int opc, Node* ctl, Node* mem,
-                              Node* adr, const TypePtr* atyp, uint vlen, BasicType bt);
+                              Node* adr, const TypePtr* atyp,
+                              uint vlen, BasicType bt,
+                              ControlDependency control_dependency = LoadNode::DependsOnlyOnTest);
 };
 
 //------------------------------StoreVectorNode--------------------------------
--- a/hotspot/src/share/vm/prims/jni.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/prims/jni.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1126,39 +1126,32 @@
     Method* m = Method::resolve_jmethod_id(method_id);
     number_of_parameters = m->size_of_parameters();
     Klass* holder = m->method_holder();
-    if (!(holder)->is_interface()) {
+    if (call_type != JNI_VIRTUAL) {
+        selected_method = m;
+    } else if (!m->has_itable_index()) {
       // non-interface call -- for that little speed boost, don't handlize
       debug_only(No_Safepoint_Verifier nosafepoint;)
-      if (call_type == JNI_VIRTUAL) {
-        // jni_GetMethodID makes sure class is linked and initialized
-        // so m should have a valid vtable index.
-        assert(!m->has_itable_index(), "");
-        int vtbl_index = m->vtable_index();
-        if (vtbl_index != Method::nonvirtual_vtable_index) {
-          Klass* k = h_recv->klass();
-          // k might be an arrayKlassOop but all vtables start at
-          // the same place. The cast is to avoid virtual call and assertion.
-          InstanceKlass *ik = (InstanceKlass*)k;
-          selected_method = ik->method_at_vtable(vtbl_index);
-        } else {
-          // final method
-          selected_method = m;
-        }
+      // jni_GetMethodID makes sure class is linked and initialized
+      // so m should have a valid vtable index.
+      assert(m->valid_vtable_index(), "no valid vtable index");
+      int vtbl_index = m->vtable_index();
+      if (vtbl_index != Method::nonvirtual_vtable_index) {
+        Klass* k = h_recv->klass();
+        // k might be an arrayKlassOop but all vtables start at
+        // the same place. The cast is to avoid virtual call and assertion.
+        InstanceKlass *ik = (InstanceKlass*)k;
+        selected_method = ik->method_at_vtable(vtbl_index);
       } else {
-        // JNI_NONVIRTUAL call
+        // final method
         selected_method = m;
       }
     } else {
       // interface call
       KlassHandle h_holder(THREAD, holder);
 
-      if (call_type == JNI_VIRTUAL) {
-        int itbl_index = m->itable_index();
-        Klass* k = h_recv->klass();
-        selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
-      } else {
-        selected_method = m;
-      }
+      int itbl_index = m->itable_index();
+      Klass* k = h_recv->klass();
+      selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
     }
   }
 
--- a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -842,7 +842,7 @@
         // optimize to limit the number of times that java_sender() is called
         javaVFrame *jvf_cursor = jvf;
         javaVFrame *jvf_prev = NULL;
-        javaVFrame *jvf_prev_prev;
+        javaVFrame *jvf_prev_prev = NULL;
         int j = 0;
         while (jvf_cursor != NULL) {
           jvf_prev_prev = jvf_prev;
--- a/hotspot/src/share/vm/prims/methodHandles.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -677,24 +677,24 @@
   case IS_METHOD:
     {
       CallInfo result;
+      LinkInfo link_info(defc, name, type, caller, caller.not_null());
       {
         assert(!HAS_PENDING_EXCEPTION, "");
         if (ref_kind == JVM_REF_invokeStatic) {
           LinkResolver::resolve_static_call(result,
-                        defc, name, type, caller, caller.not_null(), false, THREAD);
+                        link_info, false, THREAD);
         } else if (ref_kind == JVM_REF_invokeInterface) {
           LinkResolver::resolve_interface_call(result, Handle(), defc,
-                        defc, name, type, caller, caller.not_null(), false, THREAD);
+                        link_info, false, THREAD);
         } else if (mh_invoke_id != vmIntrinsics::_none) {
           assert(!is_signature_polymorphic_static(mh_invoke_id), "");
-          LinkResolver::resolve_handle_call(result,
-                        defc, name, type, caller, THREAD);
+          LinkResolver::resolve_handle_call(result, link_info, THREAD);
         } else if (ref_kind == JVM_REF_invokeSpecial) {
           LinkResolver::resolve_special_call(result,
-                        defc, name, type, caller, caller.not_null(), THREAD);
+                        link_info, THREAD);
         } else if (ref_kind == JVM_REF_invokeVirtual) {
           LinkResolver::resolve_virtual_call(result, Handle(), defc,
-                        defc, name, type, caller, caller.not_null(), false, THREAD);
+                        link_info, false, THREAD);
         } else {
           assert(false, err_msg("ref_kind=%d", ref_kind));
         }
@@ -714,11 +714,11 @@
   case IS_CONSTRUCTOR:
     {
       CallInfo result;
+      LinkInfo link_info(defc, name, type, caller, caller.not_null());
       {
         assert(!HAS_PENDING_EXCEPTION, "");
         if (name == vmSymbols::object_initializer_name()) {
-          LinkResolver::resolve_special_call(result,
-                        defc, name, type, caller, caller.not_null(), THREAD);
+          LinkResolver::resolve_special_call(result, link_info, THREAD);
         } else {
           break;                // will throw after end of switch
         }
@@ -735,7 +735,8 @@
       fieldDescriptor result; // find_field initializes fd if found
       {
         assert(!HAS_PENDING_EXCEPTION, "");
-        LinkResolver::resolve_field(result, defc, name, type, caller, Bytecodes::_nop, false, false, THREAD);
+        LinkInfo link_info(defc, name, type, caller, /*check_access*/false);
+        LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD);
         if (HAS_PENDING_EXCEPTION) {
           return empty;
         }
@@ -942,22 +943,56 @@
   return rfill + overflow;
 }
 
-// Get context class for a CallSite instance: either extract existing context or use default one.
-InstanceKlass* MethodHandles::get_call_site_context(oop call_site) {
-  // In order to extract a context the following traversal is performed:
-  //   CallSite.context => Cleaner.referent => Class._klass => Klass
-  assert(java_lang_invoke_CallSite::is_instance(call_site), "");
-  oop context_oop = java_lang_invoke_CallSite::context_volatile(call_site);
-  if (oopDesc::is_null(context_oop)) {
-    return NULL; // The context hasn't been initialized yet.
+void MethodHandles::add_dependent_nmethod(oop call_site, nmethod* nm) {
+  assert_locked_or_safepoint(CodeCache_lock);
+
+  oop context = java_lang_invoke_CallSite::context(call_site);
+  nmethodBucket* deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
+
+  nmethodBucket* new_deps = nmethodBucket::add_dependent_nmethod(deps, nm);
+  if (deps != new_deps) {
+    java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(context, new_deps);
+  }
+}
+
+void MethodHandles::remove_dependent_nmethod(oop call_site, nmethod* nm) {
+  assert_locked_or_safepoint(CodeCache_lock);
+
+  oop context = java_lang_invoke_CallSite::context(call_site);
+  nmethodBucket* deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
+
+  if (nmethodBucket::remove_dependent_nmethod(deps, nm)) {
+    nmethodBucket* new_deps = nmethodBucket::clean_dependent_nmethods(deps);
+    if (deps != new_deps) {
+      java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(context, new_deps);
+    }
   }
-  oop context_class_oop = java_lang_ref_Reference::referent(context_oop);
-  if (oopDesc::is_null(context_class_oop)) {
-    // The context reference was cleared by GC, so current dependency context
-    // isn't usable anymore. Context should be fetched from CallSite again.
-    return NULL;
+}
+
+void MethodHandles::flush_dependent_nmethods(Handle call_site, Handle target) {
+  assert_lock_strong(Compile_lock);
+
+  int marked = 0;
+  CallSiteDepChange changes(call_site(), target());
+  {
+    MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+
+    oop context = java_lang_invoke_CallSite::context(call_site());
+    nmethodBucket* deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
+
+    marked = nmethodBucket::mark_dependent_nmethods(deps, changes);
+    if (marked > 0) {
+      nmethodBucket* new_deps = nmethodBucket::clean_dependent_nmethods(deps);
+      if (deps != new_deps) {
+        java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(context, new_deps);
+      }
+    }
   }
-  return InstanceKlass::cast(java_lang_Class::as_Klass(context_class_oop));
+  if (marked > 0) {
+    // At least one nmethod has been marked for deoptimization
+    VM_Deoptimize op;
+    VMThread::execute(&op);
+  }
 }
 
 //------------------------------------------------------------------------------
@@ -1276,7 +1311,7 @@
   {
     // Walk all nmethods depending on this call site.
     MutexLocker mu(Compile_lock, thread);
-    CodeCache::flush_dependents_on(call_site, target);
+    MethodHandles::flush_dependent_nmethods(call_site, target);
     java_lang_invoke_CallSite::set_target(call_site(), target());
   }
 }
@@ -1288,30 +1323,34 @@
   {
     // Walk all nmethods depending on this call site.
     MutexLocker mu(Compile_lock, thread);
-    CodeCache::flush_dependents_on(call_site, target);
+    MethodHandles::flush_dependent_nmethods(call_site, target);
     java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
   }
 }
 JVM_END
 
-JVM_ENTRY(void, MHN_invalidateDependentNMethods(JNIEnv* env, jobject igcls, jobject call_site_jh)) {
-  Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
+JVM_ENTRY(void, MHN_clearCallSiteContext(JNIEnv* env, jobject igcls, jobject context_jh)) {
+  Handle context(THREAD, JNIHandles::resolve_non_null(context_jh));
   {
     // Walk all nmethods depending on this call site.
     MutexLocker mu1(Compile_lock, thread);
 
-    CallSiteDepChange changes(call_site(), Handle());
-
-    InstanceKlass* ctxk = MethodHandles::get_call_site_context(call_site());
-    if (ctxk == NULL) {
-      return; // No dependencies to invalidate yet.
-    }
     int marked = 0;
     {
       MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
-      marked = ctxk->mark_dependent_nmethods(changes);
+      nmethodBucket* b = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context());
+      while(b != NULL) {
+        nmethod* nm = b->get_nmethod();
+        if (b->count() > 0 && nm->is_alive() && !nm->is_marked_for_deoptimization()) {
+          nm->mark_for_deoptimization();
+          marked++;
+        }
+        nmethodBucket* next = b->next();
+        delete b;
+        b = next;
+      }
+      java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(context(), NULL); // reset context
     }
-    java_lang_invoke_CallSite::set_context_volatile(call_site(), NULL); // Reset call site to initial state
     if (marked > 0) {
       // At least one nmethod has been marked for deoptimization
       VM_Deoptimize op;
@@ -1357,6 +1396,7 @@
 #define MT    JLINV"MethodType;"
 #define MH    JLINV"MethodHandle;"
 #define MEM   JLINV"MemberName;"
+#define CTX   JLINV"MethodHandleNatives$CallSiteContext;"
 
 #define CC (char*)  /*cast a literal from (const char*)*/
 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
@@ -1374,7 +1414,7 @@
   {CC"objectFieldOffset",         CC"("MEM")J",                          FN_PTR(MHN_objectFieldOffset)},
   {CC"setCallSiteTargetNormal",   CC"("CS""MH")V",                       FN_PTR(MHN_setCallSiteTargetNormal)},
   {CC"setCallSiteTargetVolatile", CC"("CS""MH")V",                       FN_PTR(MHN_setCallSiteTargetVolatile)},
-  {CC"invalidateDependentNMethods", CC"("CS")V",                         FN_PTR(MHN_invalidateDependentNMethods)},
+  {CC"clearCallSiteContext",      CC"("CTX")V",                          FN_PTR(MHN_clearCallSiteContext)},
   {CC"staticFieldOffset",         CC"("MEM")J",                          FN_PTR(MHN_staticFieldOffset)},
   {CC"staticFieldBase",           CC"("MEM")"OBJ,                        FN_PTR(MHN_staticFieldBase)},
   {CC"getMemberVMInfo",           CC"("MEM")"OBJ,                        FN_PTR(MHN_getMemberVMInfo)}
--- a/hotspot/src/share/vm/prims/methodHandles.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/prims/methodHandles.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -69,7 +69,10 @@
   enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 };
 
   // CallSite support
-  static InstanceKlass* get_call_site_context(oop call_site);
+  static void add_dependent_nmethod(oop call_site, nmethod* nm);
+  static void remove_dependent_nmethod(oop call_site, nmethod* nm);
+
+  static void flush_dependent_nmethods(Handle call_site, Handle target);
 
   // Generate MethodHandles adapters.
   static bool generate_adapters();
--- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -64,7 +64,7 @@
   }
 #endif
 
-#ifdef SPARC
+#if defined SPARC || defined AARCH64
   if (FLAG_IS_DEFAULT(InlineSmallCode)) {
     FLAG_SET_DEFAULT(InlineSmallCode, 2500);
   }
--- a/hotspot/src/share/vm/runtime/javaCalls.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -179,9 +179,9 @@
   CallInfo callinfo;
   Handle receiver = args->receiver();
   KlassHandle recvrKlass(THREAD, receiver.is_null() ? (Klass*)NULL : receiver->klass());
+  LinkInfo link_info(spec_klass, name, signature, KlassHandle(), /*check_access*/false);
   LinkResolver::resolve_virtual_call(
-          callinfo, receiver, recvrKlass, spec_klass, name, signature,
-          KlassHandle(), false, true, CHECK);
+          callinfo, receiver, recvrKlass, link_info, true, CHECK);
   methodHandle method = callinfo.selected_method();
   assert(method.not_null(), "should have thrown exception");
 
@@ -216,7 +216,8 @@
 
 void JavaCalls::call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
   CallInfo callinfo;
-  LinkResolver::resolve_special_call(callinfo, klass, name, signature, KlassHandle(), false, CHECK);
+  LinkInfo link_info(klass, name, signature, KlassHandle(), /*check_access*/false);
+  LinkResolver::resolve_special_call(callinfo, link_info, CHECK);
   methodHandle method = callinfo.selected_method();
   assert(method.not_null(), "should have thrown exception");
 
@@ -250,7 +251,8 @@
 
 void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
   CallInfo callinfo;
-  LinkResolver::resolve_static_call(callinfo, klass, name, signature, KlassHandle(), false, true, CHECK);
+  LinkInfo link_info(klass, name, signature, KlassHandle(), /*check_access*/false);
+  LinkResolver::resolve_static_call(callinfo, link_info, true, CHECK);
   methodHandle method = callinfo.selected_method();
   assert(method.not_null(), "should have thrown exception");
 
--- a/hotspot/src/share/vm/runtime/os.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/runtime/os.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -775,6 +775,10 @@
   pd_start_thread(thread);
 }
 
+void os::abort(bool dump_core) {
+  abort(dump_core && CreateCoredumpOnCrash, NULL, NULL);
+}
+
 //---------------------------------------------------------------------------
 // Helper functions for fatal error handler
 
--- a/hotspot/src/share/vm/runtime/reflection.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/runtime/reflection.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -831,9 +831,9 @@
   CallInfo info;
   Symbol*  signature  = method->signature();
   Symbol*  name       = method->name();
-  LinkResolver::resolve_interface_call(info, receiver, recv_klass, klass,
-                                       name, signature,
-                                       KlassHandle(), false, true,
+  LinkResolver::resolve_interface_call(info, receiver, recv_klass,
+                                       LinkInfo(klass, name, signature, KlassHandle(), false),
+                                       true,
                                        CHECK_(methodHandle()));
   return info.selected_method();
 }
--- a/hotspot/src/share/vm/services/diagnosticCommand.cpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp	Wed Jul 05 20:37:47 2017 +0200
@@ -315,7 +315,7 @@
 
 void SystemGCDCmd::execute(DCmdSource source, TRAPS) {
   if (!DisableExplicitGC) {
-    Universe::heap()->collect(GCCause::_java_lang_system_gc);
+    Universe::heap()->collect(GCCause::_dcmd_gc_run);
   } else {
     output()->print_cr("Explicit GC is disabled, no GC has been performed.");
   }
--- a/hotspot/src/share/vm/utilities/fakeRttiSupport.hpp	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/utilities/fakeRttiSupport.hpp	Wed Jul 05 20:37:47 2017 +0200
@@ -89,11 +89,11 @@
     return ((uintx)1) << validate_tag(tag);
   }
 
-  static TagType validate_tag(uintx tag) {
-    // Type of tag is not TagType to dodge useless MacOSX compiler warning.
-    assert(tag < (sizeof(uintx) * BitsPerByte),
-           err_msg("Tag " UINTX_FORMAT " is too large", tag));
-    return static_cast<TagType>(tag);
+  static TagType validate_tag(TagType tag) {
+    assert(0 <= tag, err_msg("Tag " INTX_FORMAT " is negative", (intx)tag));
+    assert(tag < BitsPerWord,
+           err_msg("Tag " UINTX_FORMAT " is too large", (uintx)tag));
+    return tag;
   }
 };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/arraycopy/TestDeadArrayCopyOnMemChain.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8080699
+ * @summary eliminated arraycopy node still reachable through exception edges
+ * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation TestDeadArrayCopyOnMemChain
+ *
+ */
+
+public class TestDeadArrayCopyOnMemChain {
+    static class A {
+        int f;
+    }
+
+    static void test_helper(Object o) {
+    }
+
+    static void test(int src_off, boolean flag) {
+        // dst is eliminated first. Eliminating dst causes src to be
+        // eliminated. When working on the safepoint at the uncommon
+        // trap in the exception handler, the eliminated ArrayCopyNode
+        // is reached through the exception edges.
+        Object[] dst = new Object[10];
+        Object[] src = new Object[10];
+
+        // src_off causes the exception handler to be run sometimes
+        try {
+            System.arraycopy(src, src_off, dst, 0, 10);
+        } catch (IndexOutOfBoundsException ioobe) {
+            // flag always false so test becomes uncommon trap. Make
+            // sure src is live at the unc.
+            if (flag) {
+                test_helper(src);
+            }
+        }
+    }
+
+    static public void main(String[] args) {
+        for (int i = 0; i < 20000; i++) {
+            test((i%2) == 0 ? 0 : -1, false);
+        }
+    }
+}
--- a/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -24,12 +24,15 @@
 /**
  * @test
  * @bug 8057967
- * @ignore 8079205
- * @run main/bootclasspath -Xbatch java.lang.invoke.CallSiteDepContextTest
+ * @run main/bootclasspath -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+TraceClassUnloading
+ *                         -XX:+PrintCompilation -XX:+TraceDependencies -XX:+TraceReferenceGC
+ *                         -verbose:gc java.lang.invoke.CallSiteDepContextTest
  */
 package java.lang.invoke;
 
 import java.lang.ref.*;
+import java.lang.reflect.Field;
+
 import jdk.internal.org.objectweb.asm.*;
 import sun.misc.Unsafe;
 
@@ -96,6 +99,13 @@
         }
     }
 
+    public static void testHiddenDepField() throws Exception {
+        try {
+            Field f = MethodHandleNatives.CallSiteContext.class.getDeclaredField("vmdependencies");
+            throw new AssertionError("Context.dependencies field should be hidden");
+        } catch(NoSuchFieldException e) { /* expected */ }
+    }
+
     public static void testSharedCallSite() throws Throwable {
         Class<?> cls1 = UNSAFE.defineAnonymousClass(Object.class, getClassFile("CS_1"), null);
         Class<?> cls2 = UNSAFE.defineAnonymousClass(Object.class, getClassFile("CS_2"), null);
@@ -132,12 +142,14 @@
     static ReferenceQueue rq = new ReferenceQueue();
     static PhantomReference ref;
 
-    public static void testGC() throws Throwable {
+    public static void testGC(boolean clear, boolean precompile) throws Throwable {
+        String id = "_" + clear + "_" + precompile;
+
         mcs = new MutableCallSite(LOOKUP.findStatic(T.class, "f1", TYPE));
 
         Class<?>[] cls = new Class[] {
-                UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_1"), null),
-                UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_2"), null),
+                UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_1" + id), null),
+                UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_2" + id), null),
         };
 
         MethodHandle[] mhs = new MethodHandle[] {
@@ -151,30 +163,38 @@
         execute(1, mhs);
 
         ref = new PhantomReference<>(cls[0], rq);
-        cls[0] = UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_3"), null);
+        cls[0] = UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_3" + id), null);
         mhs[0] = LOOKUP.findStatic(cls[0], METHOD_NAME, TYPE);
 
         do {
             System.gc();
             try {
-                Reference ref1 = rq.remove(1000);
+                Reference ref1 = rq.remove(100);
                 if (ref1 == ref) {
-                    ref1.clear();
-                    System.gc(); // Ensure that the stale context is cleared
                     break;
                 }
             } catch(InterruptedException e) { /* ignore */ }
         } while (true);
 
-        execute(1, mhs);
+        if (clear) {
+            ref.clear();
+            System.gc(); // Ensure that the stale context is unloaded
+        }
+        if (precompile) {
+            execute(1, mhs);
+        }
         mcs.setTarget(LOOKUP.findStatic(T.class, "f2", TYPE));
         execute(2, mhs);
     }
 
     public static void main(String[] args) throws Throwable {
+        testHiddenDepField();
         testSharedCallSite();
         testNonBoundCallSite();
-        testGC();
+        testGC(false, false);
+        testGC(false,  true);
+        testGC( true, false);
+        testGC( true,  true);
         System.out.println("TEST PASSED");
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/loopopts/superword/TestReductionWithLoopVariantUse.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8080976
+ * @summary Loop variant use in reduction should prevent vectorization
+ * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestReductionWithLoopVariantUse
+ *
+ */
+
+public class TestReductionWithLoopVariantUse {
+    static int m(int[] array) {
+        int c = 0;
+        for (int i = 0; i < 256; i++) {
+            c += array[i];
+            array[i] = c;
+        }
+        return c;
+    }
+
+    static public void main(String[] args) {
+        int[] array = new int[256];
+        int[] array2 = new int[256];
+        for (int j = 0; j < 256; j++) {
+            array2[j] = j;
+        }
+        for (int i = 0; i < 20000; i++) {
+            System.arraycopy(array2, 0, array, 0, 256);
+            int res = m(array);
+            boolean success = true;
+            int c = 0;
+            for (int j = 0; j < 256; j++) {
+                c += array2[j];
+                if (array[j] != c) {
+                    System.out.println("Failed for " + j + " : " + array[j] + " != " + c);
+                    success = false;
+                }
+            }
+            if (c != res) {
+                System.out.println("Failed for sum: " + c + " != " + res);
+            }
+            if (!success) {
+                throw new RuntimeException("Test failed");
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/types/TestTypePropagationToCmpU.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8080156 8060036
+ * @summary Test correctness of type propagation to CmpUNodes.
+ * @run main TestTypePropagationToCmpU
+ */
+public class TestTypePropagationToCmpU {
+    public static void main(String[] args) {
+        try {
+            // Trigger compilation
+            for (int i = 0; i < 100_000; ++i) {
+                test();
+            }
+        } catch (NullPointerException e) {
+            // Test should never throw a NullPointerException
+            throw new RuntimeException("Test failed");
+        }
+    }
+
+    static int global = 42;
+
+    public static void test() {
+        int a = Integer.MIN_VALUE;
+        int b = global;
+        char[] buf = { 0 };
+        for (int i = 0; i <= b; ++i) {
+            a = i - b;
+        }
+        // C2 adds a range check and an uncommon trap here to ensure that the array index
+        // is in bounds. If type information is not propagated correctly to the corresponding
+        // CmpUNode, this trap may be always taken. Because C2 also removes the unnecessary
+        // allocation of 'buf', a NullPointerException is thrown in this case.
+        char c = buf[(a * 11) / 2 - a]; // a is 0 here if global >= 0
+        buf[0] = 0;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8077504
+ * @summary Unsafe load can loose control dependency and cause crash
+ * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestUnsafeLoadControl
+ *
+ */
+
+import java.lang.reflect.Field;
+import sun.misc.Unsafe;
+
+public class TestUnsafeLoadControl {
+
+    private static final Unsafe UNSAFE;
+
+    static {
+        try {
+            Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
+            unsafeField.setAccessible(true);
+            UNSAFE = (Unsafe) unsafeField.get(null);
+        } catch(Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    static int val;
+    static void test1(int[] a, boolean[] flags, boolean flag, long j) {
+        for (int i = 0; i < 10; i++) {
+            if (flags[i]) {
+                if (flag) {
+                    long address = (j << 2) + UNSAFE.ARRAY_INT_BASE_OFFSET;
+                    int v = UNSAFE.getInt(a, address);
+                    val = v;
+                }
+            }
+        }
+    }
+
+    static int test2(int[] a, boolean[] flags, boolean flag, long j) {
+        int sum = 0;
+        for (int i = 0; i < 10; i++) {
+            if (flags[i]) {
+                if (flag) {
+                    long address = (j << 2) + UNSAFE.ARRAY_INT_BASE_OFFSET;
+                    int v = UNSAFE.getInt(a, address);
+                    if (v == 0) {
+                        sum++;
+                    }
+                }
+            }
+        }
+        return sum;
+    }
+
+    static public void main(String[] args) {
+        boolean[] flags = new boolean[10];
+        for (int i = 0; i < flags.length; i++) {
+            flags[i] = true;
+        }
+        int[] array = new int[10];
+        for (int i = 0; i < 20000; i++) {
+            test1(array, flags, true, 0);
+        }
+        for (int i = 0; i < flags.length; i++) {
+            flags[i] = false;
+        }
+        test1(array, flags, true, Long.MAX_VALUE/4);
+
+        for (int i = 0; i < flags.length; i++) {
+            flags[i] = true;
+        }
+        for (int i = 0; i < 20000; i++) {
+            test2(array, flags, true, 0);
+        }
+        for (int i = 0; i < flags.length; i++) {
+            flags[i] = false;
+        }
+        test2(array, flags, true, Long.MAX_VALUE/4);
+    }
+}
--- a/hotspot/test/gc/TestSmallHeap.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/gc/TestSmallHeap.java	Wed Jul 05 20:37:47 2017 +0200
@@ -27,6 +27,7 @@
  * @requires vm.gc=="null"
  * @requires (vm.opt.AggressiveOpts=="null") | (vm.opt.AggressiveOpts=="false")
  * @requires vm.compMode != "Xcomp"
+ * @requires vm.opt.UseCompressedOops != false
  * @summary Verify that starting the VM with a small heap works
  * @library /testlibrary /../../test/lib
  * @modules java.management/sun.management
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jni/ToStringInInterfaceTest/ImplementationOfWithToString.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Implementation of InterfaceWithToString.
+ */
+public class ImplementationOfWithToString implements InterfaceWithToString {
+
+  /**
+   * @see InterfaceWithToString#someMethod()
+   * {@inheritDoc}
+   */
+  @Override
+  public void someMethod() {
+    // May do something here.
+  }
+
+  /**
+   * @see java.lang.Object#toString()
+   * {@inheritDoc}
+   */
+  @Override
+  public String toString() {
+    return "toString() from " + getClass().getName();
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jni/ToStringInInterfaceTest/InterfaceWithToString.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Interface with toString declared.
+ */
+public interface InterfaceWithToString {
+
+  void someMethod();
+
+  /**
+   * Same as Object.toString().
+   *
+   * @return some custom string.
+   */
+  String toString();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jni/ToStringInInterfaceTest/ToStringTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 8072588
+ * @build InterfaceWithToString
+ * @build ImplementationOfWithToString
+ * @run main/native ToStringTest
+ */
+public final class ToStringTest {
+
+    static {
+        System.loadLibrary("ToStringTest");
+    }
+
+    native static void nTest();
+
+    public static void main(String[] args) throws Exception {
+        nTest();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jni/ToStringInInterfaceTest/libToStringTest.c	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Native test for ToStringInInterfaceTest.
+ */
+
+#include "jni.h"
+
+#define checkException(env) if ((*env)->ExceptionCheck(env)) { return; }
+
+jstring callStringMethod(JNIEnv* env, jobject jobj, jmethodID id, ...)
+{
+    jstring value;
+
+    va_list ap;
+    va_start(ap, id);
+    value = (jstring)(*env)->CallObjectMethodV(env, jobj, id, ap);
+    va_end(ap);
+    return value;
+}
+
+JNIEXPORT void JNICALL Java_ToStringTest_nTest(JNIEnv* env, jclass jclazz)
+{
+    jclass classOfInterfaceWithToString;
+    jclass classOfImplementationOfWithToString;
+    jmethodID constructorOfImplementationOfWithToString;
+    jobject instanceOfImplementationOfWithToString;
+    jmethodID toStringOfInterfaceWithToString;
+    jmethodID toStringOfImplementationOfWithToString;
+    jstring jstr;
+    const char *chars;
+
+    classOfInterfaceWithToString = (*env)->FindClass(env, "InterfaceWithToString");
+    checkException(env);
+    classOfImplementationOfWithToString = (*env)->FindClass(env, "ImplementationOfWithToString");
+    checkException(env);
+
+    constructorOfImplementationOfWithToString = (*env)->GetMethodID(env, classOfImplementationOfWithToString, "<init>", "()V");
+    checkException(env);
+
+    instanceOfImplementationOfWithToString = (*env)->NewObject(env, classOfImplementationOfWithToString, constructorOfImplementationOfWithToString);
+    checkException(env);
+
+    toStringOfInterfaceWithToString = (*env)->GetMethodID(env, classOfInterfaceWithToString, "toString", "()Ljava/lang/String;");
+    checkException(env);
+
+    toStringOfImplementationOfWithToString = (*env)->GetMethodID(env, classOfImplementationOfWithToString, "toString", "()Ljava/lang/String;");
+    checkException(env);
+
+    jstr = callStringMethod(env, instanceOfImplementationOfWithToString, toStringOfImplementationOfWithToString);
+    checkException(env);
+
+    chars = (*env)->GetStringUTFChars(env, jstr, NULL);
+    (*env)->ReleaseStringUTFChars(env, jstr, chars);
+
+    jstr = callStringMethod(env, instanceOfImplementationOfWithToString, toStringOfInterfaceWithToString);
+    checkException(env);
+
+    chars = (*env)->GetStringUTFChars(env, jstr, NULL);
+    (*env)->ReleaseStringUTFChars(env, jstr, chars);
+}
--- a/hotspot/test/serviceability/dcmd/gc/RunGCTest.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/serviceability/dcmd/gc/RunGCTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -59,7 +59,7 @@
         }
 
         OutputAnalyzer output = new OutputAnalyzer(gcLog, "");
-        output.shouldMatch(".*\\[Full GC \\(System(\\.gc\\(\\))?.*");
+        output.shouldContain("[Full GC (Diagnostic Command)");
     }
 
     @Test
--- a/hotspot/test/serviceability/sa/TestClassLoaderStats.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/serviceability/sa/TestClassLoaderStats.java	Wed Jul 05 20:37:47 2017 +0200
@@ -24,11 +24,14 @@
 import jdk.test.lib.Platform;
 import jdk.test.lib.ProcessTools;
 import jdk.test.lib.OutputAnalyzer;
+import jdk.test.lib.apps.LingeredApp;
 
 /*
  * @test
+ * @library /../../test/lib/share/classes
  * @library /testlibrary
  * @build jdk.test.lib.*
+ * @build jdk.test.lib.apps.*
  * @run main TestClassLoaderStats
  */
 public class TestClassLoaderStats {
@@ -39,19 +42,27 @@
             return;
         }
 
-        ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
-                "-XX:+UsePerfData",
-                "sun.jvm.hotspot.tools.ClassLoaderStats",
-                Integer.toString(ProcessTools.getProcessId()));
-        OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
-        System.out.println(output.getOutput());
+        LingeredApp app = null;
+        try {
+            app = LingeredApp.startApp();
 
-        output.shouldHaveExitValue(0);
-        output.shouldContain("Debugger attached successfully.");
-        // The class loader stats header needs to be presented in the output:
-        output.shouldMatch("class_loader\\W+classes\\W+bytes\\W+parent_loader\\W+alive?\\W+type");
-        output.stderrShouldNotMatch("[E|e]xception");
-        output.stderrShouldNotMatch("[E|e]rror");
+            System.out.println("Attaching sun.jvm.hotspot.tools.ClassLoaderStats to " + app.getPid());
+            ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
+                    "-XX:+UsePerfData",
+                    "sun.jvm.hotspot.tools.ClassLoaderStats",
+                    Long.toString(app.getPid()));
+            OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
+            System.out.println(output.getOutput());
+
+            output.shouldHaveExitValue(0);
+            output.shouldContain("Debugger attached successfully.");
+            // The class loader stats header needs to be presented in the output:
+            output.shouldMatch("class_loader\\W+classes\\W+bytes\\W+parent_loader\\W+alive?\\W+type");
+            output.stderrShouldNotMatch("[E|e]xception");
+            output.stderrShouldNotMatch("[E|e]rror");
+        } finally {
+            app.stopApp();
+        }
     }
 
 }
--- a/hotspot/test/serviceability/sa/TestStackTrace.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/serviceability/sa/TestStackTrace.java	Wed Jul 05 20:37:47 2017 +0200
@@ -24,11 +24,14 @@
 import jdk.test.lib.OutputAnalyzer;
 import jdk.test.lib.Platform;
 import jdk.test.lib.ProcessTools;
+import jdk.test.lib.apps.LingeredApp;
 
 /*
  * @test
+ * @library /../../test/lib/share/classes
  * @library /testlibrary
  * @build jdk.test.lib.*
+ * @build jdk.test.lib.apps.*
  * @run main TestStackTrace
  */
 public class TestStackTrace {
@@ -39,17 +42,25 @@
             return;
         }
 
-        ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
-                "-XX:+UsePerfData",
-                "sun.jvm.hotspot.tools.StackTrace",
-                Integer.toString(ProcessTools.getProcessId()));
-        OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
-        System.out.println(output.getOutput());
+        LingeredApp app = null;
+        try {
+            app = LingeredApp.startApp();
 
-        output.shouldHaveExitValue(0);
-        output.shouldContain("Debugger attached successfully.");
-        output.stderrShouldNotMatch("[E|e]xception");
-        output.stderrShouldNotMatch("[E|e]rror");
+            System.out.println("Attaching sun.jvm.hotspot.tools.StackTrace to " + app.getPid());
+            ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
+                    "-XX:+UsePerfData",
+                    "sun.jvm.hotspot.tools.StackTrace",
+                    Long.toString(app.getPid()));
+            OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
+            System.out.println(output.getOutput());
+
+            output.shouldHaveExitValue(0);
+            output.shouldContain("Debugger attached successfully.");
+            output.stderrShouldNotMatch("[E|e]xception");
+            output.stderrShouldNotMatch("[E|e]rror");
+        } finally {
+            app.stopApp();
+        }
      }
 
 }
--- a/jdk/.hgtags	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/.hgtags	Wed Jul 05 20:37:47 2017 +0200
@@ -310,3 +310,4 @@
 ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65
 4fbcca8ab812198c7fb747ea7b213b6e404f36e9 jdk9-b66
 1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67
+046fd17bb9a0cdf6681124866df9626d17b0516a jdk9-b68
--- a/jdk/make/lib/Lib-java.instrument.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-java.instrument.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -61,7 +61,7 @@
     OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
     SRC := $(LIBINSTRUMENT_SRC), \
     OPTIMIZATION := LOW, \
-    CFLAGS := $(LIBINSTRUMENT_CFLAGS) $(CFLAGS_WARNINGS_ARE_ERRORS), \
+    CFLAGS := $(LIBINSTRUMENT_CFLAGS), \
     CFLAGS_debug := -DJPLIS_LOGGING, \
     CFLAGS_release := -DNO_JPLIS_LOGGING, \
     MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libinstrument/mapfile-vers, \
--- a/jdk/make/lib/Lib-java.management.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-java.management.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -50,7 +50,7 @@
     OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
     SRC := $(LIBMANAGEMENT_SRC), \
     OPTIMIZATION := $(LIBMANAGEMENT_OPTIMIZATION), \
-    CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) $(LIBMANAGEMENT_CFLAGS), \
+    CFLAGS := $(CFLAGS_JDKLIB) $(LIBMANAGEMENT_CFLAGS), \
     MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement/mapfile-vers, \
     LDFLAGS := $(LDFLAGS_JDKLIB) \
         $(call SET_SHARED_LIBRARY_ORIGIN), \
--- a/jdk/make/lib/Lib-jdk.attach.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.attach.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -39,7 +39,7 @@
     OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
     SRC := $(call FindSrcDirsForLib, jdk.attach, attach), \
     OPTIMIZATION := LOW, \
-    CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
+    CFLAGS := $(CFLAGS_JDKLIB) \
         -I$(SUPPORT_OUTPUTDIR)/headers/jdk.attach \
         $(LIBJAVA_HEADER_FLAGS) $(LIBATTACH_CFLAGS), \
     CFLAGS_windows := /Gy, \
--- a/jdk/make/lib/Lib-jdk.hprof.agent.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.hprof.agent.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,7 @@
 
 BUILD_LIBHPROF_CFLAGS := $(addprefix -I, $(BUILD_LIBHPROF_SRC)) \
     -I$(JDK_TOPDIR)/src/demo/share/jvmti/java_crw_demo
-    
+
 BUILD_LIBHPROF_LDFLAGS :=
 
 LIBHPROF_OPTIMIZATION := HIGHEST
@@ -46,7 +46,7 @@
     OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
     SRC := $(BUILD_LIBHPROF_SRC), \
     OPTIMIZATION := $(LIBHPROF_OPTIMIZATION), \
-    CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
+    CFLAGS := $(CFLAGS_JDKLIB) \
         $(BUILD_LIBHPROF_CFLAGS), \
     CFLAGS_debug := -DHPROF_LOGGING, \
     MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libhprof/mapfile-vers, \
@@ -75,7 +75,7 @@
     OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
     SRC := $(LIBJAVA_CRW_DEMO_SRC), \
     OPTIMIZATION := LOW, \
-    CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
+    CFLAGS := $(CFLAGS_JDKLIB) \
         $(addprefix -I, $(LIBJAVA_CRW_DEMO_SRC)), \
     MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjava_crw_demo/mapfile-vers, \
     LDFLAGS := $(LDFLAGS_JDKLIB) \
--- a/jdk/make/lib/Lib-jdk.jdi.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.jdi.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -44,7 +44,7 @@
       OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
       SRC := $(LIBDT_SHMEM_SRC), \
       OPTIMIZATION := LOW, \
-      CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DUSE_MMAP \
+      CFLAGS := $(CFLAGS_JDKLIB) -DUSE_MMAP \
           $(LIBDT_SHMEM_CPPFLAGS), \
       LDFLAGS := $(LDFLAGS_JDKLIB), \
       LDFLAGS_windows := -export:jdwpTransport_OnLoad, \
--- a/jdk/make/lib/Lib-jdk.jdwp.agent.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.jdwp.agent.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -41,7 +41,7 @@
     OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
     SRC := $(LIBDT_SOCKET_SRC), \
     OPTIMIZATION := LOW, \
-    CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_CFLAGS_WARNINGS_ARE_ERRORS) -DUSE_MMAP \
+    CFLAGS := $(CFLAGS_JDKLIB) -DUSE_MMAP \
         $(LIBDT_SOCKET_CPPFLAGS), \
     MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libdt_socket/mapfile-vers, \
     LDFLAGS := $(LDFLAGS_JDKLIB) \
@@ -77,7 +77,7 @@
     OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
     SRC := $(LIBJDWP_SRC), \
     OPTIMIZATION := LOW, \
-    CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DJDWP_LOGGING \
+    CFLAGS := $(CFLAGS_JDKLIB) -DJDWP_LOGGING \
         $(LIBJDWP_CPPFLAGS) \
         -I$(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent, \
     MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjdwp/mapfile-vers, \
--- a/jdk/make/lib/Lib-jdk.management.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.management.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -59,7 +59,7 @@
     SRC := $(LIBMANAGEMENT_EXT_SRC), \
     LANG := C, \
     OPTIMIZATION := $(LIBMANAGEMENT_EXT_OPTIMIZATION), \
-    CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) $(LIBMANAGEMENT_EXT_CFLAGS), \
+    CFLAGS := $(CFLAGS_JDKLIB) $(LIBMANAGEMENT_EXT_CFLAGS), \
     MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement_ext/mapfile-vers, \
     LDFLAGS := $(LDFLAGS_JDKLIB) \
         $(call SET_SHARED_LIBRARY_ORIGIN), \
--- a/jdk/make/lib/Lib-jdk.sctp.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.sctp.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -30,12 +30,8 @@
 ifeq ($(OPENJDK_TARGET_OS_TYPE), unix)
 
   ifeq (, $(filter $(OPENJDK_TARGET_OS), macosx aix))
-
-    # Suppress unused parameters required by exported JNI functions.
-    SCTP_WERROR := -Werror -Wno-error=unused-parameter
-    ifeq ($(OPENJDK_TARGET_CPU_ARCH), ppc)
-      SCTP_WERROR :=
-    endif
+    # DISABLED_WARNINGS_gcc := unused-parameter needed to
+    # suppress unused parameters required by exported JNI functions.
 
     $(eval $(call SetupNativeCompilation,BUILD_LIBSCTP, \
         LIBRARY := sctp, \
@@ -49,7 +45,7 @@
             $(LIBJAVA_HEADER_FLAGS) \
             -I$(SUPPORT_OUTPUTDIR)/headers/jdk.sctp \
             -I$(SUPPORT_OUTPUTDIR)/headers/java.base, \
-        CFLAGS_linux := $(SCTP_WERROR), \
+        DISABLED_WARNINGS_gcc := unused-parameter, \
         MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libsctp/mapfile-vers, \
         LDFLAGS := $(LDFLAGS_JDKLIB) \
             $(call SET_SHARED_LIBRARY_ORIGIN), \
--- a/jdk/make/mapfiles/libjava/mapfile-vers	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/mapfiles/libjava/mapfile-vers	Wed Jul 05 20:37:47 2017 +0200
@@ -129,11 +129,11 @@
 		Java_java_lang_ClassLoader_defineClass0;
 		Java_java_lang_ClassLoader_defineClass1;
 		Java_java_lang_ClassLoader_defineClass2;
+		Java_java_lang_ClassLoader_findBuiltinLib;
 		Java_java_lang_ClassLoader_findLoadedClass0;
 		Java_java_lang_ClassLoader_00024NativeLibrary_find;
 		Java_java_lang_ClassLoader_00024NativeLibrary_load;
 		Java_java_lang_ClassLoader_00024NativeLibrary_unload;
-		Java_java_lang_ClassLoader_00024NativeLibrary_findBuiltinLib;
 		Java_java_lang_ClassLoader_registerNatives;
 		Java_java_lang_Double_longBitsToDouble;
 		Java_java_lang_Double_doubleToRawLongBits;
--- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java	Wed Jul 05 20:37:47 2017 +0200
@@ -58,7 +58,7 @@
      *
      * @param contextSpi the delegate
      * @param provider the provider
-     * @param algorithm the algorithm
+     * @param protocol the protocol
      */
     protected SSLContext(SSLContextSpi contextSpi, Provider provider,
         String protocol) {
--- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java	Wed Jul 05 20:37:47 2017 +0200
@@ -49,9 +49,9 @@
     /**
      * Initializes this context.
      *
-     * @param km the sources of authentication keys
-     * @param tm the sources of peer authentication trust decisions
-     * @param random the source of randomness for this generator
+     * @param ah the sources of authentication keys
+     * @param th the sources of peer authentication trust decisions
+     * @param sr the source of randomness for this generator
      */
     protected abstract void engineInit(KeyManager[] ah, TrustManager[] th,
         SecureRandom sr) throws KeyManagementException;
--- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java	Wed Jul 05 20:37:47 2017 +0200
@@ -52,7 +52,6 @@
  * The following table lists all the possible SSLPermission target names,
  * and for each provides a description of what the permission allows
  * and a discussion of the risks of granting code the permission.
- * <P>
  *
  * <table border=1 cellpadding=5>
  * <tr>
--- a/jdk/src/java.base/share/classes/java/io/File.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/io/File.java	Wed Jul 05 20:37:47 2017 +0200
@@ -2148,7 +2148,7 @@
      * WriteObject is called to save this filename.
      * The separator character is saved also so it can be replaced
      * in case the path is reconstituted on a different host type.
-     * <p>
+     *
      * @serialData  Default fields followed by separator character.
      */
     private synchronized void writeObject(java.io.ObjectOutputStream s)
--- a/jdk/src/java.base/share/classes/java/io/FilePermission.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -27,11 +27,9 @@
 
 import java.security.*;
 import java.util.Enumeration;
-import java.util.List;
-import java.util.ArrayList;
+import java.util.StringJoiner;
 import java.util.Vector;
-import java.util.Collections;
-import java.util.StringJoiner;
+import java.util.concurrent.ConcurrentHashMap;
 import sun.security.util.SecurityConstants;
 
 /**
@@ -288,7 +286,6 @@
      * @param path the pathname of the file/directory.
      * @param mask the action mask to use.
      */
-
     // package private for use by the FilePermissionCollection add method
     FilePermission(String path, int mask) {
         super(path);
@@ -315,6 +312,7 @@
      *                  <code>null</code> and is implied by this object,
      *                  <code>false</code> otherwise.
      */
+    @Override
     public boolean implies(Permission p) {
         if (!(p instanceof FilePermission))
             return false;
@@ -387,6 +385,7 @@
      *          pathname and actions as this FilePermission object,
      *          <code>false</code> otherwise.
      */
+    @Override
     public boolean equals(Object obj) {
         if (obj == this)
             return true;
@@ -407,6 +406,7 @@
      *
      * @return a hash code value for this object.
      */
+    @Override
     public int hashCode() {
         return 0;
     }
@@ -587,6 +587,7 @@
      *
      * @return the canonical string representation of the actions.
      */
+    @Override
     public String getActions() {
         if (actions == null)
             actions = getActions(this.mask);
@@ -625,6 +626,7 @@
      * @return a new PermissionCollection object suitable for storing
      * FilePermissions.
      */
+    @Override
     public PermissionCollection newPermissionCollection() {
         return new FilePermissionCollection();
     }
@@ -689,13 +691,13 @@
     implements Serializable
 {
     // Not serialized; see serialization section at end of class
-    private transient List<Permission> perms;
+    private transient ConcurrentHashMap<String, Permission> perms;
 
     /**
      * Create an empty FilePermissionCollection object.
      */
     public FilePermissionCollection() {
-        perms = new ArrayList<>();
+        perms = new ConcurrentHashMap<>();
     }
 
     /**
@@ -710,6 +712,7 @@
      * @exception SecurityException - if this FilePermissionCollection object
      *                                has been marked readonly
      */
+    @Override
     public void add(Permission permission) {
         if (! (permission instanceof FilePermission))
             throw new IllegalArgumentException("invalid permission: "+
@@ -718,9 +721,31 @@
             throw new SecurityException(
                 "attempt to add a Permission to a readonly PermissionCollection");
 
-        synchronized (this) {
-            perms.add(permission);
-        }
+        FilePermission fp = (FilePermission)permission;
+
+        // Add permission to map if it is absent, or replace with new
+        // permission if applicable. NOTE: cannot use lambda for
+        // remappingFunction parameter until JDK-8076596 is fixed.
+        perms.merge(fp.getName(), fp,
+            new java.util.function.BiFunction<>() {
+                @Override
+                public Permission apply(Permission existingVal,
+                                        Permission newVal) {
+                    int oldMask = ((FilePermission)existingVal).getMask();
+                    int newMask = ((FilePermission)newVal).getMask();
+                    if (oldMask != newMask) {
+                        int effective = oldMask | newMask;
+                        if (effective == newMask) {
+                            return newVal;
+                        }
+                        if (effective != oldMask) {
+                            return new FilePermission(fp.getName(), effective);
+                        }
+                    }
+                    return existingVal;
+                }
+            }
+        );
     }
 
     /**
@@ -732,26 +757,25 @@
      * @return true if "permission" is a proper subset of a permission in
      * the set, false if not.
      */
+    @Override
     public boolean implies(Permission permission) {
         if (! (permission instanceof FilePermission))
             return false;
 
-        FilePermission fp = (FilePermission) permission;
+        FilePermission fperm = (FilePermission) permission;
 
-        int desired = fp.getMask();
+        int desired = fperm.getMask();
         int effective = 0;
         int needed = desired;
 
-        synchronized (this) {
-            int len = perms.size();
-            for (int i = 0; i < len; i++) {
-                FilePermission x = (FilePermission) perms.get(i);
-                if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(fp)) {
-                    effective |=  x.getMask();
-                    if ((effective & desired) == desired)
-                        return true;
-                    needed = (desired ^ effective);
+        for (Permission perm : perms.values()) {
+            FilePermission fp = (FilePermission)perm;
+            if (((needed & fp.getMask()) != 0) && fp.impliesIgnoreMask(fperm)) {
+                effective |= fp.getMask();
+                if ((effective & desired) == desired) {
+                    return true;
                 }
+                needed = (desired ^ effective);
             }
         }
         return false;
@@ -763,11 +787,9 @@
      *
      * @return an enumeration of all the FilePermission objects.
      */
+    @Override
     public Enumeration<Permission> elements() {
-        // Convert Iterator into Enumeration
-        synchronized (this) {
-            return Collections.enumeration(perms);
-        }
+        return perms.elements();
     }
 
     private static final long serialVersionUID = 2202956749081564585L;
@@ -795,10 +817,7 @@
         // Don't call out.defaultWriteObject()
 
         // Write out Vector
-        Vector<Permission> permissions = new Vector<>(perms.size());
-        synchronized (this) {
-            permissions.addAll(perms);
-        }
+        Vector<Permission> permissions = new Vector<>(perms.values());
 
         ObjectOutputStream.PutField pfields = out.putFields();
         pfields.put("permissions", permissions);
@@ -819,7 +838,9 @@
         // Get the one we want
         @SuppressWarnings("unchecked")
         Vector<Permission> permissions = (Vector<Permission>)gfields.get("permissions", null);
-        perms = new ArrayList<>(permissions.size());
-        perms.addAll(permissions);
+        perms = new ConcurrentHashMap<>(permissions.size());
+        for (Permission perm : permissions) {
+            perms.put(perm.getName(), perm);
+        }
     }
 }
--- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1702,7 +1702,6 @@
 
         native long find(String name);
         native void unload(String name, boolean isBuiltin);
-        static native String findBuiltinLib(String name);
 
         public NativeLibrary(Class<?> fromClass, String name, boolean isBuiltin) {
             this.name = name;
@@ -1861,9 +1860,11 @@
         throw new UnsatisfiedLinkError("no " + name + " in java.library.path");
     }
 
+    static native String findBuiltinLib(String name);
+
     private static boolean loadLibrary0(Class<?> fromClass, final File file) {
         // Check to see if we're attempting to access a static library
-        String name = NativeLibrary.findBuiltinLib(file.getName());
+        String name = findBuiltinLib(file.getName());
         boolean isBuiltin = (name != null);
         if (!isBuiltin) {
             name = AccessController.doPrivileged(
--- a/jdk/src/java.base/share/classes/java/lang/Process.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Process.java	Wed Jul 05 20:37:47 2017 +0200
@@ -368,7 +368,7 @@
      * Processes returned from {@link ProcessBuilder#start} override the
      * default implementation to provide an efficient mechanism to wait
      * for process exit.
-     * <p>
+     *
      * @apiNote
      * Using {@link #onExit() onExit} is an alternative to
      * {@link #waitFor() waitFor} that enables both additional concurrency
--- a/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java	Wed Jul 05 20:37:47 2017 +0200
@@ -71,7 +71,7 @@
  * The ability to control processes is also restricted by the native system,
  * ProcessHandle provides no more access to, or control over, the native process
  * than would be allowed by a native application.
- * <p>
+ *
  * @implSpec
  * In the case where ProcessHandles cannot be supported then the factory
  * methods must consistently throw {@link java.lang.UnsupportedOperationException}.
--- a/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java	Wed Jul 05 20:37:47 2017 +0200
@@ -27,8 +27,6 @@
 
 import static java.lang.invoke.MethodHandleStatics.*;
 import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
-import java.lang.reflect.Field;
-import sun.misc.Cleaner;
 
 /**
  * A {@code CallSite} is a holder for a variable {@link MethodHandle},
@@ -138,47 +136,9 @@
 
     /**
      * {@code CallSite} dependency context.
-     * VM uses context class to store nmethod dependencies on the call site target.
-     * Can be in 2 states: (a) null; or (b) {@code Cleaner} instance pointing to some Class instance.
-     * Lazily initialized when CallSite instance is linked to some indy call site or VM needs
-     * it to store dependencies. As a corollary, "null" context means there are no dependencies
-     * registered yet. {@code Cleaner} is used in 2 roles:
-     *   (a) context class access for VM;
-     *   (b) stale context class cleanup.
-     * {@code Cleaner} holds the context class until cleanup action is finished (see {@code PhantomReference}).
-     * Though it's impossible to get the context class using {@code Reference.get()}, VM extracts it directly
-     * from {@code Reference.referent} field.
-     */
-    private volatile Cleaner context = null;
-
-    /**
-     * Default context.
-     * VM uses it to initialize non-linked CallSite context.
+     * JVM uses CallSite.context to store nmethod dependencies on the call site target.
      */
-    private static class DefaultContext {}
-    private static final Cleaner DEFAULT_CONTEXT = makeContext(DefaultContext.class, null);
-
-    private static Cleaner makeContext(Class<?> referent, final CallSite holder) {
-        return Cleaner.create(referent,
-                new Runnable() {
-                    @Override public void run() {
-                        MethodHandleNatives.invalidateDependentNMethods(holder);
-                    }
-                });
-    }
-
-    /** Initialize context class used for nmethod dependency tracking */
-    /*package-private*/
-    void initContext(Class<?> newContext) {
-        // If there are concurrent actions, exactly one succeeds.
-        if (context == null) {
-            UNSAFE.compareAndSwapObject(this, CONTEXT_OFFSET, /*expected=*/null, makeContext(newContext, this));
-            // No need to care about failed CAS attempt.
-            // Since initContext is called from indy call site linkage in newContext class, there's no risk
-            // that the context class becomes dead while corresponding context cleaner is alive (causing cleanup
-            // action in the wrong context).
-        }
-    }
+    private final MethodHandleNatives.CallSiteContext context = MethodHandleNatives.CallSiteContext.make(this);
 
     /**
      * Returns the type of this call site's target.
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java	Wed Jul 05 20:37:47 2017 +0200
@@ -30,6 +30,7 @@
 import static java.lang.invoke.MethodHandleNatives.Constants.*;
 import static java.lang.invoke.MethodHandleStatics.*;
 import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
+import sun.misc.Cleaner;
 
 /**
  * The JVM interface for the method handles package is all here.
@@ -61,8 +62,27 @@
     static native void setCallSiteTargetNormal(CallSite site, MethodHandle target);
     static native void setCallSiteTargetVolatile(CallSite site, MethodHandle target);
 
-    /** Invalidate CallSite context: clean up dependent nmethods and reset call site context to initial state (null). */
-    static native void invalidateDependentNMethods(CallSite site);
+    /** Represents a context to track nmethod dependencies on CallSite instance target. */
+    static class CallSiteContext implements Runnable {
+        //@Injected JVM_nmethodBucket* vmdependencies;
+
+        static CallSiteContext make(CallSite cs) {
+            final CallSiteContext newContext = new CallSiteContext();
+            // Cleaner is attached to CallSite instance and it clears native structures allocated for CallSite context.
+            // Though the CallSite can become unreachable, its Context is retained by the Cleaner instance (which is
+            // referenced from Cleaner class) until cleanup is performed.
+            Cleaner.create(cs, newContext);
+            return newContext;
+        }
+
+        @Override
+        public void run() {
+            MethodHandleNatives.clearCallSiteContext(this);
+        }
+    }
+
+    /** Invalidate all recorded nmethods. */
+    private static native void clearCallSiteContext(CallSiteContext context);
 
     private static native void registerNatives();
     static {
@@ -235,7 +255,6 @@
             return Invokers.linkToTargetMethod(type);
         } else {
             appendixResult[0] = callSite;
-            callSite.initContext(caller);
             return Invokers.linkToCallSiteMethod(type);
         }
     }
--- a/jdk/src/java.base/share/classes/java/net/SocketPermission.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/net/SocketPermission.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,24 +25,24 @@
 
 package java.net;
 
-import java.util.Enumeration;
-import java.util.Vector;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.StringJoiner;
-import java.util.StringTokenizer;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
+import java.io.Serializable;
 import java.net.InetAddress;
+import java.security.AccessController;
 import java.security.Permission;
 import java.security.PermissionCollection;
 import java.security.PrivilegedAction;
-import java.security.AccessController;
 import java.security.Security;
-import java.io.Serializable;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.Vector;
+import java.util.StringJoiner;
+import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentSkipListMap;
 import sun.net.util.IPAddressUtil;
 import sun.net.RegisteredDomain;
 import sun.net.PortConfig;
@@ -832,6 +832,7 @@
      * @return true if the specified permission is implied by this object,
      * false if not.
      */
+    @Override
     public boolean implies(Permission p) {
         int i,j;
 
@@ -1010,6 +1011,7 @@
      *  SocketPermission object. However, port range will be ignored
      *  in the comparison if <i>obj</i> only contains the action, 'resolve'.
      */
+    @Override
     public boolean equals(Object obj) {
         if (obj == this)
             return true;
@@ -1069,7 +1071,7 @@
      *
      * @return a hash code value for this object.
      */
-
+    @Override
     public int hashCode() {
         /*
          * If this SocketPermission was initialized with an IP address
@@ -1137,6 +1139,7 @@
      *
      * @return the canonical string representation of the actions.
      */
+    @Override
     public String getActions()
     {
         if (actions == null)
@@ -1156,7 +1159,7 @@
      *
      * @return a new PermissionCollection object suitable for storing SocketPermissions.
      */
-
+    @Override
     public PermissionCollection newPermissionCollection() {
         return new SocketPermissionCollection();
     }
@@ -1320,15 +1323,16 @@
     implements Serializable
 {
     // Not serialized; see serialization section at end of class
-    private transient List<SocketPermission> perms;
+    // A ConcurrentSkipListMap is used to preserve order, so that most
+    // recently added permissions are checked first (see JDK-4301064).
+    private transient ConcurrentSkipListMap<String, SocketPermission> perms;
 
     /**
      * Create an empty SocketPermissions object.
      *
      */
-
     public SocketPermissionCollection() {
-        perms = new ArrayList<>();
+        perms = new ConcurrentSkipListMap<>(new SPCComparator());
     }
 
     /**
@@ -1343,6 +1347,7 @@
      * @exception SecurityException - if this SocketPermissionCollection object
      *                                has been marked readonly
      */
+    @Override
     public void add(Permission permission) {
         if (! (permission instanceof SocketPermission))
             throw new IllegalArgumentException("invalid permission: "+
@@ -1351,11 +1356,32 @@
             throw new SecurityException(
                 "attempt to add a Permission to a readonly PermissionCollection");
 
-        // optimization to ensure perms most likely to be tested
-        // show up early (4301064)
-        synchronized (this) {
-            perms.add(0, (SocketPermission)permission);
-        }
+        SocketPermission sp = (SocketPermission)permission;
+
+        // Add permission to map if it is absent, or replace with new
+        // permission if applicable. NOTE: cannot use lambda for
+        // remappingFunction parameter until JDK-8076596 is fixed.
+        perms.merge(sp.getName(), sp,
+            new java.util.function.BiFunction<>() {
+                @Override
+                public SocketPermission apply(SocketPermission existingVal,
+                                              SocketPermission newVal) {
+                    int oldMask = existingVal.getMask();
+                    int newMask = newVal.getMask();
+                    if (oldMask != newMask) {
+                        int effective = oldMask | newMask;
+                        if (effective == newMask) {
+                            return newVal;
+                        }
+                        if (effective != oldMask) {
+                            return new SocketPermission(sp.getName(),
+                                                        effective);
+                        }
+                    }
+                    return existingVal;
+                }
+            }
+        );
     }
 
     /**
@@ -1367,7 +1393,7 @@
      * @return true if "permission" is a proper subset of a permission in
      * the collection, false if not.
      */
-
+    @Override
     public boolean implies(Permission permission)
     {
         if (! (permission instanceof SocketPermission))
@@ -1379,18 +1405,15 @@
         int effective = 0;
         int needed = desired;
 
-        synchronized (this) {
-            int len = perms.size();
-            //System.out.println("implies "+np);
-            for (int i = 0; i < len; i++) {
-                SocketPermission x = perms.get(i);
-                //System.out.println("  trying "+x);
-                if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(np)) {
-                    effective |=  x.getMask();
-                    if ((effective & desired) == desired)
-                        return true;
-                    needed = (desired ^ effective);
+        //System.out.println("implies "+np);
+        for (SocketPermission x : perms.values()) {
+            //System.out.println("  trying "+x);
+            if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(np)) {
+                effective |=  x.getMask();
+                if ((effective & desired) == desired) {
+                    return true;
                 }
+                needed = (desired ^ effective);
             }
         }
         return false;
@@ -1402,13 +1425,10 @@
      *
      * @return an enumeration of all the SocketPermission objects.
      */
-
+    @Override
     @SuppressWarnings("unchecked")
     public Enumeration<Permission> elements() {
-        // Convert Iterator into Enumeration
-        synchronized (this) {
-            return Collections.enumeration((List<Permission>)(List)perms);
-        }
+        return (Enumeration)Collections.enumeration(perms.values());
     }
 
     private static final long serialVersionUID = 2787186408602843674L;
@@ -1441,11 +1461,7 @@
         // Don't call out.defaultWriteObject()
 
         // Write out Vector
-        Vector<SocketPermission> permissions = new Vector<>(perms.size());
-
-        synchronized (this) {
-            permissions.addAll(perms);
-        }
+        Vector<SocketPermission> permissions = new Vector<>(perms.values());
 
         ObjectOutputStream.PutField pfields = out.putFields();
         pfields.put("permissions", permissions);
@@ -1466,7 +1482,22 @@
         // Get the one we want
         @SuppressWarnings("unchecked")
         Vector<SocketPermission> permissions = (Vector<SocketPermission>)gfields.get("permissions", null);
-        perms = new ArrayList<>(permissions.size());
-        perms.addAll(permissions);
+        perms = new ConcurrentSkipListMap<>(new SPCComparator());
+        for (SocketPermission sp : permissions) {
+            perms.put(sp.getName(), sp);
+        }
+    }
+
+    /**
+     * A simple comparator that orders new non-equal entries at the beginning.
+     */
+    private static class SPCComparator implements Comparator<String> {
+        @Override
+        public int compare(String s1, String s2) {
+            if (s1.equals(s2)) {
+                return 0;
+            }
+            return -1;
+        }
     }
 }
--- a/jdk/src/java.base/share/classes/java/security/BasicPermission.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/security/BasicPermission.java	Wed Jul 05 20:37:47 2017 +0200
@@ -25,15 +25,13 @@
 
 package java.security;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
 import java.util.Enumeration;
-import java.util.Map;
-import java.util.HashMap;
 import java.util.Hashtable;
-import java.util.Collections;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * The BasicPermission class extends the Permission class, and
@@ -165,6 +163,7 @@
      * @return true if the passed permission is equal to or
      * implied by this permission, false otherwise.
      */
+    @Override
     public boolean implies(Permission p) {
         if ((p == null) || (p.getClass() != getClass()))
             return false;
@@ -200,6 +199,7 @@
      * @return true if {@code obj}'s class is the same as this object's class
      *  and has the same name as this BasicPermission object, false otherwise.
      */
+    @Override
     public boolean equals(Object obj) {
         if (obj == this)
             return true;
@@ -221,6 +221,7 @@
      *
      * @return a hash code value for this object.
      */
+    @Override
     public int hashCode() {
         return this.getName().hashCode();
     }
@@ -232,6 +233,7 @@
      *
      * @return the empty string "".
      */
+    @Override
     public String getActions() {
         return "";
     }
@@ -248,6 +250,7 @@
      * @return a new PermissionCollection object suitable for
      * storing BasicPermissions.
      */
+    @Override
     public PermissionCollection newPermissionCollection() {
         return new BasicPermissionCollection(this.getClass());
     }
@@ -308,7 +311,7 @@
       * collection must be of the same type.
       * Not serialized; see serialization section at end of class.
       */
-    private transient Map<String, Permission> perms;
+    private transient ConcurrentHashMap<String, Permission> perms;
 
     /**
      * This is set to {@code true} if this BasicPermissionCollection
@@ -320,7 +323,7 @@
 
     /**
      * The class to which all BasicPermissions in this
-     * BasicPermissionCollection belongs.
+     * BasicPermissionCollection belong.
      *
      * @see #serialPersistentFields
      */
@@ -330,9 +333,8 @@
      * Create an empty BasicPermissionCollection object.
      *
      */
-
     public BasicPermissionCollection(Class<?> clazz) {
-        perms = new HashMap<>(11);
+        perms = new ConcurrentHashMap<>(11);
         all_allowed = false;
         permClass = clazz;
     }
@@ -352,6 +354,7 @@
      * @exception SecurityException - if this BasicPermissionCollection object
      *                                has been marked readonly
      */
+    @Override
     public void add(Permission permission) {
         if (! (permission instanceof BasicPermission))
             throw new IllegalArgumentException("invalid permission: "+
@@ -373,13 +376,12 @@
                                                 permission);
         }
 
-        synchronized (this) {
-            perms.put(bp.getCanonicalName(), permission);
-        }
+        String canonName = bp.getCanonicalName();
+        perms.put(canonName, permission);
 
         // No sync on all_allowed; staleness OK
         if (!all_allowed) {
-            if (bp.getCanonicalName().equals("*"))
+            if (canonName.equals("*"))
                 all_allowed = true;
         }
     }
@@ -393,6 +395,7 @@
      * @return true if "permission" is a proper subset of a permission in
      * the set, false if not.
      */
+    @Override
     public boolean implies(Permission permission) {
         if (! (permission instanceof BasicPermission))
             return false;
@@ -414,11 +417,7 @@
         String path = bp.getCanonicalName();
         //System.out.println("check "+path);
 
-        Permission x;
-
-        synchronized (this) {
-            x = perms.get(path);
-        }
+        Permission x = perms.get(path);
 
         if (x != null) {
             // we have a direct hit!
@@ -435,9 +434,7 @@
             path = path.substring(0, last+1) + "*";
             //System.out.println("check "+path);
 
-            synchronized (this) {
-                x = perms.get(path);
-            }
+            x = perms.get(path);
 
             if (x != null) {
                 return x.implies(permission);
@@ -456,11 +453,9 @@
      *
      * @return an enumeration of all the BasicPermission objects.
      */
+    @Override
     public Enumeration<Permission> elements() {
-        // Convert Iterator of Map values into an Enumeration
-        synchronized (this) {
-            return Collections.enumeration(perms.values());
-        }
+        return perms.elements();
     }
 
     // Need to maintain serialization interoperability with earlier releases,
@@ -503,9 +498,7 @@
         Hashtable<String, Permission> permissions =
                 new Hashtable<>(perms.size()*2);
 
-        synchronized (this) {
-            permissions.putAll(perms);
-        }
+        permissions.putAll(perms);
 
         // Write out serializable fields
         ObjectOutputStream.PutField pfields = out.putFields();
@@ -533,7 +526,7 @@
         @SuppressWarnings("unchecked")
         Hashtable<String, Permission> permissions =
                 (Hashtable<String, Permission>)gfields.get("permissions", null);
-        perms = new HashMap<>(permissions.size()*2);
+        perms = new ConcurrentHashMap<>(permissions.size()*2);
         perms.putAll(permissions);
 
         // Get all_allowed
--- a/jdk/src/java.base/share/classes/java/security/Permissions.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/security/Permissions.java	Wed Jul 05 20:37:47 2017 +0200
@@ -33,6 +33,7 @@
 import java.util.List;
 import java.util.Iterator;
 import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
 import java.io.Serializable;
 import java.io.ObjectStreamField;
 import java.io.ObjectOutputStream;
@@ -85,7 +86,7 @@
      * Key is permissions Class, value is PermissionCollection for that class.
      * Not serialized; see serialization section at end of class.
      */
-    private transient Map<Class<?>, PermissionCollection> permsMap;
+    private transient ConcurrentHashMap<Class<?>, PermissionCollection> permsMap;
 
     // optimization. keep track of whether unresolved permissions need to be
     // checked
@@ -99,7 +100,7 @@
      * Creates a new Permissions object containing no PermissionCollections.
      */
     public Permissions() {
-        permsMap = new HashMap<>(11);
+        permsMap = new ConcurrentHashMap<>(11);
         allPermission = null;
     }
 
@@ -120,18 +121,14 @@
      *
      * @see PermissionCollection#isReadOnly()
      */
-
+    @Override
     public void add(Permission permission) {
         if (isReadOnly())
             throw new SecurityException(
               "attempt to add a Permission to a readonly Permissions object");
 
-        PermissionCollection pc;
-
-        synchronized (this) {
-            pc = getPermissionCollection(permission, true);
-            pc.add(permission);
-        }
+        PermissionCollection pc = getPermissionCollection(permission, true);
+        pc.add(permission);
 
         // No sync; staleness -> optimizations delayed, which is OK
         if (permission instanceof AllPermission) {
@@ -169,21 +166,19 @@
      * PermissionCollection it
      * belongs to, false if not.
      */
-
+    @Override
     public boolean implies(Permission permission) {
         // No sync; staleness -> skip optimization, which is OK
         if (allPermission != null) {
             return true; // AllPermission has already been added
         } else {
-            synchronized (this) {
-                PermissionCollection pc = getPermissionCollection(permission,
-                    false);
-                if (pc != null) {
-                    return pc.implies(permission);
-                } else {
-                    // none found
-                    return false;
-                }
+            PermissionCollection pc = getPermissionCollection(permission,
+                false);
+            if (pc != null) {
+                return pc.implies(permission);
+            } else {
+                // none found
+                return false;
             }
         }
     }
@@ -194,14 +189,12 @@
      *
      * @return an enumeration of all the Permissions.
      */
-
+    @Override
     public Enumeration<Permission> elements() {
         // go through each Permissions in the hash table
         // and call their elements() function.
 
-        synchronized (this) {
-            return new PermissionsEnumerator(permsMap.values().iterator());
-        }
+        return new PermissionsEnumerator(permsMap.values().iterator());
     }
 
     /**
@@ -236,34 +229,39 @@
      * It should be set to true when invoked from add().
      */
     private PermissionCollection getPermissionCollection(Permission p,
-        boolean createEmpty) {
+                                                         boolean createEmpty) {
         Class<?> c = p.getClass();
 
-        PermissionCollection pc = permsMap.get(c);
-
         if (!hasUnresolved && !createEmpty) {
-            return pc;
-        } else if (pc == null) {
+            return permsMap.get(c);
+        }
 
-            // Check for unresolved permissions
-            pc = (hasUnresolved ? getUnresolvedPermissions(p) : null);
-
-            // if still null, create a new collection
-            if (pc == null && createEmpty) {
-
-                pc = p.newPermissionCollection();
+        // Create and add permission collection to map if it is absent.
+        // NOTE: cannot use lambda for mappingFunction parameter until
+        // JDK-8076596 is fixed.
+        return permsMap.computeIfAbsent(c,
+            new java.util.function.Function<>() {
+                @Override
+                public PermissionCollection apply(Class<?> k) {
+                    // Check for unresolved permissions
+                    PermissionCollection pc =
+                        (hasUnresolved ? getUnresolvedPermissions(p) : null);
 
-                // still no PermissionCollection?
-                // We'll give them a PermissionsHash.
-                if (pc == null)
-                    pc = new PermissionsHash();
-            }
+                    // if still null, create a new collection
+                    if (pc == null && createEmpty) {
+
+                        pc = p.newPermissionCollection();
 
-            if (pc != null) {
-                permsMap.put(c, pc);
+                        // still no PermissionCollection?
+                        // We'll give them a PermissionsHash.
+                        if (pc == null) {
+                            pc = new PermissionsHash();
+                        }
+                    }
+                    return pc;
+                }
             }
-        }
-        return pc;
+        );
     }
 
     /**
@@ -277,8 +275,6 @@
      */
     private PermissionCollection getUnresolvedPermissions(Permission p)
     {
-        // Called from within synchronized method so permsMap doesn't need lock
-
         UnresolvedPermissionCollection uc =
         (UnresolvedPermissionCollection) permsMap.get(UnresolvedPermission.class);
 
@@ -362,9 +358,7 @@
         // Copy perms into a Hashtable
         Hashtable<Class<?>, PermissionCollection> perms =
             new Hashtable<>(permsMap.size()*2); // no sync; estimate
-        synchronized (this) {
-            perms.putAll(permsMap);
-        }
+        perms.putAll(permsMap);
 
         // Write out serializable fields
         ObjectOutputStream.PutField pfields = out.putFields();
@@ -394,7 +388,7 @@
         @SuppressWarnings("unchecked")
         Hashtable<Class<?>, PermissionCollection> perms =
             (Hashtable<Class<?>, PermissionCollection>)gfields.get("perms", null);
-        permsMap = new HashMap<>(perms.size()*2);
+        permsMap = new ConcurrentHashMap<>(perms.size()*2);
         permsMap.putAll(perms);
 
         // Set hasUnresolved
@@ -481,14 +475,13 @@
      * Key and value are (same) permissions objects.
      * Not serialized; see serialization section at end of class.
      */
-    private transient Map<Permission, Permission> permsMap;
+    private transient ConcurrentHashMap<Permission, Permission> permsMap;
 
     /**
      * Create an empty PermissionsHash object.
      */
-
     PermissionsHash() {
-        permsMap = new HashMap<>(11);
+        permsMap = new ConcurrentHashMap<>(11);
     }
 
     /**
@@ -496,11 +489,9 @@
      *
      * @param permission the Permission object to add.
      */
-
+    @Override
     public void add(Permission permission) {
-        synchronized (this) {
-            permsMap.put(permission, permission);
-        }
+        permsMap.put(permission, permission);
     }
 
     /**
@@ -512,23 +503,21 @@
      * @return true if "permission" is a proper subset of a permission in
      * the set, false if not.
      */
-
+    @Override
     public boolean implies(Permission permission) {
         // attempt a fast lookup and implies. If that fails
         // then enumerate through all the permissions.
-        synchronized (this) {
-            Permission p = permsMap.get(permission);
+        Permission p = permsMap.get(permission);
 
-            // If permission is found, then p.equals(permission)
-            if (p == null) {
-                for (Permission p_ : permsMap.values()) {
-                    if (p_.implies(permission))
-                        return true;
-                }
-                return false;
-            } else {
-                return true;
+        // If permission is found, then p.equals(permission)
+        if (p == null) {
+            for (Permission p_ : permsMap.values()) {
+                if (p_.implies(permission))
+                    return true;
             }
+            return false;
+        } else {
+            return true;
         }
     }
 
@@ -537,12 +526,9 @@
      *
      * @return an enumeration of all the Permissions.
      */
-
+    @Override
     public Enumeration<Permission> elements() {
-        // Convert Iterator of Map values into an Enumeration
-        synchronized (this) {
-            return Collections.enumeration(permsMap.values());
-        }
+        return permsMap.elements();
     }
 
     private static final long serialVersionUID = -8491988220802933440L;
@@ -570,9 +556,7 @@
         // Copy perms into a Hashtable
         Hashtable<Permission, Permission> perms =
                 new Hashtable<>(permsMap.size()*2);
-        synchronized (this) {
-            perms.putAll(permsMap);
-        }
+        perms.putAll(permsMap);
 
         // Write out serializable fields
         ObjectOutputStream.PutField pfields = out.putFields();
@@ -597,7 +581,7 @@
         @SuppressWarnings("unchecked")
         Hashtable<Permission, Permission> perms =
                 (Hashtable<Permission, Permission>)gfields.get("perms", null);
-        permsMap = new HashMap<>(perms.size()*2);
+        permsMap = new ConcurrentHashMap<>(perms.size()*2);
         permsMap.putAll(perms);
     }
 }
--- a/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,11 +25,13 @@
 
 package java.security;
 
-import java.util.*;
-import java.io.ObjectStreamField;
+import java.io.IOException;
+import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.io.ObjectStreamField;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
  * A UnresolvedPermissionCollection stores a collection
@@ -54,14 +56,14 @@
      * of the same type.
      * Not serialized; see serialization section at end of class.
      */
-    private transient Map<String, List<UnresolvedPermission>> perms;
+    private transient ConcurrentHashMap<String, List<UnresolvedPermission>> perms;
 
     /**
      * Create an empty UnresolvedPermissionCollection object.
      *
      */
     public UnresolvedPermissionCollection() {
-        perms = new HashMap<>(11);
+        perms = new ConcurrentHashMap<>(11);
     }
 
     /**
@@ -70,25 +72,32 @@
      *
      * @param permission the Permission object to add.
      */
-
-    public void add(Permission permission)
-    {
+    @Override
+    public void add(Permission permission) {
         if (! (permission instanceof UnresolvedPermission))
             throw new IllegalArgumentException("invalid permission: "+
                                                permission);
         UnresolvedPermission up = (UnresolvedPermission) permission;
 
-        List<UnresolvedPermission> v;
-        synchronized (this) {
-            v = perms.get(up.getName());
-            if (v == null) {
-                v = new ArrayList<>();
-                perms.put(up.getName(), v);
+        // Add permission to map. NOTE: cannot use lambda for
+        // remappingFunction parameter until JDK-8076596 is fixed.
+        perms.compute(up.getName(),
+            new java.util.function.BiFunction<>() {
+                @Override
+                public List<UnresolvedPermission> apply(String key,
+                                        List<UnresolvedPermission> oldValue) {
+                    if (oldValue == null) {
+                        List<UnresolvedPermission> v =
+                            new CopyOnWriteArrayList<>();
+                        v.add(up);
+                        return v;
+                    } else {
+                        oldValue.add(up);
+                        return oldValue;
+                    }
+                }
             }
-        }
-        synchronized (v) {
-            v.add(up);
-        }
+        );
     }
 
     /**
@@ -96,17 +105,15 @@
      * and return the List containing them.
      */
     List<UnresolvedPermission> getUnresolvedPermissions(Permission p) {
-        synchronized (this) {
-            return perms.get(p.getClass().getName());
-        }
+        return perms.get(p.getClass().getName());
     }
 
     /**
      * always returns false for unresolved permissions
      *
      */
-    public boolean implies(Permission permission)
-    {
+    @Override
+    public boolean implies(Permission permission) {
         return false;
     }
 
@@ -116,18 +123,14 @@
      *
      * @return an enumeration of all the UnresolvedPermission objects.
      */
-
+    @Override
     public Enumeration<Permission> elements() {
         List<Permission> results =
             new ArrayList<>(); // where results are stored
 
         // Get iterator of Map values (which are lists of permissions)
-        synchronized (this) {
-            for (List<UnresolvedPermission> l : perms.values()) {
-                synchronized (l) {
-                    results.addAll(l);
-                }
-            }
+        for (List<UnresolvedPermission> l : perms.values()) {
+            results.addAll(l);
         }
 
         return Collections.enumeration(results);
@@ -164,19 +167,14 @@
             new Hashtable<>(perms.size()*2);
 
         // Convert each entry (List) into a Vector
-        synchronized (this) {
-            Set<Map.Entry<String, List<UnresolvedPermission>>> set = perms.entrySet();
-            for (Map.Entry<String, List<UnresolvedPermission>> e : set) {
-                // Convert list into Vector
-                List<UnresolvedPermission> list = e.getValue();
-                Vector<UnresolvedPermission> vec = new Vector<>(list.size());
-                synchronized (list) {
-                    vec.addAll(list);
-                }
+        Set<Map.Entry<String, List<UnresolvedPermission>>> set = perms.entrySet();
+        for (Map.Entry<String, List<UnresolvedPermission>> e : set) {
+            // Convert list into Vector
+            List<UnresolvedPermission> list = e.getValue();
+            Vector<UnresolvedPermission> vec = new Vector<>(list);
 
-                // Add to Hashtable being serialized
-                permissions.put(e.getKey(), vec);
-            }
+            // Add to Hashtable being serialized
+            permissions.put(e.getKey(), vec);
         }
 
         // Write out serializable fields
@@ -203,15 +201,14 @@
         Hashtable<String, Vector<UnresolvedPermission>> permissions =
                 (Hashtable<String, Vector<UnresolvedPermission>>)
                 gfields.get("permissions", null);
-        perms = new HashMap<>(permissions.size()*2);
+        perms = new ConcurrentHashMap<>(permissions.size()*2);
 
         // Convert each entry (Vector) into a List
         Set<Map.Entry<String, Vector<UnresolvedPermission>>> set = permissions.entrySet();
         for (Map.Entry<String, Vector<UnresolvedPermission>> e : set) {
             // Convert Vector into ArrayList
             Vector<UnresolvedPermission> vec = e.getValue();
-            List<UnresolvedPermission> list = new ArrayList<>(vec.size());
-            list.addAll(vec);
+            List<UnresolvedPermission> list = new CopyOnWriteArrayList<>(vec);
 
             // Add to Hashtable being serialized
             perms.put(e.getKey(), list);
--- a/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java	Wed Jul 05 20:37:47 2017 +0200
@@ -2374,7 +2374,7 @@
     /**
      * After reading an object from the input stream, the format
      * pattern in the object is verified.
-     * <p>
+     *
      * @exception InvalidObjectException if the pattern is invalid
      */
     private void readObject(ObjectInputStream stream)
--- a/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -61,11 +61,6 @@
     private static final int MAX_RUN_COUNT = 67;
 
     /**
-     * The maximum length of run in merge sort.
-     */
-    private static final int MAX_RUN_LENGTH = 33;
-
-    /**
      * If the length of an array to be sorted is less than this
      * constant, Quicksort is used in preference to merge sort.
      */
@@ -121,20 +116,24 @@
 
         // Check if the array is nearly sorted
         for (int k = left; k < right; run[count] = k) {
+            // Equal items in the beginning of the sequence
+            while (k < right && a[k] == a[k + 1])
+                k++;
+            if (k == right) break;  // Sequence finishes with equal items
             if (a[k] < a[k + 1]) { // ascending
                 while (++k <= right && a[k - 1] <= a[k]);
             } else if (a[k] > a[k + 1]) { // descending
                 while (++k <= right && a[k - 1] >= a[k]);
+                // Transform into an ascending sequence
                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
                     int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                 }
-            } else { // equal
-                for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
-                    if (--m == 0) {
-                        sort(a, left, right, true);
-                        return;
-                    }
-                }
+            }
+
+            // Merge a transformed descending sequence followed by an
+            // ascending sequence
+            if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+                count--;
             }
 
             /*
@@ -151,7 +150,7 @@
         // Implementation note: variable "right" is increased by 1.
         if (run[count] == right++) { // The last run contains one element
             run[++count] = right;
-        } else if (count == 1) { // The array is already sorted
+        } else if (count <= 1) { // The array is already sorted
             return;
         }
 
@@ -569,20 +568,24 @@
 
         // Check if the array is nearly sorted
         for (int k = left; k < right; run[count] = k) {
+            // Equal items in the beginning of the sequence
+            while (k < right && a[k] == a[k + 1])
+                k++;
+            if (k == right) break;  // Sequence finishes with equal items
             if (a[k] < a[k + 1]) { // ascending
                 while (++k <= right && a[k - 1] <= a[k]);
             } else if (a[k] > a[k + 1]) { // descending
                 while (++k <= right && a[k - 1] >= a[k]);
+                // Transform into an ascending sequence
                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
                     long t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                 }
-            } else { // equal
-                for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
-                    if (--m == 0) {
-                        sort(a, left, right, true);
-                        return;
-                    }
-                }
+            }
+
+            // Merge a transformed descending sequence followed by an
+            // ascending sequence
+            if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+                count--;
             }
 
             /*
@@ -599,7 +602,7 @@
         // Implementation note: variable "right" is increased by 1.
         if (run[count] == right++) { // The last run contains one element
             run[++count] = right;
-        } else if (count == 1) { // The array is already sorted
+        } else if (count <= 1) { // The array is already sorted
             return;
         }
 
@@ -1053,20 +1056,24 @@
 
         // Check if the array is nearly sorted
         for (int k = left; k < right; run[count] = k) {
+            // Equal items in the beginning of the sequence
+            while (k < right && a[k] == a[k + 1])
+                k++;
+            if (k == right) break;  // Sequence finishes with equal items
             if (a[k] < a[k + 1]) { // ascending
                 while (++k <= right && a[k - 1] <= a[k]);
             } else if (a[k] > a[k + 1]) { // descending
                 while (++k <= right && a[k - 1] >= a[k]);
+                // Transform into an ascending sequence
                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
                     short t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                 }
-            } else { // equal
-                for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
-                    if (--m == 0) {
-                        sort(a, left, right, true);
-                        return;
-                    }
-                }
+            }
+
+            // Merge a transformed descending sequence followed by an
+            // ascending sequence
+            if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+                count--;
             }
 
             /*
@@ -1083,7 +1090,7 @@
         // Implementation note: variable "right" is increased by 1.
         if (run[count] == right++) { // The last run contains one element
             run[++count] = right;
-        } else if (count == 1) { // The array is already sorted
+        } else if (count <= 1) { // The array is already sorted
             return;
         }
 
@@ -1537,20 +1544,24 @@
 
         // Check if the array is nearly sorted
         for (int k = left; k < right; run[count] = k) {
+            // Equal items in the beginning of the sequence
+            while (k < right && a[k] == a[k + 1])
+                k++;
+            if (k == right) break;  // Sequence finishes with equal items
             if (a[k] < a[k + 1]) { // ascending
                 while (++k <= right && a[k - 1] <= a[k]);
             } else if (a[k] > a[k + 1]) { // descending
                 while (++k <= right && a[k - 1] >= a[k]);
+                // Transform into an ascending sequence
                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
                     char t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                 }
-            } else { // equal
-                for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
-                    if (--m == 0) {
-                        sort(a, left, right, true);
-                        return;
-                    }
-                }
+            }
+
+            // Merge a transformed descending sequence followed by an
+            // ascending sequence
+            if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+                count--;
             }
 
             /*
@@ -1567,7 +1578,7 @@
         // Implementation note: variable "right" is increased by 1.
         if (run[count] == right++) { // The last run contains one element
             run[++count] = right;
-        } else if (count == 1) { // The array is already sorted
+        } else if (count <= 1) { // The array is already sorted
             return;
         }
 
@@ -2117,20 +2128,24 @@
 
         // Check if the array is nearly sorted
         for (int k = left; k < right; run[count] = k) {
+            // Equal items in the beginning of the sequence
+            while (k < right && a[k] == a[k + 1])
+                k++;
+            if (k == right) break;  // Sequence finishes with equal items
             if (a[k] < a[k + 1]) { // ascending
                 while (++k <= right && a[k - 1] <= a[k]);
             } else if (a[k] > a[k + 1]) { // descending
                 while (++k <= right && a[k - 1] >= a[k]);
+                // Transform into an ascending sequence
                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
                     float t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                 }
-            } else { // equal
-                for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
-                    if (--m == 0) {
-                        sort(a, left, right, true);
-                        return;
-                    }
-                }
+            }
+
+            // Merge a transformed descending sequence followed by an
+            // ascending sequence
+            if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+                count--;
             }
 
             /*
@@ -2147,7 +2162,7 @@
         // Implementation note: variable "right" is increased by 1.
         if (run[count] == right++) { // The last run contains one element
             run[++count] = right;
-        } else if (count == 1) { // The array is already sorted
+        } else if (count <= 1) { // The array is already sorted
             return;
         }
 
@@ -2656,20 +2671,24 @@
 
         // Check if the array is nearly sorted
         for (int k = left; k < right; run[count] = k) {
+            // Equal items in the beginning of the sequence
+            while (k < right && a[k] == a[k + 1])
+                k++;
+            if (k == right) break;  // Sequence finishes with equal items
             if (a[k] < a[k + 1]) { // ascending
                 while (++k <= right && a[k - 1] <= a[k]);
             } else if (a[k] > a[k + 1]) { // descending
                 while (++k <= right && a[k - 1] >= a[k]);
+                // Transform into an ascending sequence
                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
                     double t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                 }
-            } else { // equal
-                for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
-                    if (--m == 0) {
-                        sort(a, left, right, true);
-                        return;
-                    }
-                }
+            }
+
+            // Merge a transformed descending sequence followed by an
+            // ascending sequence
+            if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+                count--;
             }
 
             /*
@@ -2686,7 +2705,7 @@
         // Implementation note: variable "right" is increased by 1.
         if (run[count] == right++) { // The last run contains one element
             run[++count] = right;
-        } else if (count == 1) { // The array is already sorted
+        } else if (count <= 1) { // The array is already sorted
             return;
         }
 
--- a/jdk/src/java.base/share/classes/java/util/PropertyPermission.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/PropertyPermission.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,18 +25,15 @@
 
 package java.util;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
 import java.io.Serializable;
-import java.io.IOException;
 import java.security.*;
-import java.util.Map;
-import java.util.HashMap;
 import java.util.Enumeration;
 import java.util.Hashtable;
-import java.util.Collections;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
 import sun.security.util.SecurityConstants;
 
 /**
@@ -162,6 +159,16 @@
     }
 
     /**
+     * Creates a PropertyPermission object with the specified name and
+     * a pre-calculated mask. Avoids the overhead of re-computing the mask.
+     * Called by PropertyPermissionCollection.
+     */
+    PropertyPermission(String name, int mask) {
+        super(name, getActions(mask));
+        this.mask = mask;
+    }
+
+    /**
      * Checks if this PropertyPermission object "implies" the specified
      * permission.
      * <P>
@@ -178,6 +185,7 @@
      * @return true if the specified permission is implied by this object,
      * false if not.
      */
+    @Override
     public boolean implies(Permission p) {
         if (!(p instanceof PropertyPermission))
             return false;
@@ -198,6 +206,7 @@
      * @return true if obj is a PropertyPermission, and has the same name and
      * actions as this PropertyPermission object.
      */
+    @Override
     public boolean equals(Object obj) {
         if (obj == this)
             return true;
@@ -219,6 +228,7 @@
      *
      * @return a hash code value for this object.
      */
+    @Override
     public int hashCode() {
         return this.getName().hashCode();
     }
@@ -345,6 +355,7 @@
      *
      * @return the canonical string representation of the actions.
      */
+    @Override
     public String getActions() {
         if (actions == null)
             actions = getActions(this.mask);
@@ -369,6 +380,7 @@
      * @return a new PermissionCollection object suitable for storing
      * PropertyPermissions.
      */
+    @Override
     public PermissionCollection newPermissionCollection() {
         return new PropertyPermissionCollection();
     }
@@ -425,7 +437,7 @@
      * Key is property name; value is PropertyPermission.
      * Not serialized; see serialization section at end of class.
      */
-    private transient Map<String, PropertyPermission> perms;
+    private transient ConcurrentHashMap<String, PropertyPermission> perms;
 
     /**
      * Boolean saying if "*" is in the collection.
@@ -439,7 +451,7 @@
      * Create an empty PropertyPermissionCollection object.
      */
     public PropertyPermissionCollection() {
-        perms = new HashMap<>(32);     // Capacity for default policy
+        perms = new ConcurrentHashMap<>(32);     // Capacity for default policy
         all_allowed = false;
     }
 
@@ -455,6 +467,7 @@
      * @exception SecurityException - if this PropertyPermissionCollection
      *                                object has been marked readonly
      */
+    @Override
     public void add(Permission permission) {
         if (! (permission instanceof PropertyPermission))
             throw new IllegalArgumentException("invalid permission: "+
@@ -466,21 +479,30 @@
         PropertyPermission pp = (PropertyPermission) permission;
         String propName = pp.getName();
 
-        synchronized (this) {
-            PropertyPermission existing = perms.get(propName);
+        // Add permission to map if it is absent, or replace with new
+        // permission if applicable. NOTE: cannot use lambda for
+        // remappingFunction parameter until JDK-8076596 is fixed.
+        perms.merge(propName, pp,
+            new java.util.function.BiFunction<>() {
+                @Override
+                public PropertyPermission apply(PropertyPermission existingVal,
+                                                PropertyPermission newVal) {
 
-            if (existing != null) {
-                int oldMask = existing.getMask();
-                int newMask = pp.getMask();
-                if (oldMask != newMask) {
-                    int effective = oldMask | newMask;
-                    String actions = PropertyPermission.getActions(effective);
-                    perms.put(propName, new PropertyPermission(propName, actions));
+                    int oldMask = existingVal.getMask();
+                    int newMask = newVal.getMask();
+                    if (oldMask != newMask) {
+                        int effective = oldMask | newMask;
+                        if (effective == newMask) {
+                            return newVal;
+                        }
+                        if (effective != oldMask) {
+                            return new PropertyPermission(propName, effective);
+                        }
+                    }
+                    return existingVal;
                 }
-            } else {
-                perms.put(propName, pp);
             }
-        }
+        );
 
         if (!all_allowed) {
             if (propName.equals("*"))
@@ -497,9 +519,10 @@
      * @return true if "permission" is a proper subset of a permission in
      * the set, false if not.
      */
+    @Override
     public boolean implies(Permission permission) {
         if (! (permission instanceof PropertyPermission))
-                return false;
+            return false;
 
         PropertyPermission pp = (PropertyPermission) permission;
         PropertyPermission x;
@@ -509,9 +532,7 @@
 
         // short circuit if the "*" Permission was added
         if (all_allowed) {
-            synchronized (this) {
-                x = perms.get("*");
-            }
+            x = perms.get("*");
             if (x != null) {
                 effective |= x.getMask();
                 if ((effective & desired) == desired)
@@ -526,9 +547,7 @@
         String name = pp.getName();
         //System.out.println("check "+name);
 
-        synchronized (this) {
-            x = perms.get(name);
-        }
+        x = perms.get(name);
 
         if (x != null) {
             // we have a direct hit!
@@ -546,9 +565,7 @@
 
             name = name.substring(0, last+1) + "*";
             //System.out.println("check "+name);
-            synchronized (this) {
-                x = perms.get(name);
-            }
+            x = perms.get(name);
 
             if (x != null) {
                 effective |= x.getMask();
@@ -569,16 +586,14 @@
      *
      * @return an enumeration of all the PropertyPermission objects.
      */
+    @Override
     @SuppressWarnings("unchecked")
     public Enumeration<Permission> elements() {
-        // Convert Iterator of Map values into an Enumeration
-        synchronized (this) {
-            /**
-             * Casting to rawtype since Enumeration<PropertyPermission>
-             * cannot be directly cast to Enumeration<Permission>
-             */
-            return (Enumeration)Collections.enumeration(perms.values());
-        }
+        /**
+         * Casting to rawtype since Enumeration<PropertyPermission>
+         * cannot be directly cast to Enumeration<Permission>
+         */
+        return (Enumeration)perms.elements();
     }
 
     private static final long serialVersionUID = 7015263904581634791L;
@@ -616,9 +631,7 @@
         // Copy perms into a Hashtable
         Hashtable<String, Permission> permissions =
             new Hashtable<>(perms.size()*2);
-        synchronized (this) {
-            permissions.putAll(perms);
-        }
+        permissions.putAll(perms);
 
         // Write out serializable fields
         ObjectOutputStream.PutField pfields = out.putFields();
@@ -646,7 +659,7 @@
         @SuppressWarnings("unchecked")
         Hashtable<String, PropertyPermission> permissions =
             (Hashtable<String, PropertyPermission>)gfields.get("permissions", null);
-        perms = new HashMap<>(permissions.size()*2);
+        perms = new ConcurrentHashMap<>(permissions.size()*2);
         perms.putAll(permissions);
     }
 }
--- a/jdk/src/java.base/share/classes/javax/security/auth/Subject.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/javax/security/auth/Subject.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1401,8 +1401,6 @@
         /**
          * Writes this object out to a stream (i.e., serializes it).
          *
-         * <p>
-         *
          * @serialData If this is a private credential set,
          *      a security check is performed to ensure that
          *      the caller has permission to access each credential
--- a/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java	Wed Jul 05 20:37:47 2017 +0200
@@ -74,36 +74,34 @@
  * visitor chain to trace the class that is visited at a given point in this
  * chain. This may be useful for debugging purposes.
  * <p>
- * The trace printed when visiting the <tt>Hello</tt> class is the following:
- * <p>
+ * The trace printed when visiting the {@code Hello} class is the following:
  * <blockquote>
  *
- * <pre>
+ * <pre>{@code
  * // class version 49.0 (49) // access flags 0x21 public class Hello {
  *
  * // compiled from: Hello.java
  *
- * // access flags 0x1 public &lt;init&gt; ()V ALOAD 0 INVOKESPECIAL
- * java/lang/Object &lt;init&gt; ()V RETURN MAXSTACK = 1 MAXLOCALS = 1
+ * // access flags 0x1 public <init> ()V ALOAD 0 INVOKESPECIAL
+ * java/lang/Object <init> ()V RETURN MAXSTACK = 1 MAXLOCALS = 1
  *
  * // access flags 0x9 public static main ([Ljava/lang/String;)V GETSTATIC
- * java/lang/System out Ljava/io/PrintStream; LDC &quot;hello&quot;
+ * java/lang/System out Ljava/io/PrintStream; LDC "hello"
  * INVOKEVIRTUAL java/io/PrintStream println (Ljava/lang/String;)V RETURN
  * MAXSTACK = 2 MAXLOCALS = 1 }
- * </pre>
+ * }</pre>
  *
- * </blockquote> where <tt>Hello</tt> is defined by:
- * <p>
+ * </blockquote> where {@code Hello} is defined by:
  * <blockquote>
  *
- * <pre>
+ * <pre>{@code
  * public class Hello {
  *
  *     public static void main(String[] args) {
- *         System.out.println(&quot;hello&quot;);
+ *         System.out.println("hello");
  *     }
  * }
- * </pre>
+ * }</pre>
  *
  * </blockquote>
  *
@@ -137,7 +135,7 @@
      *
      * @param cv
      *            the {@link ClassVisitor} to which this visitor delegates
-     *            calls. May be <tt>null</tt>.
+     *            calls. May be {@code null}.
      * @param pw
      *            the print writer to be used to print the class.
      */
@@ -150,7 +148,7 @@
      *
      * @param cv
      *            the {@link ClassVisitor} to which this visitor delegates
-     *            calls. May be <tt>null</tt>.
+     *            calls. May be {@code null}.
      * @param p
      *            the object that actually converts visit events into text.
      * @param pw
--- a/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java	Wed Jul 05 20:37:47 2017 +0200
@@ -464,7 +464,7 @@
      * Report whether a character is safe in a bytecode name.
      * This is true of any unicode character except the following
      * <em>dangerous characters</em>: {@code ".;:$[]<>/"}.
-     * @param s the proposed character
+     * @param c the proposed character
      * @return true if the character is safe to use in classfiles
      */
     public static boolean isSafeBytecodeChar(char c) {
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java	Thu Jun 11 20:19:18 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,554 +0,0 @@
-/*
- * Copyright (c) 1999, 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.
- */
-
-package sun.misc;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.FileNotFoundException;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import java.util.Enumeration;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import java.util.jar.Attributes;
-import java.util.jar.Attributes.Name;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedExceptionAction;
-import java.security.PrivilegedActionException;
-import java.net.URL;
-import java.net.MalformedURLException;
-import sun.net.www.ParseUtil;
-
-/**
- * This class checks dependent extensions a particular jar file may have
- * declared through its manifest attributes.
- * <p>
- * Jar file declared dependent extensions through the extension-list
- * attribute. The extension-list contains a list of keys used to
- * fetch the other attributes describing the required extension.
- * If key is the extension key declared in the extension-list
- * attribute, the following describing attribute can be found in
- * the manifest:
- * <ul>
- * <li>key-Extension-Name:  (Specification package name)</li>
- * <li>key-Specification-Version: (Specification-Version)</li>
- * <li>key-Implementation-Version: (Implementation-Version)</li>
- * <li>key-Implementation-Vendor-Id: (Imlementation-Vendor-Id)</li>
- * <li>key-Implementation-Version: (Implementation version)</li>
- * <li>key-Implementation-URL: (URL to download the requested extension)</li>
- * </ul>
- * <p>
- * This class also maintain versioning consistency of installed
- * extensions dependencies declared in jar file manifest.
- *
- * @deprecated this class will be removed in a future release.
- * @author  Jerome Dochez
- */
-@Deprecated
-public class ExtensionDependency {
-
-    /* Callbak interfaces to delegate installation of missing extensions */
-    private static Vector<ExtensionInstallationProvider> providers;
-
-    /**
-     * Register an ExtensionInstallationProvider. The provider is responsible
-     * for handling the installation (upgrade) of any missing extensions.
-     *
-     * @param eip ExtensionInstallationProvider implementation
-     */
-    public synchronized static void addExtensionInstallationProvider
-        (ExtensionInstallationProvider eip)
-    {
-        if (providers == null) {
-            providers = new Vector<>();
-        }
-        providers.add(eip);
-    }
-
-    /**
-     * Unregister a previously installed installation provider
-     */
-    public synchronized static void removeExtensionInstallationProvider
-        (ExtensionInstallationProvider eip)
-    {
-        providers.remove(eip);
-    }
-
-    /**
-     * Checks the dependencies of the jar file on installed extension.
-     *
-     * @param jar containing the attributes declaring the dependencies
-     */
-    public static boolean checkExtensionsDependencies(JarFile jar)
-    {
-        if (providers == null) {
-            // no need to bother, nobody is registered to install missing
-            // extensions
-            return true;
-        }
-
-        try {
-            ExtensionDependency extDep = new ExtensionDependency();
-            return extDep.checkExtensions(jar);
-        } catch (ExtensionInstallationException e) {
-            debug(e.getMessage());
-        }
-        return false;
-    }
-
-    /*
-     * Check for all declared required extensions in the jar file
-     * manifest.
-     */
-    protected boolean checkExtensions(JarFile jar)
-        throws ExtensionInstallationException
-    {
-        Manifest man;
-        try {
-            man = jar.getManifest();
-        } catch (IOException e) {
-            return false;
-        }
-
-        if (man == null) {
-            // The applet does not define a manifest file, so
-            // we just assume all dependencies are satisfied.
-            return true;
-        }
-
-        boolean result = true;
-        Attributes attr = man.getMainAttributes();
-        if (attr != null) {
-            // Let's get the list of declared dependencies
-            String value = attr.getValue(Name.EXTENSION_LIST);
-            if (value != null) {
-                StringTokenizer st = new StringTokenizer(value);
-                // Iterate over all declared dependencies
-                while (st.hasMoreTokens()) {
-                    String extensionName = st.nextToken();
-                    debug("The file " + jar.getName() +
-                          " appears to depend on " + extensionName);
-                    // Sanity Check
-                    String extName = extensionName + "-" +
-                        Name.EXTENSION_NAME.toString();
-                    if (attr.getValue(extName) == null) {
-                        debug("The jar file " + jar.getName() +
-                              " appers to depend on "
-                              + extensionName + " but does not define the " +
-                              extName + " attribute in its manifest ");
-
-                    } else {
-                        if (!checkExtension(extensionName, attr)) {
-                            debug("Failed installing " + extensionName);
-                            result = false;
-                        }
-                    }
-                }
-            } else {
-                debug("No dependencies for " + jar.getName());
-            }
-        }
-        return result;
-    }
-
-
-    /*
-     * Check that a particular dependency on an extension is satisfied.
-     *
-     * @param extensionName is the key used for the attributes in the manifest
-     * @param attr is the attributes of the manifest file
-     *
-     * @return true if the dependency is satisfied by the installed extensions
-     */
-    protected synchronized boolean checkExtension(final String extensionName,
-                                     final Attributes attr)
-        throws ExtensionInstallationException
-    {
-        debug("Checking extension " + extensionName);
-        if (checkExtensionAgainstInstalled(extensionName, attr))
-            return true;
-
-        debug("Extension not currently installed ");
-        ExtensionInfo reqInfo = new ExtensionInfo(extensionName, attr);
-        return installExtension(reqInfo, null);
-    }
-
-    /*
-     * Check if a particular extension is part of the currently installed
-     * extensions.
-     *
-     * @param extensionName is the key for the attributes in the manifest
-     * @param attr is the attributes of the manifest
-     *
-     * @return true if the requested extension is already installed
-     */
-    boolean checkExtensionAgainstInstalled(String extensionName,
-                                           Attributes attr)
-        throws ExtensionInstallationException
-    {
-        File fExtension = checkExtensionExists(extensionName);
-
-        if (fExtension != null) {
-        // Extension already installed, just check against this one
-            try {
-                if (checkExtensionAgainst(extensionName, attr, fExtension))
-                    return true;
-            } catch (FileNotFoundException e) {
-                debugException(e);
-            } catch (IOException e) {
-                debugException(e);
-            }
-            return false;
-
-        } else {
-        // Not sure if extension is already installed, so check all the
-        // installed extension jar files to see if we get a match
-
-            File[] installedExts;
-
-            try {
-            // Get the list of installed extension jar files so we can
-            // compare the installed versus the requested extension
-                installedExts = getInstalledExtensions();
-            } catch(IOException e) {
-                debugException(e);
-                return false;
-            }
-
-            for (int i=0;i<installedExts.length;i++) {
-                try {
-                    if (checkExtensionAgainst(extensionName, attr, installedExts[i]))
-                        return true;
-                } catch (FileNotFoundException e) {
-                    debugException(e);
-                } catch (IOException e) {
-                    debugException(e);
-                    // let's continue with the next installed extension
-                }
-            }
-        }
-        return false;
-    }
-
-    /*
-     * Check if the requested extension described by the attributes
-     * in the manifest under the key extensionName is compatible with
-     * the jar file.
-     *
-     * @param extensionName key in the attribute list
-     * @param attr manifest file attributes
-     * @param file installed extension jar file to compare the requested
-     * extension against.
-     */
-    protected boolean checkExtensionAgainst(String extensionName,
-                                            Attributes attr,
-                                            final File file)
-        throws IOException,
-               FileNotFoundException,
-               ExtensionInstallationException
-    {
-
-        debug("Checking extension " + extensionName +
-              " against " + file.getName());
-
-        // Load the jar file ...
-        Manifest man;
-        try {
-            man = AccessController.doPrivileged(
-                new PrivilegedExceptionAction<Manifest>() {
-                    public Manifest run()
-                            throws IOException, FileNotFoundException {
-                         if (!file.exists())
-                             throw new FileNotFoundException(file.getName());
-                         JarFile jarFile =  new JarFile(file);
-                         return jarFile.getManifest();
-                     }
-                 });
-        } catch(PrivilegedActionException e) {
-            if (e.getException() instanceof FileNotFoundException)
-                throw (FileNotFoundException) e.getException();
-            throw (IOException) e.getException();
-        }
-
-        // Construct the extension information object
-        ExtensionInfo reqInfo = new ExtensionInfo(extensionName, attr);
-        debug("Requested Extension : " + reqInfo);
-
-        int isCompatible = ExtensionInfo.INCOMPATIBLE;
-        ExtensionInfo instInfo = null;
-
-        if (man != null) {
-            Attributes instAttr = man.getMainAttributes();
-            if (instAttr != null) {
-                instInfo = new ExtensionInfo(null, instAttr);
-                debug("Extension Installed " + instInfo);
-                isCompatible = instInfo.isCompatibleWith(reqInfo);
-                switch(isCompatible) {
-                case ExtensionInfo.COMPATIBLE:
-                    debug("Extensions are compatible");
-                    return true;
-
-                case ExtensionInfo.INCOMPATIBLE:
-                    debug("Extensions are incompatible");
-                    return false;
-
-                default:
-                    // everything else
-                    debug("Extensions require an upgrade or vendor switch");
-                    return installExtension(reqInfo, instInfo);
-
-                }
-            }
-        }
-        return false;
-    }
-
-    /*
-     * An required extension is missing, if an ExtensionInstallationProvider is
-     * registered, delegate the installation of that particular extension to it.
-     *
-     * @param reqInfo Missing extension information
-     * @param instInfo Older installed version information
-     *
-     * @return true if the installation is successful
-     */
-    protected boolean installExtension(ExtensionInfo reqInfo,
-                                       ExtensionInfo instInfo)
-        throws ExtensionInstallationException
-    {
-        Vector<ExtensionInstallationProvider> currentProviders;
-        synchronized(providers) {
-            @SuppressWarnings("unchecked")
-            Vector<ExtensionInstallationProvider> tmp =
-                (Vector<ExtensionInstallationProvider>) providers.clone();
-            currentProviders = tmp;
-        }
-        for (Enumeration<ExtensionInstallationProvider> e = currentProviders.elements();
-                e.hasMoreElements();) {
-            ExtensionInstallationProvider eip = e.nextElement();
-
-            if (eip!=null) {
-                // delegate the installation to the provider
-                if (eip.installExtension(reqInfo, instInfo)) {
-                    debug(reqInfo.name + " installation successful");
-                    Launcher.ExtClassLoader cl = (Launcher.ExtClassLoader)
-                        Launcher.getLauncher().getClassLoader().getParent();
-                    addNewExtensionsToClassLoader(cl);
-                    return true;
-                }
-            }
-        }
-        // We have tried all of our providers, noone could install this
-        // extension, we just return failure at this point
-        debug(reqInfo.name + " installation failed");
-        return false;
-    }
-
-    /**
-     * Checks if the extension, that is specified in the extension-list in
-     * the applet jar manifest, is already installed (i.e. exists in the
-     * extension directory).
-     *
-     * @param extensionName extension name in the extension-list
-     *
-     * @return the extension if it exists in the extension directory
-     */
-    private File checkExtensionExists(String extensionName) {
-        // Function added to fix bug 4504166
-        final String extName = extensionName;
-        final String[] fileExt = {".jar", ".zip"};
-
-        return AccessController.doPrivileged(
-            new PrivilegedAction<File>() {
-                public File run() {
-                    try {
-                        File fExtension;
-                        File[] dirs = getExtDirs();
-
-                        // Search the extension directories for the extension that is specified
-                        // in the attribute extension-list in the applet jar manifest
-                        for (int i=0;i<dirs.length;i++) {
-                            for (int j=0;j<fileExt.length;j++) {
-                                if (extName.toLowerCase().endsWith(fileExt[j])) {
-                                    fExtension = new File(dirs[i], extName);
-                                } else {
-                                    fExtension = new File(dirs[i], extName+fileExt[j]);
-                                }
-                                debug("checkExtensionExists:fileName " + fExtension.getName());
-                                if (fExtension.exists()) {
-                                    return fExtension;
-                                }
-                            }
-                        }
-                        return null;
-
-                    } catch(Exception e) {
-                         debugException(e);
-                         return null;
-                    }
-                }
-            });
-    }
-
-    /**
-     * @return the java.ext.dirs property as a list of directory
-     */
-    private static File[] getExtDirs() {
-        String s = java.security.AccessController.doPrivileged(
-                new sun.security.action.GetPropertyAction("java.ext.dirs"));
-
-        File[] dirs;
-        if (s != null) {
-            StringTokenizer st =
-                new StringTokenizer(s, File.pathSeparator);
-            int count = st.countTokens();
-            debug("getExtDirs count " + count);
-            dirs = new File[count];
-            for (int i = 0; i < count; i++) {
-                dirs[i] = new File(st.nextToken());
-                debug("getExtDirs dirs["+i+"] "+ dirs[i]);
-            }
-        } else {
-            dirs = new File[0];
-            debug("getExtDirs dirs " + dirs);
-        }
-        debug("getExtDirs dirs.length " + dirs.length);
-        return dirs;
-    }
-
-    /*
-     * Scan the directories and return all files installed in those
-     *
-     * @param dirs list of directories to scan
-     *
-     * @return the list of files installed in all the directories
-     */
-    private static File[] getExtFiles(File[] dirs) throws IOException {
-        Vector<File> urls = new Vector<File>();
-        for (int i = 0; i < dirs.length; i++) {
-            String[] files = dirs[i].list(new JarFilter());
-            if (files != null) {
-                debug("getExtFiles files.length " + files.length);
-                for (int j = 0; j < files.length; j++) {
-                    File f = new File(dirs[i], files[j]);
-                    urls.add(f);
-                    debug("getExtFiles f["+j+"] "+ f);
-                }
-            }
-        }
-        File[] ua = new File[urls.size()];
-        urls.copyInto(ua);
-        debug("getExtFiles ua.length " + ua.length);
-        return ua;
-    }
-
-    /*
-     * @return the list of installed extensions jar files
-     */
-    private File[] getInstalledExtensions() throws IOException {
-        return AccessController.doPrivileged(
-            new PrivilegedAction<File[]>() {
-                public File[] run() {
-                     try {
-                         return getExtFiles(getExtDirs());
-                     } catch(IOException e) {
-                         debug("Cannot get list of installed extensions");
-                         debugException(e);
-                        return new File[0];
-                     }
-                 }
-            });
-    }
-
-    /*
-     * Add the newly installed jar file to the extension class loader.
-     *
-     * @param cl the current installed extension class loader
-     *
-     * @return true if successful
-     */
-    private Boolean addNewExtensionsToClassLoader(Launcher.ExtClassLoader cl) {
-        try {
-            File[] installedExts = getInstalledExtensions();
-            for (int i=0;i<installedExts.length;i++) {
-                final File instFile = installedExts[i];
-                URL instURL = AccessController.doPrivileged(
-                    new PrivilegedAction<URL>() {
-                        public URL run() {
-                            try {
-                                return ParseUtil.fileToEncodedURL(instFile);
-                            } catch (MalformedURLException e) {
-                                debugException(e);
-                                return null;
-                            }
-                        }
-                    });
-                if (instURL != null) {
-                    URL[] urls = cl.getURLs();
-                    boolean found=false;
-                    for (int j = 0; j<urls.length; j++) {
-                        debug("URL["+j+"] is " + urls[j] + " looking for "+
-                                           instURL);
-                        if (urls[j].toString().compareToIgnoreCase(
-                                    instURL.toString())==0) {
-                            found=true;
-                            debug("Found !");
-                        }
-                    }
-                    if (!found) {
-                        debug("Not Found ! adding to the classloader " +
-                              instURL);
-                        cl.addExtURL(instURL);
-                    }
-                }
-            }
-        } catch (MalformedURLException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-            // let's continue with the next installed extension
-        }
-        return Boolean.TRUE;
-    }
-
-    // True to display all debug and trace messages
-    static final boolean DEBUG = false;
-
-    private static void debug(String s) {
-        if (DEBUG) {
-            System.err.println(s);
-        }
-    }
-
-    private void debugException(Throwable e) {
-        if (DEBUG) {
-            e.printStackTrace();
-        }
-    }
-
-}
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java	Thu Jun 11 20:19:18 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,407 +0,0 @@
-/*
- * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute 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.misc;
-
-import java.util.StringTokenizer;
-import java.util.jar.Attributes;
-import java.util.jar.Attributes.Name;
-import java.util.ResourceBundle;
-import java.util.MissingResourceException;
-import java.text.MessageFormat;
-import java.lang.Character.*;
-
-
-/**
- * This class holds all necessary information to install or
- * upgrade a extension on the user's disk
- *
- * @deprecated this class will be removed in a future release.
- * @author  Jerome Dochez
- */
-@Deprecated
-public class ExtensionInfo {
-
-    /**
-     * public static values returned by the isCompatible method
-     */
-    public static final int COMPATIBLE = 0;
-    public static final int REQUIRE_SPECIFICATION_UPGRADE = 1;
-    public static final int REQUIRE_IMPLEMENTATION_UPGRADE = 2;
-    public static final int REQUIRE_VENDOR_SWITCH = 3;
-    public static final int INCOMPATIBLE = 4;
-
-    /**
-     * attributes fully describer an extension. The underlying described
-     * extension may be installed and requested.
-     */
-    public String title;
-    public String name;
-    public String specVersion;
-    public String specVendor;
-    public String implementationVersion;
-    public String vendor;
-    public String vendorId;
-    public String url;
-
-    // For I18N support
-    private static final ResourceBundle rb =
-        ResourceBundle.getBundle("sun.misc.resources.Messages");
-
-
-    /**
-     * Create a new uninitialized extension information object
-     */
-    public ExtensionInfo() {
-    }
-
-    /**
-     * Create and initialize an extension information object.
-     * The initialization uses the attributes passed as being
-     * the content of a manifest file to load the extension
-     * information from.
-     * Since manifest file may contain information on several
-     * extension they may depend on, the extension key parameter
-     * is prepanded to the attribute name to make the key used
-     * to retrieve the attribute from the manifest file
-     *
-     * @param extensionKey unique extension key in the manifest
-     * @param attr Attributes of a manifest file
-     */
-    public ExtensionInfo(String extensionKey, Attributes attr)
-        throws NullPointerException
-    {
-        String s;
-        if (extensionKey!=null) {
-            s = extensionKey + "-";
-        } else {
-            s ="";
-        }
-
-        String attrKey = s + Name.EXTENSION_NAME.toString();
-        name = attr.getValue(attrKey);
-        if (name != null)
-            name = name.trim();
-
-        attrKey = s + Name.SPECIFICATION_TITLE.toString();
-        title = attr.getValue(attrKey);
-        if (title != null)
-            title = title.trim();
-
-        attrKey = s + Name.SPECIFICATION_VERSION.toString();
-        specVersion = attr.getValue(attrKey);
-        if (specVersion != null)
-            specVersion = specVersion.trim();
-
-        attrKey = s + Name.SPECIFICATION_VENDOR.toString();
-        specVendor = attr.getValue(attrKey);
-        if (specVendor != null)
-            specVendor = specVendor.trim();
-
-        attrKey = s + Name.IMPLEMENTATION_VERSION.toString();
-        implementationVersion = attr.getValue(attrKey);
-        if (implementationVersion != null)
-            implementationVersion = implementationVersion.trim();
-
-        attrKey = s + Name.IMPLEMENTATION_VENDOR.toString();
-        vendor = attr.getValue(attrKey);
-        if (vendor != null)
-            vendor = vendor.trim();
-
-        attrKey = s + Name.IMPLEMENTATION_VENDOR_ID.toString();
-        vendorId = attr.getValue(attrKey);
-        if (vendorId != null)
-            vendorId = vendorId.trim();
-
-        attrKey =s + Name.IMPLEMENTATION_URL.toString();
-        url = attr.getValue(attrKey);
-        if (url != null)
-            url = url.trim();
-    }
-
-    /**
-     * @return true if the extension described by this extension information
-     * is compatible with the extension described by the extension
-     * information passed as a parameter
-     *
-     * @param ei the requested extension information to compare to
-     */
-    public int isCompatibleWith(ExtensionInfo ei) {
-
-        if (name == null || ei.name == null)
-            return INCOMPATIBLE;
-        if (name.compareTo(ei.name)==0) {
-            // is this true, if not spec version is specified, we consider
-            // the value as being "any".
-            if (specVersion == null || ei.specVersion == null)
-                return COMPATIBLE;
-
-            int version = compareExtensionVersion(specVersion, ei.specVersion);
-            if (version<0) {
-                // this extension specification is "older"
-                if (vendorId != null && ei.vendorId !=null) {
-                    if (vendorId.compareTo(ei.vendorId)!=0) {
-                        return REQUIRE_VENDOR_SWITCH;
-                    }
-                }
-                return REQUIRE_SPECIFICATION_UPGRADE;
-            } else {
-                // the extension spec is compatible, let's look at the
-                // implementation attributes
-                if (vendorId != null && ei.vendorId != null) {
-                    // They care who provides the extension
-                    if (vendorId.compareTo(ei.vendorId)!=0) {
-                        // They want to use another vendor implementation
-                        return REQUIRE_VENDOR_SWITCH;
-                    } else {
-                        // Vendor matches, let's see the implementation version
-                        if (implementationVersion != null && ei.implementationVersion != null) {
-                            // they care about the implementation version
-                            version = compareExtensionVersion(implementationVersion, ei.implementationVersion);
-                            if (version<0) {
-                                // This extension is an older implementation
-                                return REQUIRE_IMPLEMENTATION_UPGRADE;
-                            }
-                        }
-                    }
-                }
-                // All othe cases, we consider the extensions to be compatible
-                return COMPATIBLE;
-            }
-        }
-        return INCOMPATIBLE;
-    }
-
-    /**
-     * helper method to print sensible information on the undelying described
-     * extension
-     */
-    public String toString() {
-        return "Extension : title(" + title + "), name(" + name + "), spec vendor(" +
-            specVendor + "), spec version(" + specVersion + "), impl vendor(" +
-            vendor + "), impl vendor id(" + vendorId + "), impl version(" +
-            implementationVersion + "), impl url(" + url + ")";
-    }
-
-    /*
-     * helper method to compare two versions.
-     * version are in the x.y.z.t pattern.
-     *
-     * @param source version to compare to
-     * @param target version used to compare against
-     * @return <pre>{@code
-     *   < 0 if source < version
-     *   > 0 if source > version
-     *   = 0 if source = version}</pre>
-     */
-    private int compareExtensionVersion(String source, String target)
-        throws NumberFormatException
-    {
-        source = source.toLowerCase();
-        target = target.toLowerCase();
-
-        return strictCompareExtensionVersion(source, target);
-    }
-
-
-    /*
-     * helper method to compare two versions.
-     * version are in the x.y.z.t pattern.
-     *
-     * @param source version to compare to
-     * @param target version used to compare against
-     * @return <pre>{@code
-     *   < 0 if source < version
-     *   > 0 if source > version
-     *   = 0 if source = version}</pre>
-     */
-    private int strictCompareExtensionVersion(String source, String target)
-        throws NumberFormatException
-    {
-        if (source.equals(target))
-            return 0;
-
-        StringTokenizer stk = new StringTokenizer(source, ".,");
-        StringTokenizer ttk = new StringTokenizer(target, ".,");
-
-        // Compare number
-        int n = 0, m = 0, result = 0;
-
-        // Convert token into meaning number for comparision
-        if (stk.hasMoreTokens())
-            n = convertToken(stk.nextToken().toString());
-
-        // Convert token into meaning number for comparision
-        if (ttk.hasMoreTokens())
-            m = convertToken(ttk.nextToken().toString());
-
-        if (n > m)
-            return 1;
-        else if (m > n)
-            return -1;
-        else
-        {
-            // Look for index of "." in the string
-            int sIdx = source.indexOf('.');
-            int tIdx = target.indexOf('.');
-
-            if (sIdx == -1)
-                sIdx = source.length() - 1;
-
-            if (tIdx == -1)
-                tIdx = target.length() - 1;
-
-            return strictCompareExtensionVersion(source.substring(sIdx + 1),
-                                                 target.substring(tIdx + 1));
-        }
-    }
-
-    private int convertToken(String token)
-    {
-        if (token == null || token.equals(""))
-            return 0;
-
-        int charValue = 0;
-        int charVersion = 0;
-        int patchVersion = 0;
-        int strLength = token.length();
-        int endIndex = strLength;
-        char lastChar;
-
-        Object[] args = {name};
-        MessageFormat mf = new MessageFormat(rb.getString("optpkg.versionerror"));
-        String versionError = mf.format(args);
-
-        // Look for "-" for pre-release
-        int prIndex = token.indexOf('-');
-
-        // Look for "_" for patch release
-        int patchIndex = token.indexOf('_');
-
-        if (prIndex == -1 && patchIndex == -1)
-        {
-            // This is a FCS release
-            try {
-                return Integer.parseInt(token) * 100;
-            } catch (NumberFormatException e) {
-                System.out.println(versionError);
-                return 0;
-            }
-        }
-        else if (patchIndex != -1)
-        {
-            // This is a patch (update) release
-            int prversion;
-            try {
-                // Obtain the version
-                prversion = Integer.parseInt(token.substring(0, patchIndex));
-
-                // Check to see if the patch version is in the n.n.n_nnl format (special release)
-                lastChar = token.charAt(strLength-1);
-                if (Character.isLetter(lastChar)) {
-                    // letters a-z have values from 10-35
-                    charValue = Character.getNumericValue(lastChar);
-                    endIndex = strLength-1;
-
-                    // Obtain the patch version id
-                    patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex));
-
-                    if (charValue >= Character.getNumericValue('a') && charValue <= Character.getNumericValue('z')) {
-                        // This is a special release
-                        charVersion = (patchVersion * 100) + charValue;
-                    } else {
-                        // character is not a a-z letter, ignore
-                        charVersion = 0;
-                        System.out.println(versionError);
-                    }
-                } else {
-                    // This is a regular update release. Obtain the patch version id
-                    patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex));
-                }
-            } catch (NumberFormatException e) {
-                System.out.println(versionError);
-                return 0;
-            }
-            return prversion * 100 + (patchVersion + charVersion);
-        }
-        else
-        {
-            //This is a milestone release, either a early access, alpha, beta, or RC
-
-            // Obtain the version
-            int mrversion;
-            try {
-                mrversion = Integer.parseInt(token.substring(0, prIndex));
-            } catch (NumberFormatException e) {
-                System.out.println(versionError);
-                return 0;
-            }
-
-            // Obtain the patch version string, including the milestone + version
-            String prString = token.substring(prIndex + 1);
-
-            // Milestone version
-            String msVersion = "";
-            int delta = 0;
-
-            if (prString.indexOf("ea") != -1)
-            {
-                msVersion = prString.substring(2);
-                delta = 50;
-            }
-            else if (prString.indexOf("alpha") != -1)
-            {
-                msVersion = prString.substring(5);
-                delta = 40;
-            }
-            else if (prString.indexOf("beta") != -1)
-            {
-                msVersion = prString.substring(4);
-                delta = 30;
-            }
-            else if (prString.indexOf("rc") != -1)
-            {
-                msVersion = prString.substring(2);
-                delta = 20;
-            }
-
-            if (msVersion == null || msVersion.equals(""))
-            {
-                // No version after the milestone, assume 0
-                return mrversion * 100 - delta ;
-            }
-            else
-            {
-                // Convert the milestone version
-                try {
-                    return mrversion * 100 - delta + Integer.parseInt(msVersion);
-                } catch (NumberFormatException e) {
-                    System.out.println(versionError);
-                    return 0;
-                }
-            }
-        }
-    }
-}
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationException.java	Thu Jun 11 20:19:18 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute 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.misc;
-
-/*
- * Exception when installation of an extension has failed for
- * any reason
- *
- * @deprecated this class will be removed in a future release.
- * @author  Jerome Dochez
- */
-@Deprecated
-public class ExtensionInstallationException extends Exception {
-
-    static final long serialVersionUID = 3139688306909345924L;
-
-    /*
-     * <p>
-     * Construct a new exception with an exception reason
-     * </p>
-     */
-    public ExtensionInstallationException(String s) {
-        super(s);
-    }
-}
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationProvider.java	Thu Jun 11 20:19:18 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute 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.misc;
-
-/**
- * This interface defines the contract a extension installation capable
- * provided to the extension installation dependency mechanism to
- * install new extensions on the user's disk
- *
- * @deprecated this class will be removed in a future release.
- * @author  Jerome Dochez
- */
-@Deprecated
-public interface ExtensionInstallationProvider {
-
-    /*
-     * <p>
-     * Request the installation of an extension in the extension directory
-     * </p>
-     *
-     * @param requestExtInfo information on the extension that need to be
-     * installed
-     * @param installedExtInfo information on the current compatible installed
-     * extension. Can be null if no current installation has been found.
-     * @return true if the installation is successful, false if the
-     * installation could not be attempted.
-     * @exception ExtensionInstallationException if an installation was
-     * attempted but did not succeed.
-     */
-    boolean installExtension(ExtensionInfo requestExtInfo,
-                             ExtensionInfo installedExtInfo)
-        throws ExtensionInstallationException;
-}
--- a/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java	Wed Jul 05 20:37:47 2017 +0200
@@ -31,7 +31,7 @@
  * This class provides input and output streams for telnet clients.
  * This class overrides read to do CRLF processing as specified in
  * RFC 854. The class assumes it is running on a system where lines
- * are terminated with a single newline <LF> character.
+ * are terminated with a single newline {@literal <LF>} character.
  *
  * This is the relevant section of RFC 824 regarding CRLF processing:
  *
--- a/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java	Wed Jul 05 20:37:47 2017 +0200
@@ -31,7 +31,7 @@
  * This class provides input and output streams for telnet clients.
  * This class overrides write to do CRLF processing as specified in
  * RFC 854. The class assumes it is running on a system where lines
- * are terminated with a single newline <LF> character.
+ * are terminated with a single newline {@literal <LF>} character.
  *
  * This is the relevant section of RFC 824 regarding CRLF processing:
  *
--- a/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java	Wed Jul 05 20:37:47 2017 +0200
@@ -28,10 +28,12 @@
 /**
  * Helper class to map URL "abbreviations" to real URLs.
  * The default implementation supports the following mappings:
+ * <pre>{@code
  *   ftp.mumble.bar/... => ftp://ftp.mumble.bar/...
  *   gopher.mumble.bar/... => gopher://gopher.mumble.bar/...
  *   other.name.dom/... => http://other.name.dom/...
  *   /foo/... => file:/foo/...
+ * }</pre>
  *
  * Full URLs (those including a protocol name) are passed through unchanged.
  *
--- a/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1211,7 +1211,7 @@
      * The <code>OutputStream</code> is not closed by this method at the end
      * of the transfer.
      *
-     * @param name a <code>String<code> containing the name of the file to
+     * @param name a {@code String} containing the name of the file to
      *        retreive from the server.
      * @param local the <code>OutputStream</code> the file should be written to.
      * @throws IOException if the transfer fails.
--- a/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java	Wed Jul 05 20:37:47 2017 +0200
@@ -411,7 +411,7 @@
     }
 
     /** Convert a message-id string to canonical form (strips off
-        leading and trailing <>s) */
+        leading and trailing {@literal <>s}) */
     public static String canonicalID(String id) {
         if (id == null)
             return "";
--- a/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java	Wed Jul 05 20:37:47 2017 +0200
@@ -625,7 +625,7 @@
     }
 
     /** Parse the first line of the HTTP request.  It usually looks
-        something like: "HTTP/1.0 <number> comment\r\n". */
+        something like: {@literal "HTTP/1.0 <number> comment\r\n"}. */
 
     public boolean parseHTTP(MessageHeader responses, ProgressSource pi, HttpURLConnection httpuc)
     throws IOException {
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -68,13 +68,14 @@
  * <LI>Disconnect</LI>
  * </UL>
  * You should not have to use it directly in most cases because all will be handled
- * in a abstract layer. Here is an example of how to use the class :
- * <P>
- * <code>URL url = new URL("ftp://ftp.sun.com/pub/test.txt");<p>
- * UrlConnection con = url.openConnection();<p>
- * InputStream is = con.getInputStream();<p>
- * ...<p>
- * is.close();</code>
+ * in a abstract layer. Here is an example of how to use the class:
+ * <pre>{@code
+ * URL url = new URL("ftp://ftp.sun.com/pub/test.txt");
+ * UrlConnection con = url.openConnection();
+ * InputStream is = con.getInputStream();
+ * ...
+ * is.close();
+ * }</pre>
  *
  * @see sun.net.ftp.FtpClient
  */
@@ -158,7 +159,7 @@
     /**
      * Creates an FtpURLConnection from a URL.
      *
-     * @param   url     The <code>URL</code> to retrieve or store.
+     * @param   url     The {@code URL} to retrieve or store.
      */
     public FtpURLConnection(URL url) {
         this(url, null);
@@ -382,7 +383,7 @@
      * Get the InputStream to retreive the remote file. It will issue the
      * "get" (or "dir") command to the ftp server.
      *
-     * @return  the <code>InputStream</code> to the connection.
+     * @return  the {@code InputStream} to the connection.
      *
      * @throws  IOException if already opened for output
      * @throws  FtpProtocolException if errors occur during the transfert.
@@ -495,7 +496,7 @@
      * Get the OutputStream to store the remote file. It will issue the
      * "put" command to the ftp server.
      *
-     * @return  the <code>OutputStream</code> to the connection.
+     * @return  the {@code OutputStream} to the connection.
      *
      * @throws  IOException if already opened for input or the URL
      *          points to a directory
@@ -548,9 +549,9 @@
     }
 
     /**
-     * Gets the <code>Permission</code> associated with the host & port.
+     * Gets the {@code Permission} associated with the host and port.
      *
-     * @return  The <code>Permission</code> object.
+     * @return  The {@code Permission} object.
      */
     @Override
     public Permission getPermission() {
@@ -568,7 +569,7 @@
      * exists, overwrite its value with the new value.
      *
      * @param   key     the keyword by which the request is known
-     *                  (e.g., "<code>accept</code>").
+     *                  (e.g., "{@code accept}").
      * @param   value   the value associated with it.
      * @throws IllegalStateException if already connected
      * @see #getRequestProperty(java.lang.String)
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java	Wed Jul 05 20:37:47 2017 +0200
@@ -59,6 +59,7 @@
      * supplied or could be found.
      * <P>
      * Example:
+     * <pre>{@code
      * --> GET http://www.authorization-required.com/ HTTP/1.0
      * <-- HTTP/1.0 403 Unauthorized
      * <-- WWW-Authenticate: Basic realm="WallyWorld"
@@ -67,8 +68,9 @@
      *   return "QWadhgWERghghWERfdfQ=="
      * --> GET http://www.authorization-required.com/ HTTP/1.0
      * --> Authorization: Basic QWadhgWERghghWERfdfQ==
-     * <-- HTTP/1.0 200 OK
+     * <-- HTTP/1.0 200 OK}
      * <B> YAY!!!</B>
+     * </pre>
      */
 
     public String authString (URL u, String scheme, String realm);
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1954,7 +1954,7 @@
     /**
      * Set the tunneling status.
      *
-     * @param  the state
+     * @param tunnelState the state
      */
     public void setTunnelState(TunnelState tunnelState) {
         this.tunnelState = tunnelState;
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -338,7 +338,7 @@
      * Sets the value of the <code>ifModifiedSince</code> field of
      * this <code>URLConnection</code> to the specified value.
      *
-     * @param   value   the new value.
+     * @param   ifmodifiedsince   the new value.
      * @see     java.net.URLConnection#ifModifiedSince
      */
     public void setIfModifiedSince(long ifmodifiedsince) {
--- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java	Wed Jul 05 20:37:47 2017 +0200
@@ -295,7 +295,7 @@
 
     /**
      * Returns an annotation of the given type backed by the given
-     * member -> value map.
+     * member {@literal ->} value map.
      */
     public static Annotation annotationForMap(final Class<? extends Annotation> type,
                                               final Map<String, Object> memberValues)
--- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java	Wed Jul 05 20:37:47 2017 +0200
@@ -73,8 +73,8 @@
     /**
      * Returns an AnnotationType instance for the specified annotation type.
      *
-     * @throw IllegalArgumentException if the specified class object for
-     *     does not represent a valid annotation type
+     * @throws IllegalArgumentException if the specified class object
+     *         does not represent a valid annotation type
      */
     public static AnnotationType getInstance(
         Class<? extends Annotation> annotationClass)
@@ -183,7 +183,7 @@
 
     /**
      * Returns member types for this annotation type
-     * (member name -> type mapping).
+     * (member name {@literal ->} type mapping).
      */
     public Map<String, Class<?>> memberTypes() {
         return memberTypes;
@@ -191,7 +191,7 @@
 
     /**
      * Returns members of this annotation type
-     * (member name -> associated Method object mapping).
+     * (member name {@literal ->} associated Method object mapping).
      */
     public Map<String, Method> members() {
         return members;
@@ -199,7 +199,7 @@
 
     /**
      * Returns the default values for this annotation type
-     * (Member name -> default value mapping).
+     * (Member name {@literal ->} default value mapping).
      */
     public Map<String, Object> memberDefaults() {
         return memberDefaults;
--- a/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java	Wed Jul 05 20:37:47 2017 +0200
@@ -199,7 +199,7 @@
      * Regular Annotations on TypeVariables are stored in the type
      * annotation byte[] in the class file.
      *
-     * @param genericsDecl the declaration declaring the type variable
+     * @param genericDecl the declaration declaring the type variable
      * @param typeVarIndex the 0-based index of this type variable in the declaration
      */
     public static <D extends GenericDeclaration> Annotation[] parseTypeVariableAnnotations(D genericDecl,
--- a/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java	Wed Jul 05 20:37:47 2017 +0200
@@ -73,17 +73,17 @@
      * <p> This method throws a MalformedParameterizedTypeException
      * under the following circumstances:
      * If the number of actual type arguments (i.e., the size of the
-     * array <tt>typeArgs</tt>) does not correspond to the number of
+     * array {@code typeArgs}) does not correspond to the number of
      * formal type arguments.
      * If any of the actual type arguments is not an instance of the
      * bounds on the corresponding formal.
      * @param rawType the Class representing the generic type declaration being
      * instantiated
-     * @param actualTypeArguments - a (possibly empty) array of types
+     * @param actualTypeArguments a (possibly empty) array of types
      * representing the actual type arguments to the parameterized type
-     * @param ownerType - the enclosing type, if known.
-     * @return An instance of <tt>ParameterizedType</tt>
-     * @throws MalformedParameterizedTypeException - if the instantiation
+     * @param ownerType the enclosing type, if known.
+     * @return An instance of {@code ParameterizedType}
+     * @throws MalformedParameterizedTypeException if the instantiation
      * is invalid
      */
     public static ParameterizedTypeImpl make(Class<?> rawType,
@@ -95,18 +95,18 @@
 
 
     /**
-     * Returns an array of <tt>Type</tt> objects representing the actual type
+     * Returns an array of {@code Type} objects representing the actual type
      * arguments to this type.
      *
      * <p>Note that in some cases, the returned array be empty. This can occur
      * if this type represents a non-parameterized type nested within
      * a parameterized type.
      *
-     * @return an array of <tt>Type</tt> objects representing the actual type
+     * @return an array of {@code Type} objects representing the actual type
      *     arguments to this type
-     * @throws <tt>TypeNotPresentException</tt> if any of the
+     * @throws TypeNotPresentException if any of the
      *     actual type arguments refers to a non-existent type declaration
-     * @throws <tt>MalformedParameterizedTypeException</tt> if any of the
+     * @throws MalformedParameterizedTypeException if any of the
      *     actual type parameters refer to a parameterized type that cannot
      *     be instantiated for any reason
      * @since 1.5
@@ -116,10 +116,10 @@
     }
 
     /**
-     * Returns the <tt>Type</tt> object representing the class or interface
+     * Returns the {@code Type} object representing the class or interface
      * that declared this type.
      *
-     * @return the <tt>Type</tt> object representing the class or interface
+     * @return the {@code Type} object representing the class or interface
      *     that declared this type
      */
     public Class<?> getRawType() {
@@ -128,18 +128,18 @@
 
 
     /**
-     * Returns a <tt>Type</tt> object representing the type that this type
-     * is a member of.  For example, if this type is <tt>O<T>.I<S></tt>,
-     * return a representation of <tt>O<T></tt>.
+     * Returns a {@code Type} object representing the type that this type
+     * is a member of.  For example, if this type is {@code O<T>.I<S>},
+     * return a representation of {@code O<T>}.
      *
-     * <p>If this type is a top-level type, <tt>null</tt> is returned.
+     * <p>If this type is a top-level type, {@code null} is returned.
      *
-     * @return a <tt>Type</tt> object representing the type that
+     * @return a {@code Type} object representing the type that
      *     this type is a member of. If this type is a top-level type,
-     *     <tt>null</tt> is returned
-     * @throws <tt>TypeNotPresentException</tt> if the owner type
+     *     {@code null} is returned
+     * @throws TypeNotPresentException if the owner type
      *     refers to a non-existent type declaration
-     * @throws <tt>MalformedParameterizedTypeException</tt> if the owner type
+     * @throws MalformedParameterizedTypeException if the owner type
      *     refers to a parameterized type that cannot be instantiated
      *     for any reason
      *
--- a/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java	Wed Jul 05 20:37:47 2017 +0200
@@ -56,9 +56,9 @@
     }
 
     /**
-     * Factory method. Takes a <tt>Constructor</tt> object and creates a
+     * Factory method. Takes a {@code Constructor} object and creates a
      * scope for it.
-     * @param m - A Constructor whose scope we want to obtain
+     * @param c - A Constructor whose scope we want to obtain
      * @return The type-variable scope for the constructor m
      */
     public static ConstructorScope make(Constructor<?> c) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java	Wed Jul 05 20:37:47 2017 +0200
@@ -28,6 +28,7 @@
 import java.security.AlgorithmConstraints;
 import java.security.CryptoPrimitive;
 import java.security.PrivateKey;
+import java.security.Security;
 
 import java.util.Set;
 import java.util.HashSet;
@@ -415,10 +416,12 @@
                     "SHA1withRSA",          --p);
             supports(HashAlgorithm.SHA1,        SignatureAlgorithm.ECDSA,
                     "SHA1withECDSA",        --p);
+            if (Security.getProvider("SunMSCAPI") == null) {
             supports(HashAlgorithm.SHA224,      SignatureAlgorithm.RSA,
                     "SHA224withRSA",        --p);
             supports(HashAlgorithm.SHA224,      SignatureAlgorithm.ECDSA,
                     "SHA224withECDSA",      --p);
+            }
             supports(HashAlgorithm.SHA256,      SignatureAlgorithm.RSA,
                     "SHA256withRSA",        --p);
             supports(HashAlgorithm.SHA256,      SignatureAlgorithm.ECDSA,
--- a/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java	Wed Jul 05 20:37:47 2017 +0200
@@ -88,6 +88,14 @@
                     "NaN",
                 }
             },
+            { "DatePatterns",
+                new String[] {
+                    "EEEE, d MMMM, yyyy", // full date pattern
+                    "d MMMM, yyyy",       // long date pattern
+                    "d MMM, yyyy",        // medium date pattern
+                    "d/M/yy",             // short date pattern
+                }
+            },
         };
     }
 }
--- a/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java	Wed Jul 05 20:37:47 2017 +0200
@@ -121,8 +121,7 @@
      * <p> This method must construct the map's hash chains and store them into
      * the appropriate elements of the given hash-table row array.
      *
-     * @param rows
-     *        The row array to be initialized
+     * @param ht The row array to be initialized
      */
     protected abstract void init(Object[] ht);
 
--- a/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java	Wed Jul 05 20:37:47 2017 +0200
@@ -28,7 +28,7 @@
 import java.util.TimeZone;
 
 /**
- * The <code>BaseCalendar</code> provides basic calendar calculation
+ * The {@code BaseCalendar} provides basic calendar calculation
  * functions to support the Julian, Gregorian, and Gregorian-based
  * calendar systems.
  *
@@ -290,11 +290,11 @@
     /**
      * Returns 366 if the specified date is in a leap year, or 365
      * otherwise This method does not perform the normalization with
-     * the specified <code>CalendarDate</code>. The
-     * <code>CalendarDate</code> must be normalized to get a correct
+     * the specified {@code CalendarDate}. The
+     * {@code CalendarDate} must be normalized to get a correct
      * value.
      *
-     * @param a <code>CalendarDate</code>
+     * @param date a {@code CalendarDate}
      * @return a year length in days
      * @throws ClassCastException if the specified date is not a
      * {@link BaseCalendar.Date}
@@ -412,7 +412,7 @@
 
     /**
      * Calculates calendar fields and store them in the specified
-     * <code>CalendarDate</code>.
+     * {@code CalendarDate}.
      */
     // should be 'protected'
     public void getCalendarDateFromFixedDate(CalendarDate date,
--- a/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java	Wed Jul 05 20:37:47 2017 +0200
@@ -94,7 +94,7 @@
      * <code>0</code> and <code>-1%4</code> is <code>-1</code>.
      *
      * @param n the numerator
-     * @param d a divisor which must be > 0
+     * @param d a divisor which must be {@literal > 0}
      * @param r an array of at least one element in which the value
      * <code>mod(n, d)</code> is returned.
      * @return the floor of the quotient.
@@ -117,7 +117,7 @@
      * <code>0</code> and <code>-1%4</code> is <code>-1</code>.
      *
      * @param n the numerator
-     * @param d a divisor which must be > 0
+     * @param d a divisor which must be {@literal > 0}
      * @param r an array of at least one element in which the value
      * <code>mod(n, d)</code> is returned.
      * @return the floor of the quotient.
--- a/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java	Wed Jul 05 20:37:47 2017 +0200
@@ -364,7 +364,7 @@
      *                  0 for January.
      * @param day       The day-in-month of the given date.
      * @param dayOfWeek The day-of-week of the given date.
-     * @param millis    The milliseconds in day in <em>standard</em> local time.
+     * @param milliseconds The milliseconds in day in <em>standard</em> local time.
      * @return The milliseconds to add to UTC to get local time.
      */
     public int getOffset(int era, int year, int month, int day,
--- a/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java	Wed Jul 05 20:37:47 2017 +0200
@@ -72,7 +72,7 @@
      * If the name returned cannot be localized according to <code>locale</code>,
      * (say, the provider does not have a Japanese name for Croatian),
      * this method returns null.
-     * @param languageCode the ISO 639 language code string in the form of two
+     * @param lang the ISO 639 language code string in the form of two
      *     lower-case letters between 'a' (U+0061) and 'z' (U+007A)
      * @param locale the desired locale
      * @return the name of the given language code for the specified locale, or null if it's not
@@ -129,7 +129,7 @@
      * If the name returned cannot be localized according to <code>locale</code>,
      * (say, the provider does not have a Japanese name for Croatia),
      * this method returns null.
-     * @param countryCode the ISO 3166 country code string in the form of two
+     * @param ctry the ISO 3166 country code string in the form of two
      *     upper-case letters between 'A' (U+0041) and 'Z' (U+005A)
      * @param locale the desired locale
      * @return the name of the given country code for the specified locale, or null if it's not
@@ -152,7 +152,7 @@
      * is appropriate for display to the user.
      * If the name returned cannot be localized according to <code>locale</code>,
      * this method returns null.
-     * @param variant the variant string
+     * @param vrnt the variant string
      * @param locale the desired locale
      * @return the name of the given variant string for the specified locale, or null if it's not
      *     available.
--- a/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java	Wed Jul 05 20:37:47 2017 +0200
@@ -79,7 +79,7 @@
      * appropriate for daylight saving time even if the specified time zone
      * has not observed daylight saving time in the past.
      *
-     * @param ID a time zone ID string
+     * @param id a time zone ID string
      * @param daylight if true, return the daylight saving name.
      * @param style either {@link java.util.TimeZone#LONG TimeZone.LONG} or
      *    {@link java.util.TimeZone#SHORT TimeZone.SHORT}
--- a/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java	Wed Jul 05 20:37:47 2017 +0200
@@ -74,10 +74,10 @@
  *   java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
  *
  * Limitation:
- * <JAVA_HOME>/conf/logging.properties is the system-wide logging
+ * {@code <JAVA_HOME>/conf/logging.properties} is the system-wide logging
  * configuration defined in the specification and read in the
  * default case to configure any java.util.logging.Logger instances.
- * Platform loggers will not detect if <JAVA_HOME>/conf/logging.properties
+ * Platform loggers will not detect if {@code <JAVA_HOME>/conf/logging.properties}
  * is modified. In other words, unless the java.util.logging API
  * is used at runtime or the logging system properties is set,
  * the platform loggers will use the default setting described above.
--- a/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java	Wed Jul 05 20:37:47 2017 +0200
@@ -55,7 +55,7 @@
  *     array for the enumeration returned by <code>getKeys</code>.
  * <li>Inserts the time zone ID (the key of the bundle entries) into
  *     the string arrays returned by <code>handleGetObject</code>.
- * <ul>
+ * </ul>
  * All <code>TimeZoneNames</code> resource bundles must extend this
  * class and implement the <code>getContents</code> method.
  */
--- a/jdk/src/java.base/share/native/libjava/ClassLoader.c	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/native/libjava/ClassLoader.c	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -479,12 +479,12 @@
     return res;
 }
 /*
- * Class:     java_lang_ClassLoader_NativeLibrary
+ * Class:     java_lang_ClassLoader
  * Method:    findBuiltinLib
  * Signature: (Ljava/lang/String;)Ljava/lang/String;
  */
 JNIEXPORT jstring JNICALL
-Java_java_lang_ClassLoader_00024NativeLibrary_findBuiltinLib
+Java_java_lang_ClassLoader_findBuiltinLib
   (JNIEnv *env, jclass cls, jstring name)
 {
     const char *cname;
@@ -500,8 +500,6 @@
         JNU_ThrowInternalError(env, "NULL filename for native library");
         return NULL;
     }
-    // Can't call initIDs because it will recurse into NativeLibrary via
-    // FindClass to check context so set prochandle here as well.
     procHandle = getProcessHandle();
     cname = JNU_GetStringPlatformChars(env, name, 0);
     if (cname == NULL) {
--- a/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java	Wed Jul 05 20:37:47 2017 +0200
@@ -50,7 +50,7 @@
     }
 
     /**
-     * @returns the platform specific path corresponding to the URL
+     * @return the platform specific path corresponding to the URL
      *  so long as the URL does not contain a hostname in the authority field.
      */
 
--- a/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Wed Jul 05 20:37:47 2017 +0200
@@ -113,7 +113,8 @@
     Client client;
     /**
      * Create a NTLMAuthentication:
-     * Username may be specified as domain<BACKSLASH>username in the application Authenticator.
+     * Username may be specified as {@literal domain<BACKSLASH>username}
+     * in the application Authenticator.
      * If this notation is not used, then the domain will be taken
      * from a system property: "http.auth.ntlm.domain".
      */
--- a/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c	Wed Jul 05 20:37:47 2017 +0200
@@ -121,7 +121,7 @@
     jobjectArray ret = 0;
     int retLen = 0;
 
-    int error=0;
+    int getaddrinfo_error=0;
     struct addrinfo hints, *res, *resNew = NULL;
 
     initInetAddressIDs(env);
@@ -149,22 +149,24 @@
         return NULL;
     }
 
+
+    getaddrinfo_error = getaddrinfo(hostname, NULL, &hints, &res);
+
 #ifdef MACOSX
-    /* If we're looking up the local machine, bypass DNS lookups and get
-     * address from getifaddrs.
-     */
-    ret = lookupIfLocalhost(env, hostname, JNI_FALSE);
-    if (ret != NULL || (*env)->ExceptionCheck(env)) {
-        JNU_ReleaseStringPlatformChars(env, host, hostname);
-        return ret;
+    if (getaddrinfo_error) {
+        // If getaddrinfo fails try getifaddrs.
+        ret = lookupIfLocalhost(env, hostname, JNI_FALSE);
+        if (ret != NULL || (*env)->ExceptionCheck(env)) {
+            JNU_ReleaseStringPlatformChars(env, host, hostname);
+            return ret;
+        }
     }
 #endif
 
-    error = getaddrinfo(hostname, NULL, &hints, &res);
-
-    if (error) {
+    if (getaddrinfo_error) {
         /* report error */
-        NET_ThrowUnknownHostExceptionWithGaiError(env, hostname, error);
+        NET_ThrowUnknownHostExceptionWithGaiError(
+            env, hostname, getaddrinfo_error);
         JNU_ReleaseStringPlatformChars(env, host, hostname);
         return NULL;
     } else {
--- a/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c	Wed Jul 05 20:37:47 2017 +0200
@@ -254,7 +254,7 @@
     jobjectArray ret = 0;
     int retLen = 0;
 
-    int error=0;
+    int getaddrinfo_error=0;
 #ifdef AF_INET6
     struct addrinfo hints, *res, *resNew = NULL;
 #endif /* AF_INET6 */
@@ -269,19 +269,6 @@
     hostname = JNU_GetStringPlatformChars(env, host, JNI_FALSE);
     CHECK_NULL_RETURN(hostname, NULL);
 
-#ifdef MACOSX
-    /*
-     * If we're looking up the local machine, attempt to get the address
-     * from getifaddrs. This ensures we get an IPv6 address for the local
-     * machine.
-     */
-    ret = lookupIfLocalhost(env, hostname, JNI_TRUE);
-    if (ret != NULL || (*env)->ExceptionCheck(env)) {
-        JNU_ReleaseStringPlatformChars(env, host, hostname);
-        return ret;
-    }
-#endif
-
 #ifdef AF_INET6
     /* Try once, with our static buffer. */
     memset(&hints, 0, sizeof(hints));
@@ -301,11 +288,27 @@
     }
 #endif
 
-    error = getaddrinfo(hostname, NULL, &hints, &res);
+    getaddrinfo_error = getaddrinfo(hostname, NULL, &hints, &res);
 
-    if (error) {
+#ifdef MACOSX
+    if (getaddrinfo_error) {
+        /*
+         * If getaddrinfo fails looking up the local machine, attempt to get the
+         * address from getifaddrs. This ensures we get an IPv6 address for the
+         * local machine.
+         */
+        ret = lookupIfLocalhost(env, hostname, JNI_TRUE);
+        if (ret != NULL || (*env)->ExceptionCheck(env)) {
+            JNU_ReleaseStringPlatformChars(env, host, hostname);
+            return ret;
+        }
+    }
+#endif
+
+    if (getaddrinfo_error) {
         /* report error */
-        NET_ThrowUnknownHostExceptionWithGaiError(env, hostname, error);
+        NET_ThrowUnknownHostExceptionWithGaiError(
+            env, hostname, getaddrinfo_error);
         JNU_ReleaseStringPlatformChars(env, host, hostname);
         return NULL;
     } else {
--- a/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java	Wed Jul 05 20:37:47 2017 +0200
@@ -46,7 +46,7 @@
     }
 
     /**
-     * @returns the platform specific path corresponding to the URL, and in particular
+     * @return the platform specific path corresponding to the URL, and in particular
      *  returns a UNC when the authority contains a hostname
      */
 
--- a/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java	Wed Jul 05 20:37:47 2017 +0200
@@ -83,7 +83,8 @@
 
     /**
      * Create a NTLMAuthentication:
-     * Username may be specified as domain<BACKSLASH>username in the application Authenticator.
+     * Username may be specified as {@literal domain<BACKSLASH>username}
+     * in the application Authenticator.
      * If this notation is not used, then the domain will be taken
      * from a system property: "http.auth.ntlm.domain".
      */
--- a/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java	Wed Jul 05 20:37:47 2017 +0200
@@ -55,7 +55,7 @@
 /**
  * Utility class with different datatransfer helper functions
  *
- * @see 1.9
+ * @since 1.9
  */
 public class DataFlavorUtil {
 
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java	Wed Jul 05 20:37:47 2017 +0200
@@ -97,7 +97,8 @@
 
 
         /**
-         * Converts an OSType (e.g. "macs" from <CarbonCore/Folders.h>) into an int.
+         * Converts an OSType (e.g. "macs"
+         * from {@literal <CarbonCore/Folders.h>}) into an int.
          *
          * @param type the 4 character type to convert.
          * @return an int representing the 4 character value
@@ -355,7 +356,7 @@
         /**
          * Moves the specified file to the Trash
          *
-         * @param file
+         * @param file the file
          * @return returns true if the NSFileManager successfully moved the file to the Trash.
          * @throws FileNotFoundException
          *
--- a/jdk/src/java.desktop/share/classes/sun/applet/AppletPanel.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletPanel.java	Wed Jul 05 20:37:47 2017 +0200
@@ -344,12 +344,14 @@
      * Execute applet events.
      * Here is the state transition diagram
      *
+     * <pre>{@literal
      *   Note: (XXX) is the action
      *         APPLET_XXX is the state
-     *  (applet code loaded) --> APPLET_LOAD -- (applet init called)--> APPLET_INIT -- (
-     *   applet start called) --> APPLET_START -- (applet stop called) -->APPLET_STOP --(applet
-     *   destroyed called) --> APPLET_DESTROY -->(applet gets disposed) -->
-     *   APPLET_DISPOSE -->....
+     *  (applet code loaded) --> APPLET_LOAD -- (applet init called)--> APPLET_INIT --
+     *  (applet start called) --> APPLET_START -- (applet stop called) --> APPLET_STOP --
+     *  (applet destroyed called) --> APPLET_DESTROY --> (applet gets disposed) -->
+     *   APPLET_DISPOSE --> ...
+     * }</pre>
      *
      * In the legacy lifecycle model. The applet gets loaded, inited and started. So it stays
      * in the APPLET_START state unless the applet goes away(refresh page or leave the page).
@@ -364,10 +366,9 @@
      * APPLET_STOP to APPLET_DESTROY and to APPLET_INIT .
      *
      * Also, the applet can jump from APPLET_INIT state to APPLET_DESTROY (in Netscape/Mozilla case).
-         * Same as APPLET_LOAD to
+     * Same as APPLET_LOAD to
      * APPLET_DISPOSE since all of this are triggered by browser.
      *
-     *
      */
     @Override
     public void run() {
--- a/jdk/src/java.desktop/share/classes/sun/applet/AppletViewer.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletViewer.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1093,7 +1093,7 @@
     }
 
     /**
-     * Scan an html file for <applet> tags
+     * Scan an html file for {@code <applet>} tags
      */
     public static void parse(URL url, String enc) throws IOException {
         encoding = enc;
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java	Wed Jul 05 20:37:47 2017 +0200
@@ -358,7 +358,7 @@
      * Serializes only the unparsed DN, for compactness and to avoid
      * any implementation dependency.
      *
-     * @serialdata      The DN string and a boolean indicating whether
+     * @serialData      The DN string and a boolean indicating whether
      * the values are case sensitive.
      */
     private void writeObject(java.io.ObjectOutputStream s)
--- a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,14 +25,15 @@
 
 package javax.security.auth.kerberos;
 
-import java.util.*;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
+import java.security.BasicPermission;
 import java.security.Permission;
-import java.security.BasicPermission;
 import java.security.PermissionCollection;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * This class is used to restrict the usage of the Kerberos
@@ -137,6 +138,7 @@
      * @return true if the specified permission is implied by this object,
      * false if not.
      */
+    @Override
     public boolean implies(Permission p) {
         if (!(p instanceof DelegationPermission))
             return false;
@@ -159,6 +161,7 @@
      *  has the same subordinate and service principal as this.
      *  DelegationPermission object.
      */
+    @Override
     public boolean equals(Object obj) {
         if (obj == this)
             return true;
@@ -175,11 +178,11 @@
      *
      * @return a hash code value for this object.
      */
+    @Override
     public int hashCode() {
         return getName().hashCode();
     }
 
-
     /**
      * Returns a PermissionCollection object for storing
      * DelegationPermission objects.
@@ -192,7 +195,7 @@
      * @return a new PermissionCollection object suitable for storing
      * DelegationPermissions.
      */
-
+    @Override
     public PermissionCollection newPermissionCollection() {
         return new KrbDelegationPermissionCollection();
     }
@@ -263,13 +266,12 @@
     implements java.io.Serializable {
 
     // Not serialized; see serialization section at end of class.
-    private transient List<Permission> perms;
+    private transient ConcurrentHashMap<Permission, Boolean> perms;
 
     public KrbDelegationPermissionCollection() {
-        perms = new ArrayList<Permission>();
+        perms = new ConcurrentHashMap<>();
     }
 
-
     /**
      * Check and see if this collection of permissions implies the permissions
      * expressed in "permission".
@@ -279,18 +281,13 @@
      * @return true if "permission" is a proper subset of a permission in
      * the collection, false if not.
      */
+    @Override
     public boolean implies(Permission permission) {
         if (! (permission instanceof DelegationPermission))
-                return false;
+            return false;
 
-        synchronized (this) {
-            for (Permission x : perms) {
-                if (x.implies(permission))
-                    return true;
-            }
-        }
-        return false;
-
+        // if map contains key, then it automatically implies it
+        return perms.containsKey(permission);
     }
 
     /**
@@ -305,6 +302,7 @@
      * @exception SecurityException - if this PermissionCollection object
      *                                has been marked readonly
      */
+    @Override
     public void add(Permission permission) {
         if (! (permission instanceof DelegationPermission))
             throw new IllegalArgumentException("invalid permission: "+
@@ -312,9 +310,7 @@
         if (isReadOnly())
             throw new SecurityException("attempt to add a Permission to a readonly PermissionCollection");
 
-        synchronized (this) {
-            perms.add(0, permission);
-        }
+        perms.put(permission, Boolean.TRUE);
     }
 
     /**
@@ -323,11 +319,9 @@
      *
      * @return an enumeration of all the DelegationPermission objects.
      */
+    @Override
     public Enumeration<Permission> elements() {
-        // Convert Iterator into Enumeration
-        synchronized (this) {
-            return Collections.enumeration(perms);
-        }
+        return perms.keys();
     }
 
     private static final long serialVersionUID = -3383936936589966948L;
@@ -354,11 +348,7 @@
         // Don't call out.defaultWriteObject()
 
         // Write out Vector
-        Vector<Permission> permissions = new Vector<>(perms.size());
-
-        synchronized (this) {
-            permissions.addAll(perms);
-        }
+        Vector<Permission> permissions = new Vector<>(perms.keySet());
 
         ObjectOutputStream.PutField pfields = out.putFields();
         pfields.put("permissions", permissions);
@@ -379,8 +369,10 @@
 
         // Get the one we want
         Vector<Permission> permissions =
-                (Vector<Permission>)gfields.get("permissions", null);
-        perms = new ArrayList<Permission>(permissions.size());
-        perms.addAll(permissions);
+            (Vector<Permission>)gfields.get("permissions", null);
+        perms = new ConcurrentHashMap<>(permissions.size());
+        for (Permission perm : permissions) {
+            perms.put(perm, Boolean.TRUE);
+        }
     }
 }
--- a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java	Wed Jul 05 20:37:47 2017 +0200
@@ -25,13 +25,14 @@
 
 package javax.security.auth.kerberos;
 
-import java.util.*;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
 import java.security.Permission;
 import java.security.PermissionCollection;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * This class is used to protect Kerberos services and the
@@ -149,6 +150,15 @@
         init(servicePrincipal, getMask(action));
     }
 
+    /**
+     * Creates a ServicePermission object with the specified servicePrincipal
+     * and a pre-calculated mask. Avoids the overhead of re-computing the mask.
+     * Called by ServicePermissionCollection.
+     */
+    ServicePermission(String servicePrincipal, int mask) {
+        super(servicePrincipal);
+        init(servicePrincipal, mask);
+    }
 
     /**
      * Initialize the ServicePermission object.
@@ -175,6 +185,7 @@
      * @return true if the specified permission is implied by this object,
      * false if not.
      */
+    @Override
     public boolean implies(Permission p) {
         if (!(p instanceof ServicePermission))
             return false;
@@ -200,6 +211,7 @@
      *  same service principal, and actions as this
      * ServicePermission object.
      */
+    @Override
     public boolean equals(Object obj) {
         if (obj == this)
             return true;
@@ -219,7 +231,7 @@
      *
      * @return a hash code value for this object.
      */
-
+    @Override
     public int hashCode() {
         return (getName().hashCode() ^ mask);
     }
@@ -234,7 +246,7 @@
      * @param mask a specific integer action mask to translate into a string
      * @return the canonical string representation of the actions
      */
-    private static String getActions(int mask)
+    static String getActions(int mask)
     {
         StringBuilder sb = new StringBuilder();
         boolean comma = false;
@@ -259,6 +271,7 @@
      * Always returns present actions in the following order:
      * initiate, accept.
      */
+    @Override
     public String getActions() {
         if (actions == null)
             actions = getActions(this.mask);
@@ -279,6 +292,7 @@
      * @return a new PermissionCollection object suitable for storing
      * ServicePermissions.
      */
+    @Override
     public PermissionCollection newPermissionCollection() {
         return new KrbServicePermissionCollection();
     }
@@ -453,11 +467,12 @@
 final class KrbServicePermissionCollection extends PermissionCollection
     implements java.io.Serializable {
 
+    // Key is the service principal, value is the ServicePermission.
     // Not serialized; see serialization section at end of class
-    private transient List<Permission> perms;
+    private transient ConcurrentHashMap<String, Permission> perms;
 
     public KrbServicePermissionCollection() {
-        perms = new ArrayList<Permission>();
+        perms = new ConcurrentHashMap<>();
     }
 
     /**
@@ -469,32 +484,28 @@
      * @return true if "permission" is a proper subset of a permission in
      * the collection, false if not.
      */
+    @Override
     public boolean implies(Permission permission) {
         if (! (permission instanceof ServicePermission))
-                return false;
+            return false;
 
         ServicePermission np = (ServicePermission) permission;
         int desired = np.getMask();
-        int effective = 0;
-        int needed = desired;
-
-        synchronized (this) {
-            int len = perms.size();
-
-            // need to deal with the case where the needed permission has
-            // more than one action and the collection has individual permissions
-            // that sum up to the needed.
 
-            for (int i = 0; i < len; i++) {
-                ServicePermission x = (ServicePermission) perms.get(i);
+        // first, check for wildcard principal
+        ServicePermission x = (ServicePermission)perms.get("*");
+        if (x != null) {
+            if ((x.getMask() & desired) == desired) {
+                return true;
+            }
+        }
 
-                //System.out.println("  trying "+x);
-                if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(np)) {
-                    effective |=  x.getMask();
-                    if ((effective & desired) == desired)
-                        return true;
-                    needed = (desired ^ effective);
-                }
+        // otherwise, check for match on principal
+        x = (ServicePermission)perms.get(np.getName());
+        if (x != null) {
+            //System.out.println("  trying "+x);
+            if ((x.getMask() & desired) == desired) {
+                return true;
             }
         }
         return false;
@@ -512,6 +523,7 @@
      * @exception SecurityException - if this PermissionCollection object
      *                                has been marked readonly
      */
+    @Override
     public void add(Permission permission) {
         if (! (permission instanceof ServicePermission))
             throw new IllegalArgumentException("invalid permission: "+
@@ -519,9 +531,32 @@
         if (isReadOnly())
             throw new SecurityException("attempt to add a Permission to a readonly PermissionCollection");
 
-        synchronized (this) {
-            perms.add(0, permission);
-        }
+        ServicePermission sp = (ServicePermission)permission;
+        String princName = sp.getName();
+
+        // Add permission to map if it is absent, or replace with new
+        // permission if applicable. NOTE: cannot use lambda for
+        // remappingFunction parameter until JDK-8076596 is fixed.
+        perms.merge(princName, sp,
+            new java.util.function.BiFunction<>() {
+                @Override
+                public Permission apply(Permission existingVal,
+                                        Permission newVal) {
+                    int oldMask = ((ServicePermission)existingVal).getMask();
+                    int newMask = ((ServicePermission)newVal).getMask();
+                    if (oldMask != newMask) {
+                        int effective = oldMask | newMask;
+                        if (effective == newMask) {
+                            return newVal;
+                        }
+                        if (effective != oldMask) {
+                            return new ServicePermission(princName, effective);
+                        }
+                    }
+                    return existingVal;
+                }
+            }
+        );
     }
 
     /**
@@ -530,12 +565,9 @@
      *
      * @return an enumeration of all the ServicePermission objects.
      */
-
+    @Override
     public Enumeration<Permission> elements() {
-        // Convert Iterator into Enumeration
-        synchronized (this) {
-            return Collections.enumeration(perms);
-        }
+        return perms.elements();
     }
 
     private static final long serialVersionUID = -4118834211490102011L;
@@ -563,11 +595,7 @@
         // Don't call out.defaultWriteObject()
 
         // Write out Vector
-        Vector<Permission> permissions = new Vector<>(perms.size());
-
-        synchronized (this) {
-            permissions.addAll(perms);
-        }
+        Vector<Permission> permissions = new Vector<>(perms.values());
 
         ObjectOutputStream.PutField pfields = out.putFields();
         pfields.put("permissions", permissions);
@@ -589,7 +617,9 @@
         // Get the one we want
         Vector<Permission> permissions =
                 (Vector<Permission>)gfields.get("permissions", null);
-        perms = new ArrayList<Permission>(permissions.size());
-        perms.addAll(permissions);
+        perms = new ConcurrentHashMap<>(permissions.size());
+        for (Permission perm : permissions) {
+            perms.put(perm.getName(), perm);
+        }
     }
 }
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java	Wed Jul 05 20:37:47 2017 +0200
@@ -35,7 +35,7 @@
 import javax.sql.rowset.*;
 
 /**
- * The standard implementation of the <code>JdbcRowSet</code> interface. See the interface
+ * The standard implementation of the {@code JdbcRowSet} interface. See the interface
  * definition for full behavior and implementation requirements.
  *
  * @author Jonathan Bruce, Amit Handa
@@ -44,40 +44,40 @@
 public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
 
     /**
-     * The <code>Connection</code> object that is this rowset's
+     * The {@code Connection} object that is this rowset's
      * current connection to the database.  This field is set
      * internally when the connection is established.
      */
     private Connection conn;
 
     /**
-     * The <code>PreparedStatement</code> object that is this rowset's
+     * The {@code PreparedStatement} object that is this rowset's
      * current command.  This field is set internally when the method
-     * <code>execute</code> creates the <code>PreparedStatement</code>
+     * {@code execute} creates the {@code PreparedStatement}
      * object.
      */
     private PreparedStatement ps;
 
     /**
-     * The <code>ResultSet</code> object that is this rowset's
+     * The {@code ResultSet} object that is this rowset's
      * current result set.  This field is set internally when the method
-     * <code>execute</code> executes the rowset's command and thereby
-     * creates the rowset's <code>ResultSet</code> object.
+     * {@code execute} executes the rowset's command and thereby
+     * creates the rowset's {@code ResultSet} object.
      */
     private ResultSet rs;
 
     /**
-     * The <code>RowSetMetaDataImpl</code> object that is constructed when
-     * a <code>ResultSet</code> object is passed to the <code>JdbcRowSet</code>
+     * The {@code RowSetMetaDataImpl} object that is constructed when
+     * a {@code ResultSet} object is passed to the {@code JdbcRowSet}
      * constructor. This helps in constructing all metadata associated
-     * with the <code>ResultSet</code> object using the setter methods of
-     * <code>RowSetMetaDataImpl</code>.
+     * with the {@code ResultSet} object using the setter methods of
+     * {@code RowSetMetaDataImpl}.
      */
     private RowSetMetaDataImpl rowsMD;
 
     /**
-     * The <code>ResultSetMetaData</code> object from which this
-     * <code>RowSetMetaDataImpl</code> is formed and which  helps in getting
+     * The {@code ResultSetMetaData} object from which this
+     * {@code RowSetMetaDataImpl} is formed and which  helps in getting
      * the metadata information.
      */
     private ResultSetMetaData resMD;
@@ -97,13 +97,13 @@
     protected transient JdbcRowSetResourceBundle resBundle;
 
     /**
-     * Constructs a default <code>JdbcRowSet</code> object.
-     * The new instance of <code>JdbcRowSet</code> will serve as a proxy
-     * for the <code>ResultSet</code> object it creates, and by so doing,
+     * Constructs a default {@code JdbcRowSet} object.
+     * The new instance of {@code JdbcRowSet} will serve as a proxy
+     * for the {@code ResultSet} object it creates, and by so doing,
      * it will make it possible to use the result set as a JavaBeans
      * component.
      * <P>
-     * The following is true of a default <code>JdbcRowSet</code> instance:
+     * The following is true of a default {@code JdbcRowSet} instance:
      * <UL>
      *   <LI>Does not show deleted rows
      *   <LI>Has no time limit for how long a driver may take to
@@ -114,17 +114,17 @@
      *       made by others
      *   <LI>Will not see uncommitted data (make "dirty" reads)
      *   <LI>Has escape processing turned on
-     *   <LI>Has its connection's type map set to <code>null</code>
-     *   <LI>Has an empty <code>Hashtable</code> object for storing any
+     *   <LI>Has its connection's type map set to {@code null}
+     *   <LI>Has an empty {@code Hashtable} object for storing any
      *       parameters that are set
      * </UL>
-     * A newly created <code>JdbcRowSet</code> object must have its
-     * <code>execute</code> method invoked before other public methods
+     * A newly created {@code JdbcRowSet} object must have its
+     * {@code execute} method invoked before other public methods
      * are called on it; otherwise, such method calls will cause an
      * exception to be thrown.
      *
      * @throws SQLException [1] if any of its public methods are called prior
-     * to calling the <code>execute</code> method; [2] if invalid JDBC driver
+     * to calling the {@code execute} method; [2] if invalid JDBC driver
      * properties are set or [3] if no connection to a data source exists.
      */
     public JdbcRowSetImpl() {
@@ -217,14 +217,14 @@
     }
 
     /**
-     * Constructs a default <code>JdbcRowSet</code> object given a
-     * valid <code>Connection</code> object. The new
-     * instance of <code>JdbcRowSet</code> will serve as a proxy for
-     * the <code>ResultSet</code> object it creates, and by so doing,
+     * Constructs a default {@code JdbcRowSet} object given a
+     * valid {@code Connection} object. The new
+     * instance of {@code JdbcRowSet} will serve as a proxy for
+     * the {@code ResultSet} object it creates, and by so doing,
      * it will make it possible to use the result set as a JavaBeans
      * component.
      * <P>
-     * The following is true of a default <code>JdbcRowSet</code> instance:
+     * The following is true of a default {@code JdbcRowSet} instance:
      * <UL>
      *   <LI>Does not show deleted rows
      *   <LI>Has no time limit for how long a driver may take to
@@ -235,17 +235,17 @@
      *       made by others
      *   <LI>Will not see uncommitted data (make "dirty" reads)
      *   <LI>Has escape processing turned on
-     *   <LI>Has its connection's type map set to <code>null</code>
-     *   <LI>Has an empty <code>Hashtable</code> object for storing any
+     *   <LI>Has its connection's type map set to {@code null}
+     *   <LI>Has an empty {@code Hashtable} object for storing any
      *       parameters that are set
      * </UL>
-     * A newly created <code>JdbcRowSet</code> object must have its
-     * <code>execute</code> method invoked before other public methods
+     * A newly created {@code JdbcRowSet} object must have its
+     * {@code execute} method invoked before other public methods
      * are called on it; otherwise, such method calls will cause an
      * exception to be thrown.
      *
      * @throws SQLException [1] if any of its public methods are called prior
-     * to calling the <code>execute</code> method, [2] if invalid JDBC driver
+     * to calling the {@code execute} method, [2] if invalid JDBC driver
      * properties are set, or [3] if no connection to a data source exists.
      */
     public JdbcRowSetImpl(Connection con) throws SQLException {
@@ -289,15 +289,15 @@
     }
 
     /**
-     * Constructs a default <code>JdbcRowSet</code> object using the
+     * Constructs a default {@code JdbcRowSet} object using the
      * URL, username, and password arguments supplied. The new
-     * instance of <code>JdbcRowSet</code> will serve as a proxy for
-     * the <code>ResultSet</code> object it creates, and by so doing,
+     * instance of {@code JdbcRowSet} will serve as a proxy for
+     * the {@code ResultSet} object it creates, and by so doing,
      * it will make it possible to use the result set as a JavaBeans
      * component.
      *
      * <P>
-     * The following is true of a default <code>JdbcRowSet</code> instance:
+     * The following is true of a default {@code JdbcRowSet} instance:
      * <UL>
      *   <LI>Does not show deleted rows
      *   <LI>Has no time limit for how long a driver may take to
@@ -308,17 +308,17 @@
      *       made by others
      *   <LI>Will not see uncommitted data (make "dirty" reads)
      *   <LI>Has escape processing turned on
-     *   <LI>Has its connection's type map set to <code>null</code>
-     *   <LI>Has an empty <code>Hashtable</code> object for storing any
+     *   <LI>Has its connection's type map set to {@code null}
+     *   <LI>Has an empty {@code Hashtable} object for storing any
      *       parameters that are set
      * </UL>
      *
-     * @param url - a JDBC URL for the database to which this <code>JdbcRowSet</code>
+     * @param url a JDBC URL for the database to which this {@code JdbcRowSet}
      *        object will be connected. The form for a JDBC URL is
-     *        <code>jdbc:subprotocol:subname</code>.
-     * @param user - the database user on whose behalf the connection
+     *        {@code jdbc:subprotocol:subname}.
+     * @param user the database user on whose behalf the connection
      *        is being made
-     * @param password - the user's password
+     * @param password the user's password
      *
      * @throws SQLException if a database access error occurs
      *
@@ -372,15 +372,15 @@
 
 
     /**
-     * Constructs a <code>JdbcRowSet</code> object using the given valid
-     * <code>ResultSet</code> object. The new
-     * instance of <code>JdbcRowSet</code> will serve as a proxy for
-     * the <code>ResultSet</code> object, and by so doing,
+     * Constructs a {@code JdbcRowSet} object using the given valid
+     * {@code ResultSet} object. The new
+     * instance of {@code JdbcRowSet} will serve as a proxy for
+     * the {@code ResultSet} object, and by so doing,
      * it will make it possible to use the result set as a JavaBeans
      * component.
      *
      * <P>
-     * The following is true of a default <code>JdbcRowSet</code> instance:
+     * The following is true of a default {@code JdbcRowSet} instance:
      * <UL>
      *   <LI>Does not show deleted rows
      *   <LI>Has no time limit for how long a driver may take to
@@ -391,12 +391,12 @@
      *       made by others
      *   <LI>Will not see uncommitted data (make "dirty" reads)
      *   <LI>Has escape processing turned on
-     *   <LI>Has its connection's type map set to <code>null</code>
-     *   <LI>Has an empty <code>Hashtable</code> object for storing any
+     *   <LI>Has its connection's type map set to {@code null}
+     *   <LI>Has an empty {@code Hashtable} object for storing any
      *       parameters that are set
      * </UL>
      *
-     * @param res a valid <code>ResultSet</code> object
+     * @param res a valid {@code ResultSet} object
      *
      * @throws SQLException if a database access occurs due to a non
      * valid ResultSet handle.
@@ -460,13 +460,13 @@
     }
 
     /**
-     * Initializes the given <code>RowSetMetaData</code> object with the values
-     * in the given <code>ResultSetMetaData</code> object.
-     *
-     * @param md the <code>RowSetMetaData</code> object for this
-     *           <code>JdbcRowSetImpl</code> object, which will be set with
+     * Initializes the given {@code RowSetMetaData} object with the values
+     * in the given {@code ResultSetMetaData} object.
+     *
+     * @param md the {@code RowSetMetaData} object for this
+     *           {@code JdbcRowSetImpl} object, which will be set with
      *           values from rsmd
-     * @param rsmd the <code>ResultSetMetaData</code> object from which new
+     * @param rsmd the {@code ResultSetMetaData} object from which new
      *             values for md will be read
      * @throws SQLException if an error occurs
      */
@@ -511,24 +511,24 @@
     //---------------------------------------------------------------------
 
     /**
-     * Creates the internal <code>ResultSet</code> object for which this
-     * <code>JdbcRowSet</code> object is a wrapper, effectively
+     * Creates the internal {@code ResultSet} object for which this
+     * {@code JdbcRowSet} object is a wrapper, effectively
      * making the result set a JavaBeans component.
      * <P>
      * Certain properties must have been set before this method is called
      * so that it can establish a connection to a database and execute the
-     * query that will create the result set.  If a <code>DataSource</code>
+     * query that will create the result set.  If a {@code DataSource}
      * object will be used to create the connection, properties for the
      * data source name, user name, and password must be set.  If the
-     * <code>DriverManager</code> will be used, the properties for the
+     * {@code DriverManager} will be used, the properties for the
      * URL, user name, and password must be set.  In either case, the
      * property for the command must be set.  If the command has placeholder
      * parameters, those must also be set. This method throws
      * an exception if the required properties are not set.
      * <P>
      * Other properties have default values that may optionally be set
-     * to new values. The <code>execute</code> method will use the value
-     * for the command property to create a <code>PreparedStatement</code>
+     * to new values. The {@code execute} method will use the value
+     * for the command property to create a {@code PreparedStatement}
      * object and set its properties (escape processing, maximum field
      * size, maximum number of rows, and query timeout limit) to be those
      * of this rowset.
@@ -784,20 +784,20 @@
     }
 
     /**
-     * Moves the cursor for this rowset's <code>ResultSet</code>
+     * Moves the cursor for this rowset's {@code ResultSet}
      * object down one row from its current position.
-     * A <code>ResultSet</code> cursor is initially positioned
+     * A {@code ResultSet} cursor is initially positioned
      * before the first row; the first call to the method
-     * <code>next</code> makes the first row the current row; the
+     * {@code next} makes the first row the current row; the
      * second call makes the second row the current row, and so on.
      *
      * <P>If an input stream is open for the current row, a call
-     * to the method <code>next</code> will
-     * implicitly close it. A <code>ResultSet</code> object's
+     * to the method {@code next} will
+     * implicitly close it. A {@code ResultSet} object's
      * warning chain is cleared when a new row is read.
      *
-     * @return <code>true</code> if the new current row is valid;
-     *         <code>false</code> if there are no more rows
+     * @return {@code true} if the new current row is valid;
+     *         {@code false} if there are no more rows
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -811,16 +811,16 @@
     }
 
     /**
-     * Releases this rowset's <code>ResultSet</code> object's database and
+     * Releases this rowset's {@code ResultSet} object's database and
      * JDBC resources immediately instead of waiting for
      * this to happen when it is automatically closed.
      *
-     * <P><B>Note:</B> A <code>ResultSet</code> object
+     * <P><B>Note:</B> A {@code ResultSet} object
      * is automatically closed by the
-     * <code>Statement</code> object that generated it when
-     * that <code>Statement</code> object is closed,
+     * {@code Statement} object that generated it when
+     * that {@code Statement} object is closed,
      * re-executed, or is used to retrieve the next result from a
-     * sequence of multiple results. A <code>ResultSet</code> object
+     * sequence of multiple results. A {@code ResultSet} object
      * is also automatically closed when it is garbage collected.
      *
      * @throws SQLException if a database access error occurs
@@ -836,14 +836,14 @@
 
     /**
      * Reports whether the last column read from this rowset's
-     * <code>ResultSet</code> object had a value of SQL <code>NULL</code>.
-     * Note that you must first call one of the <code>getXXX</code> methods
+     * {@code ResultSet} object had a value of SQL {@code NULL}.
+     * Note that you must first call one of the {@code getXXX} methods
      * on a column to try to read its value and then call
-     * the method <code>wasNull</code> to see if the value read was
-     * SQL <code>NULL</code>.
-     *
-     * @return <code>true</code> if the last column value read was SQL
-     *         <code>NULL</code> and <code>false</code> otherwise
+     * the method {@code wasNull} to see if the value read was
+     * SQL {@code NULL}.
+     *
+     * @return {@code true} if the last column value read was SQL
+     *         {@code NULL} and {@code false} otherwise
      * @throws SQLException if a database access error occurs
      *            or this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -860,12 +860,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>String</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code String}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -878,12 +878,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>boolean</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code boolean}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>false</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code false}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -896,12 +896,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>byte</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code byte}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -914,12 +914,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>short</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code short}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -932,12 +932,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * an <code>int</code>.
+     * of this rowset's {@code ResultSet} object as
+     * an {@code int}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -950,12 +950,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>long</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code long}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -968,12 +968,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>float</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code float}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -986,12 +986,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>double</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code double}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1004,13 +1004,13 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>java.sql.BigDecimal</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code java.sql.BigDecimal}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param scale the number of digits to the right of the decimal point
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1025,13 +1025,13 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>byte</code> array in the Java programming language.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code byte} array in the Java programming language.
      * The bytes represent the raw values returned by the driver.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1044,12 +1044,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>java.sql.Date</code> object in the Java programming language.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code java.sql.Date} object in the Java programming language.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1062,12 +1062,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>java.sql.Time</code> object in the Java programming language.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code java.sql.Time} object in the Java programming language.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1080,12 +1080,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>java.sql.Timestamp</code> object in the Java programming language.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code java.sql.Timestamp} object in the Java programming language.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1098,25 +1098,25 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
+     * of this rowset's {@code ResultSet} object as
      * a stream of ASCII characters. The value can then be read in chunks from the
      * stream. This method is particularly
-     * suitable for retrieving large <code>LONGVARCHAR</code> values.
+     * suitable for retrieving large {@code LONGVARCHAR} values.
      * The JDBC driver will
      * do any necessary conversion from the database format into ASCII.
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
-     * call to a <code>getXXX</code> method implicitly closes the stream.  Also, a
-     * stream may return <code>0</code> when the method
-     * <code>InputStream.available</code>
+     * call to a {@code getXXX} method implicitly closes the stream.  Also, a
+     * stream may return {@code 0} when the method
+     * {@code InputStream.available}
      * is called whether there is data available or not.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @return a Java input stream that delivers the database column value
-     * as a stream of one-byte ASCII characters;
-     * if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     *         as a stream of one-byte ASCII characters;
+     *         if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) database access error occurs
      *            (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1129,31 +1129,31 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
+     * of this rowset's {@code ResultSet} object as
      * as a stream of Unicode characters.
      * The value can then be read in chunks from the
      * stream. This method is particularly
-     * suitable for retrieving large<code>LONGVARCHAR</code>values.  The JDBC driver will
+     * suitable for retrieving large{@code LONGVARCHAR}values.  The JDBC driver will
      * do any necessary conversion from the database format into Unicode.
      * The byte format of the Unicode stream must be Java UTF-8,
      * as specified in the Java virtual machine specification.
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
-     * call to a <code>getXXX</code> method implicitly closes the stream.  Also, a
-     * stream may return <code>0</code> when the method
-     * <code>InputStream.available</code>
+     * call to a {@code getXXX} method implicitly closes the stream.  Also, a
+     * stream may return {@code 0} when the method
+     * {@code InputStream.available}
      * is called whether there is data available or not.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @return a Java input stream that delivers the database column value
-     * as a stream in Java UTF-8 byte format;
-     * if the value is SQL <code>NULL</code>, the value returned is <code>null</code>
+     *         as a stream in Java UTF-8 byte format;
+     *         if the value is SQL {@code NULL}, the value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
-     * @deprecated use <code>getCharacterStream</code> in place of
-     *              <code>getUnicodeStream</code>
+     * @deprecated use {@code getCharacterStream} in place of
+     *              {@code getUnicodeStream}
      */
     @Deprecated
     public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException {
@@ -1165,22 +1165,22 @@
     /**
      * Gets the value of a column in the current row as a stream of
      * the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a binary stream of
+     * of this rowset's {@code ResultSet} object as a binary stream of
      * uninterpreted bytes. The value can then be read in chunks from the
      * stream. This method is particularly
-     * suitable for retrieving large <code>LONGVARBINARY</code> values.
+     * suitable for retrieving large {@code LONGVARBINARY} values.
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
-     * call to a <code>getXXX</code> method implicitly closes the stream.  Also, a
-     * stream may return <code>0</code> when the method
-     * <code>InputStream.available</code>
+     * call to a {@code getXXX} method implicitly closes the stream.  Also, a
+     * stream may return {@code 0} when the method
+     * {@code InputStream.available}
      * is called whether there is data available or not.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @return a Java input stream that delivers the database column value
-     * as a stream of uninterpreted bytes;
-     * if the value is SQL <code>NULL</code>, the value returned is <code>null</code>
+     *         as a stream of uninterpreted bytes;
+     *         if the value is SQL {@code NULL}, the value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1198,12 +1198,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>String</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code String}.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1214,12 +1214,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>boolean</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code boolean}.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>false</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code false}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1230,12 +1230,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>byte</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code byte}.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1246,12 +1246,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>short</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code short}.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1262,12 +1262,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * an <code>int</code>.
+     * of this rowset's {@code ResultSet} object as
+     * an {@code int}.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1278,12 +1278,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>long</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code long}.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if a database access error occurs
      *            or this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1294,12 +1294,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>float</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code float}.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1310,12 +1310,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>double</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code double}.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code 0}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1326,13 +1326,13 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>java.math.BigDecimal</code>.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code java.math.BigDecimal}.
      *
      * @param columnName the SQL name of the column
      * @param scale the number of digits to the right of the decimal point
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     * value returned is {@code null}
      * @throws SQLException if (1) adatabase access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1345,13 +1345,13 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>byte</code> array in the Java programming language.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code byte} array in the Java programming language.
      * The bytes represent the raw values returned by the driver.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1362,12 +1362,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>java.sql.Date</code> object in the Java programming language.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code java.sql.Date} object in the Java programming language.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1378,13 +1378,13 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>java.sql.Time</code> object in the Java programming language.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code java.sql.Time} object in the Java programming language.
      *
      * @param columnName the SQL name of the column
      * @return the column value;
-     * if the value is SQL <code>NULL</code>,
-     * the value returned is <code>null</code>
+     * if the value is SQL {@code NULL},
+     * the value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1395,12 +1395,12 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * a <code>java.sql.Timestamp</code> object.
+     * of this rowset's {@code ResultSet} object as
+     * a {@code java.sql.Timestamp} object.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     * value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1411,24 +1411,24 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a stream of
+     * of this rowset's {@code ResultSet} object as a stream of
      * ASCII characters. The value can then be read in chunks from the
      * stream. This method is particularly
-     * suitable for retrieving large <code>LONGVARCHAR</code> values.
+     * suitable for retrieving large {@code LONGVARCHAR} values.
      * The JDBC driver will
      * do any necessary conversion from the database format into ASCII.
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
-     * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
-     * stream may return <code>0</code> when the method <code>available</code>
+     * call to a {@code getXXX} method implicitly closes the stream. Also, a
+     * stream may return {@code 0} when the method {@code available}
      * is called whether there is data available or not.
      *
      * @param columnName the SQL name of the column
      * @return a Java input stream that delivers the database column value
-     * as a stream of one-byte ASCII characters.
-     * If the value is SQL <code>NULL</code>,
-     * the value returned is <code>null</code>.
+     *         as a stream of one-byte ASCII characters.
+     *         If the value is SQL {@code NULL},
+     *         the value returned is {@code null}.
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1439,10 +1439,10 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a stream of
+     * of this rowset's {@code ResultSet} object as a stream of
      * Unicode characters. The value can then be read in chunks from the
      * stream. This method is particularly
-     * suitable for retrieving large <code>LONGVARCHAR</code> values.
+     * suitable for retrieving large {@code LONGVARCHAR} values.
      * The JDBC driver will
      * do any necessary conversion from the database format into Unicode.
      * The byte format of the Unicode stream must be Java UTF-8,
@@ -1450,15 +1450,15 @@
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
-     * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
-     * stream may return <code>0</code> when the method <code>available</code>
+     * call to a {@code getXXX} method implicitly closes the stream. Also, a
+     * stream may return {@code 0} when the method {@code available}
      * is called whether there is data available or not.
      *
      * @param columnName the SQL name of the column
      * @return a Java input stream that delivers the database column value
-     * as a stream of two-byte Unicode characters.
-     * If the value is SQL <code>NULL</code>,
-     * the value returned is <code>null</code>.
+     *         as a stream of two-byte Unicode characters.
+     *         If the value is SQL {@code NULL},
+     *         the value returned is {@code null}.
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1471,23 +1471,23 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a stream of uninterpreted
-     * <code>byte</code>s.
+     * of this rowset's {@code ResultSet} object as a stream of uninterpreted
+     * {@code byte}s.
      * The value can then be read in chunks from the
      * stream. This method is particularly
-     * suitable for retrieving large <code>LONGVARBINARY</code>
+     * suitable for retrieving large {@code LONGVARBINARY}
      * values.
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
-     * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
-     * stream may return <code>0</code> when the method <code>available</code>
+     * call to a {@code getXXX} method implicitly closes the stream. Also, a
+     * stream may return {@code 0} when the method {@code available}
      * is called whether there is data available or not.
      *
      * @param columnName the SQL name of the column
      * @return a Java input stream that delivers the database column value
-     * as a stream of uninterpreted bytes;
-     * if the value is SQL <code>NULL</code>, the result is <code>null</code>
+     *         as a stream of uninterpreted bytes;
+     *         if the value is SQL {@code NULL}, the result is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1503,21 +1503,21 @@
 
     /**
      * Returns the first warning reported by calls on this rowset's
-     * <code>ResultSet</code> object.
-     * Subsequent warnings on this rowset's <code>ResultSet</code> object
-     * will be chained to the <code>SQLWarning</code> object that
+     * {@code ResultSet} object.
+     * Subsequent warnings on this rowset's {@code ResultSet} object
+     * will be chained to the {@code SQLWarning} object that
      * this method returns.
      *
      * <P>The warning chain is automatically cleared each time a new
      * row is read.
      *
      * <P><B>Note:</B> This warning chain only covers warnings caused
-     * by <code>ResultSet</code> methods.  Any warning caused by
-     * <code>Statement</code> methods
+     * by {@code ResultSet} methods.  Any warning caused by
+     * {@code Statement} methods
      * (such as reading OUT parameters) will be chained on the
-     * <code>Statement</code> object.
-     *
-     * @return the first <code>SQLWarning</code> object reported or <code>null</code>
+     * {@code Statement} object.
+     *
+     * @return the first {@code SQLWarning} object reported or {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1529,10 +1529,10 @@
     }
 
     /**
-     * Clears all warnings reported on this rowset's <code>ResultSet</code> object.
-     * After this method is called, the method <code>getWarnings</code>
-     * returns <code>null</code> until a new warning is
-     * reported for this rowset's <code>ResultSet</code> object.
+     * Clears all warnings reported on this rowset's {@code ResultSet} object.
+     * After this method is called, the method {@code getWarnings}
+     * returns {@code null} until a new warning is
+     * reported for this rowset's {@code ResultSet} object.
      *
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not have a currently valid connection,
@@ -1545,26 +1545,26 @@
     }
 
     /**
-     * Gets the name of the SQL cursor used by this rowset's <code>ResultSet</code>
+     * Gets the name of the SQL cursor used by this rowset's {@code ResultSet}
      * object.
      *
      * <P>In SQL, a result table is retrieved through a cursor that is
      * named. The current row of a result set can be updated or deleted
      * using a positioned update/delete statement that references the
      * cursor name. To insure that the cursor has the proper isolation
-     * level to support update, the cursor's <code>select</code> statement should be
+     * level to support update, the cursor's {@code select} statement should be
      * of the form 'select for update'. If the 'for update' clause is
      * omitted, the positioned updates may fail.
      *
      * <P>The JDBC API supports this SQL feature by providing the name of the
-     * SQL cursor used by a <code>ResultSet</code> object.
-     * The current row of a <code>ResultSet</code> object
+     * SQL cursor used by a {@code ResultSet} object.
+     * The current row of a {@code ResultSet} object
      * is also the current row of this SQL cursor.
      *
      * <P><B>Note:</B> If positioned update is not supported, a
-     * <code>SQLException</code> is thrown.
-     *
-     * @return the SQL name for this rowset's <code>ResultSet</code> object's cursor
+     * {@code SQLException} is thrown.
+     *
+     * @return the SQL name for this rowset's {@code ResultSet} object's cursor
      * @throws SQLException if (1) a database access error occurs
      *            or (2) xthis rowset does not have a currently valid connection,
      *            prepared statement, and result set
@@ -1577,9 +1577,9 @@
 
     /**
      * Retrieves the  number, types and properties of
-     * this rowset's <code>ResultSet</code> object's columns.
-     *
-     * @return the description of this rowset's <code>ResultSet</code>
+     * this rowset's {@code ResultSet} object's columns.
+     *
+     * @return the description of this rowset's {@code ResultSet}
      *     object's columns
      * @throws SQLException if (1) a database access error occurs
      *     or (2) this rowset does not have a currently valid connection,
@@ -1607,8 +1607,8 @@
 
     /**
      * <p>Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * an <code>Object</code>.
+     * of this rowset's {@code ResultSet} object as
+     * an {@code Object}.
      *
      * <p>This method will return the value of the given column as a
      * Java object.  The type of the Java object will be the default
@@ -1620,14 +1620,14 @@
      * abstract data types.
      *
      * In the JDBC 3.0 API, the behavior of method
-     * <code>getObject</code> is extended to materialize
+     * {@code getObject} is extended to materialize
      * data of SQL user-defined types.  When a column contains
      * a structured or distinct value, the behavior of this method is as
-     * if it were a call to: <code>getObject(columnIndex,
-     * this.getStatement().getConnection().getTypeMap())</code>.
+     * if it were a call to: {@code getObject(columnIndex,
+     * this.getStatement().getConnection().getTypeMap())}.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @return a <code>java.lang.Object</code> holding the column value
+     * @return a {@code java.lang.Object} holding the column value
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -1640,8 +1640,8 @@
 
     /**
      * <p>Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as
-     * an <code>Object</code>.
+     * of this rowset's {@code ResultSet} object as
+     * an {@code Object}.
      *
      * <p>This method will return the value of the given column as a
      * Java object.  The type of the Java object will be the default
@@ -1653,14 +1653,14 @@
      * abstract data types.
      *
      * In the JDBC 3.0 API, the behavior of the method
-     * <code>getObject</code> is extended to materialize
+     * {@code getObject} is extended to materialize
      * data of SQL user-defined types.  When a column contains
      * a structured or distinct value, the behavior of this method is as
-     * if it were a call to: <code>getObject(columnIndex,
-     * this.getStatement().getConnection().getTypeMap())</code>.
+     * if it were a call to: {@code getObject(columnIndex,
+     * this.getStatement().getConnection().getTypeMap())}.
      *
      * @param columnName the SQL name of the column
-     * @return a <code>java.lang.Object</code> holding the column value
+     * @return a {@code java.lang.Object} holding the column value
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -1672,9 +1672,9 @@
     //----------------------------------------------------------------
 
     /**
-     * Maps the given <code>JdbcRowSetImpl</code> column name to its
-     * <code>JdbcRowSetImpl</code> column index and reflects this on
-     * the internal <code>ResultSet</code> object.
+     * Maps the given {@code JdbcRowSetImpl} column name to its
+     * {@code JdbcRowSetImpl} column index and reflects this on
+     * the internal {@code ResultSet} object.
      *
      * @param columnName the name of the column
      * @return the column index of the given column name
@@ -1697,11 +1697,11 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a
-     * <code>java.io.Reader</code> object.
-     * @return a <code>java.io.Reader</code> object that contains the column
-     * value; if the value is SQL <code>NULL</code>, the value returned is
-     * <code>null</code>.
+     * of this rowset's {@code ResultSet} object as a
+     * {@code java.io.Reader} object.
+     * @return a {@code java.io.Reader} object that contains the column
+     * value; if the value is SQL {@code NULL}, the value returned is
+     * {@code null}.
      * @param columnIndex the first column is 1, the second is 2, and so on
      *
      */
@@ -1713,14 +1713,14 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a
-     * <code>java.io.Reader</code> object.
-     *
-     * @return a <code>java.io.Reader</code> object that contains the column
-     * value; if the value is SQL <code>NULL</code>, the value returned is
-     * <code>null</code>.
+     * of this rowset's {@code ResultSet} object as a
+     * {@code java.io.Reader} object.
+     *
+     * @return a {@code java.io.Reader} object that contains the column
+     * value; if the value is SQL {@code NULL}, the value returned is
+     * {@code null}.
      * @param columnName the name of the column
-     * @return the value in the specified column as a <code>java.io.Reader</code>
+     * @return the value in the specified column as a {@code java.io.Reader}
      *
      */
     public java.io.Reader getCharacterStream(String columnName) throws SQLException {
@@ -1729,13 +1729,13 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a
-     * <code>java.math.BigDecimal</code> with full precision.
+     * of this rowset's {@code ResultSet} object as a
+     * {@code java.math.BigDecimal} with full precision.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @return the column value (full precision);
-     * if the value is SQL <code>NULL</code>, the value returned is
-     * <code>null</code>.
+     *         if the value is SQL {@code NULL}, the value returned is
+     *         {@code null}.
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid
      *            connection, prepared statement, and result set
@@ -1748,13 +1748,13 @@
 
     /**
      * Gets the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a
-     * <code>java.math.BigDecimal</code> with full precision.
+     * of this rowset's {@code ResultSet} object as a
+     * {@code java.math.BigDecimal} with full precision.
      *
      * @param columnName the column name
      * @return the column value (full precision);
-     * if the value is SQL <code>NULL</code>, the value returned is
-     * <code>null</code>.
+     *         if the value is SQL {@code NULL}, the value returned is
+     *         {@code null}.
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid
      *            connection, prepared statement, and result set
@@ -1769,11 +1769,11 @@
 
     /**
      * Indicates whether the cursor is before the first row in
-     * this rowset's <code>ResultSet</code> object.
-     *
-     * @return <code>true</code> if the cursor is before the first row;
-     * <code>false</code> if the cursor is at any other position or the
-     * result set contains no rows
+     * this rowset's {@code ResultSet} object.
+     *
+     * @return {@code true} if the cursor is before the first row;
+     *         {@code false} if the cursor is at any other position or the
+     *         result set contains no rows
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid
      *            connection, prepared statement, and result set
@@ -1786,11 +1786,11 @@
 
     /**
      * Indicates whether the cursor is after the last row in
-     * this rowset's <code>ResultSet</code> object.
-     *
-     * @return <code>true</code> if the cursor is after the last row;
-     * <code>false</code> if the cursor is at any other position or the
-     * result set contains no rows
+     * this rowset's {@code ResultSet} object.
+     *
+     * @return {@code true} if the cursor is after the last row;
+     *         {@code false} if the cursor is at any other position or the
+     *         result set contains no rows
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid
      *            connection, prepared statement, and result set
@@ -1803,10 +1803,10 @@
 
     /**
      * Indicates whether the cursor is on the first row of
-     * this rowset's <code>ResultSet</code> object.
-     *
-     * @return <code>true</code> if the cursor is on the first row;
-     * <code>false</code> otherwise
+     * this rowset's {@code ResultSet} object.
+     *
+     * @return {@code true} if the cursor is on the first row;
+     *         {@code false} otherwise
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid
      *            connection, prepared statement, and result set
@@ -1819,14 +1819,14 @@
 
     /**
      * Indicates whether the cursor is on the last row of
-     * this rowset's <code>ResultSet</code> object.
-     * Note: Calling the method <code>isLast</code> may be expensive
+     * this rowset's {@code ResultSet} object.
+     * Note: Calling the method {@code isLast} may be expensive
      * because the JDBC driver
      * might need to fetch ahead one row in order to determine
      * whether the current row is the last row in the result set.
      *
-     * @return <code>true</code> if the cursor is on the last row;
-     * <code>false</code> otherwise
+     * @return {@code true} if the cursor is on the last row;
+     *         {@code false} otherwise
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid
      *            connection, prepared statement, and result set
@@ -1840,11 +1840,11 @@
 
     /**
      * Moves the cursor to the front of
-     * this rowset's <code>ResultSet</code> object, just before the
+     * this rowset's {@code ResultSet} object, just before the
      * first row. This method has no effect if the result set contains no rows.
      *
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+     *            (2) the result set type is {@code TYPE_FORWARD_ONLY},
      *            or (3) this rowset does not currently have a valid
      *            connection, prepared statement, and result set
      */
@@ -1857,10 +1857,10 @@
 
     /**
      * Moves the cursor to the end of
-     * this rowset's <code>ResultSet</code> object, just after the
+     * this rowset's {@code ResultSet} object, just after the
      * last row. This method has no effect if the result set contains no rows.
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+     *            (2) the result set type is {@code TYPE_FORWARD_ONLY},
      *            or (3) this rowset does not currently have a valid
      *            connection, prepared statement, and result set
      */
@@ -1873,12 +1873,12 @@
 
     /**
      * Moves the cursor to the first row in
-     * this rowset's <code>ResultSet</code> object.
-     *
-     * @return <code>true</code> if the cursor is on a valid row;
-     * <code>false</code> if there are no rows in the result set
+     * this rowset's {@code ResultSet} object.
+     *
+     * @return {@code true} if the cursor is on a valid row;
+     * {@code false} if there are no rows in the result set
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+     *            (2) the result set type is {@code TYPE_FORWARD_ONLY},
      *            or (3) this rowset does not currently have a valid
      *            connection, prepared statement, and result set
      */
@@ -1893,12 +1893,12 @@
 
     /**
      * Moves the cursor to the last row in
-     * this rowset's <code>ResultSet</code> object.
-     *
-     * @return <code>true</code> if the cursor is on a valid row;
-     * <code>false</code> if there are no rows in the result set
+     * this rowset's {@code ResultSet} object.
+     *
+     * @return {@code true} if the cursor is on a valid row;
+     * {@code false} if there are no rows in the result set
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+     *            (2) the result set type is {@code TYPE_FORWARD_ONLY},
      *            or (3) this rowset does not currently have a valid
      *            connection, prepared statement, and result set
      */
@@ -1914,7 +1914,7 @@
      * Retrieves the current row number.  The first row is number 1, the
      * second is number 2, and so on.
      *
-     * @return the current row number; <code>0</code> if there is no current row
+     * @return the current row number; {@code 0} if there is no current row
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -1927,7 +1927,7 @@
 
     /**
      * Moves the cursor to the given row number in
-     * this rowset's internal <code>ResultSet</code> object.
+     * this rowset's internal {@code ResultSet} object.
      *
      * <p>If the row number is positive, the cursor moves to
      * the given row number with respect to the
@@ -1937,23 +1937,23 @@
      * <p>If the given row number is negative, the cursor moves to
      * an absolute row position with respect to
      * the end of the result set.  For example, calling the method
-     * <code>absolute(-1)</code> positions the
-     * cursor on the last row, calling the method <code>absolute(-2)</code>
+     * {@code absolute(-1)} positions the
+     * cursor on the last row, calling the method {@code absolute(-2)}
      * moves the cursor to the next-to-last row, and so on.
      *
      * <p>An attempt to position the cursor beyond the first/last row in
      * the result set leaves the cursor before the first row or after
      * the last row.
      *
-     * <p><B>Note:</B> Calling <code>absolute(1)</code> is the same
-     * as calling <code>first()</code>. Calling <code>absolute(-1)</code>
-     * is the same as calling <code>last()</code>.
-     *
-     * @return <code>true</code> if the cursor is on the result set;
-     * <code>false</code> otherwise
+     * <p><B>Note:</B> Calling {@code absolute(1)} is the same
+     * as calling {@code first()}. Calling {@code absolute(-1)}
+     * is the same as calling {@code last()}.
+     *
+     * @return {@code true} if the cursor is on the result set;
+     * {@code false} otherwise
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) the row is <code>0</code>, (3) the result set
-     *            type is <code>TYPE_FORWARD_ONLY</code>, or (4) this
+     *            (2) the row is {@code 0}, (3) the result set
+     *            type is {@code TYPE_FORWARD_ONLY}, or (4) this
      *            rowset does not currently have a valid connection,
      *            prepared statement, and result set
      */
@@ -1969,21 +1969,21 @@
      * Moves the cursor a relative number of rows, either positive or negative.
      * Attempting to move beyond the first/last row in the
      * result set positions the cursor before/after the
-     * the first/last row. Calling <code>relative(0)</code> is valid, but does
+     * the first/last row. Calling {@code relative(0)} is valid, but does
      * not change the cursor position.
      *
-     * <p>Note: Calling the method <code>relative(1)</code>
-     * is different from calling the method <code>next()</code>
-     * because is makes sense to call <code>next()</code> when there
+     * <p>Note: Calling the method {@code relative(1)}
+     * is different from calling the method {@code next()}
+     * because is makes sense to call {@code next()} when there
      * is no current row,
      * for example, when the cursor is positioned before the first row
      * or after the last row of the result set.
      *
-     * @return <code>true</code> if the cursor is on a row;
-     * <code>false</code> otherwise
+     * @return {@code true} if the cursor is on a row;
+     *         {@code false} otherwise
      * @throws SQLException if (1) a database access error occurs,
      *            (2) there is no current row, (3) the result set
-     *            type is <code>TYPE_FORWARD_ONLY</code>, or (4) this
+     *            type is {@code TYPE_FORWARD_ONLY}, or (4) this
      *            rowset does not currently have a valid connection,
      *            prepared statement, and result set
      */
@@ -1997,16 +1997,16 @@
 
     /**
      * Moves the cursor to the previous row in this
-     * <code>ResultSet</code> object.
-     *
-     * <p><B>Note:</B> Calling the method <code>previous()</code> is not the same as
-     * calling the method <code>relative(-1)</code> because it
-     * makes sense to call <code>previous()</code> when there is no current row.
-     *
-     * @return <code>true</code> if the cursor is on a valid row;
-     * <code>false</code> if it is off the result set
+     * {@code ResultSet} object.
+     *
+     * <p><B>Note:</B> Calling the method {@code previous()} is not the same as
+     * calling the method {@code relative(-1)} because it
+     * makes sense to call {@code previous()} when there is no current row.
+     *
+     * @return {@code true} if the cursor is on a valid row;
+     *         {@code false} if it is off the result set
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+     *            (2) the result set type is {@code TYPE_FORWARD_ONLY},
      *            or (3) this rowset does not currently have a valid
      *            connection, prepared statement, and result set
      */
@@ -2020,15 +2020,15 @@
 
     /**
      * Gives a hint as to the direction in which the rows in this
-     * <code>ResultSet</code> object will be processed.
+     * {@code ResultSet} object will be processed.
      * The initial value is determined by the
-     * <code>Statement</code> object
-     * that produced this rowset's <code>ResultSet</code> object.
+     * {@code Statement} object
+     * that produced this rowset's {@code ResultSet} object.
      * The fetch direction may be changed at any time.
      *
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) the result set type is <code>TYPE_FORWARD_ONLY</code>
-     *            and the fetch direction is not <code>FETCH_FORWARD</code>,
+     *            (2) the result set type is {@code TYPE_FORWARD_ONLY}
+     *            and the fetch direction is not {@code FETCH_FORWARD},
      *            or (3) this rowset does not currently have a valid
      *            connection, prepared statement, and result set
      * @see java.sql.Statement#setFetchDirection
@@ -2041,10 +2041,10 @@
 
     /**
      * Returns the fetch direction for this
-     * <code>ResultSet</code> object.
+     * {@code ResultSet} object.
      *
      * @return the current fetch direction for this rowset's
-     *         <code>ResultSet</code> object
+     *         {@code ResultSet} object
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -2061,16 +2061,16 @@
     /**
      * Gives the JDBC driver a hint as to the number of rows that should
      * be fetched from the database when more rows are needed for this
-     * <code>ResultSet</code> object.
+     * {@code ResultSet} object.
      * If the fetch size specified is zero, the JDBC driver
      * ignores the value and is free to make its own best guess as to what
      * the fetch size should be.  The default value is set by the
-     * <code>Statement</code> object
+     * {@code Statement} object
      * that created the result set.  The fetch size may be changed at any time.
      *
      * @param rows the number of rows to fetch
      * @throws SQLException if (1) a database access error occurs, (2) the
-     *            condition <code>0 <= rows <= this.getMaxRows()</code> is not
+     *            condition {@code 0 <= rows <= this.getMaxRows()} is not
      *            satisfied, or (3) this rowset does not currently have a valid
      *            connection, prepared statement, and result set
      *
@@ -2084,9 +2084,9 @@
     /**
      *
      * Returns the fetch size for this
-     * <code>ResultSet</code> object.
-     *
-     * @return the current fetch size for this rowset's <code>ResultSet</code> object
+     * {@code ResultSet} object.
+     *
+     * @return the current fetch size for this rowset's {@code ResultSet} object
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -2111,12 +2111,12 @@
     }
 
     /**
-     * Returns the concurrency mode of this rowset's <code>ResultSet</code> object.
+     * Returns the concurrency mode of this rowset's {@code ResultSet} object.
      * The concurrency used is determined by the
-     * <code>Statement</code> object that created the result set.
-     *
-     * @return the concurrency type, either <code>CONCUR_READ_ONLY</code>
-     * or <code>CONCUR_UPDATABLE</code>
+     * {@code Statement} object that created the result set.
+     *
+     * @return the concurrency type, either {@code CONCUR_READ_ONLY}
+     * or {@code CONCUR_UPDATABLE}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -2138,7 +2138,7 @@
      * Indicates whether the current row has been updated.  The value returned
      * depends on whether or not the result set can detect updates.
      *
-     * @return <code>true</code> if the row has been visibly updated
+     * @return {@code true} if the row has been visibly updated
      * by the owner or another, and updates are detected
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
@@ -2154,10 +2154,10 @@
     /**
      * Indicates whether the current row has had an insertion.
      * The value returned depends on whether or not this
-     * <code>ResultSet</code> object can detect visible inserts.
-     *
-     * @return <code>true</code> if a row has had an insertion
-     * and insertions are detected; <code>false</code> otherwise
+     * {@code ResultSet} object can detect visible inserts.
+     *
+     * @return {@code true} if a row has had an insertion
+     *         and insertions are detected; {@code false} otherwise
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -2174,10 +2174,10 @@
      * Indicates whether a row has been deleted.  A deleted row may leave
      * a visible "hole" in a result set.  This method can be used to
      * detect holes in a result set.  The value returned depends on whether
-     * or not this rowset's <code>ResultSet</code> object can detect deletions.
-     *
-     * @return <code>true</code> if a row was deleted and deletions are detected;
-     * <code>false</code> otherwise
+     * or not this rowset's {@code ResultSet} object can detect deletions.
+     *
+     * @return {@code true} if a row was deleted and deletions are detected;
+     *         {@code false} otherwise
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -2192,10 +2192,10 @@
     /**
      * Gives a nullable column a null value.
      *
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code>
-     * or <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow}
+     * or {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @throws SQLException if a database access error occurs
@@ -2213,11 +2213,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>boolean</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code boolean} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2237,11 +2237,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>byte</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code byte} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
@@ -2262,11 +2262,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>short</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code short} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2286,11 +2286,11 @@
     }
 
     /**
-     * Updates the designated column with an <code>int</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with an {@code int} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2309,11 +2309,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>long</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code long} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2333,11 +2333,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>float</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code float} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2357,11 +2357,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>double</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code double} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2381,12 +2381,12 @@
     }
 
     /**
-     * Updates the designated column with a <code>java.math.BigDecimal</code>
+     * Updates the designated column with a {@code java.math.BigDecimal}
      * value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2406,11 +2406,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>String</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code String} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2430,11 +2430,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>byte</code> array value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code byte} array value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2454,11 +2454,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>java.sql.Date</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code java.sql.Date} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2479,11 +2479,11 @@
 
 
     /**
-     * Updates the designated column with a <code>java.sql.Time</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code java.sql.Time} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2503,12 +2503,12 @@
     }
 
     /**
-     * Updates the designated column with a <code>java.sql.Timestamp</code>
+     * Updates the designated column with a {@code java.sql.Timestamp}
      * value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2529,10 +2529,10 @@
 
     /**
      * Updates the designated column with an ascii stream value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2554,10 +2554,10 @@
 
     /**
      * Updates the designated column with a binary stream value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2579,10 +2579,10 @@
 
     /**
      * Updates the designated column with a character stream value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2603,18 +2603,18 @@
     }
 
     /**
-     * Updates the designated column with an <code>Object</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with an {@code Object} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
-     * @param scale for <code>java.sql.Types.DECIMAl</code>
-     *  or <code>java.sql.Types.NUMERIC</code> types,
-     *  this is the number of digits after the decimal point.  For all other
-     *  types this value will be ignored.
+     * @param scale for {@code java.sql.Types.DECIMAl}
+     *        or {@code java.sql.Types.NUMERIC} types,
+     *        this is the number of digits after the decimal point.  For all other
+     *        types this value will be ignored.
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -2631,11 +2631,11 @@
     }
 
     /**
-     * Updates the designated column with an <code>Object</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with an {@code Object} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
      * @param x the new column value
@@ -2655,11 +2655,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>null</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code null} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @throws SQLException if a database access error occurs
@@ -2672,11 +2672,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>boolean</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code boolean} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2688,11 +2688,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>byte</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code byte} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2704,11 +2704,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>short</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code short} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2720,11 +2720,11 @@
     }
 
     /**
-     * Updates the designated column with an <code>int</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with an {@code int} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2736,11 +2736,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>long</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code long} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2752,11 +2752,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>float </code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code float } value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2768,11 +2768,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>double</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code double} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2784,12 +2784,12 @@
     }
 
     /**
-     * Updates the designated column with a <code>java.sql.BigDecimal</code>
+     * Updates the designated column with a {@code java.sql.BigDecimal}
      * value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2801,11 +2801,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>String</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code String} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2817,19 +2817,19 @@
     }
 
     /**
-     * Updates the designated column with a <code>boolean</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code boolean} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * JDBC 2.0
      *
      * Updates a column with a byte array value.
      *
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row, or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or <code>insertRow</code>
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row, or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or {@code insertRow}
      * methods are called to update the database.
      *
      * @param columnName the name of the column
@@ -2842,11 +2842,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>java.sql.Date</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code java.sql.Date} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2858,11 +2858,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>java.sql.Time</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with a {@code java.sql.Time} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2874,12 +2874,12 @@
     }
 
     /**
-     * Updates the designated column with a <code>java.sql.Timestamp</code>
+     * Updates the designated column with a {@code java.sql.Timestamp}
      * value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2892,10 +2892,10 @@
 
     /**
      * Updates the designated column with an ascii stream value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2909,10 +2909,10 @@
 
     /**
      * Updates the designated column with a binary stream value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2926,14 +2926,14 @@
 
     /**
      * Updates the designated column with a character stream value.
-     * The <code>updateXXX</code> methods are used to update column values
-     * in the current row or the insert row.  The <code>updateXXX</code>
+     * The {@code updateXXX} methods are used to update column values
+     * in the current row or the insert row.  The {@code updateXXX}
      * methods do not update the underlying database; instead the
-     * <code>updateRow</code> or <code>insertRow</code> methods are called
+     * {@code updateRow} or {@code insertRow} methods are called
      * to update the database.
      *
      * @param columnName the name of the column
-     * @param reader the new column <code>Reader</code> stream value
+     * @param reader the new column {@code Reader} stream value
      * @param length the length of the stream
      * @throws SQLException if a database access error occurs
      *
@@ -2943,16 +2943,16 @@
     }
 
     /**
-     * Updates the designated column with an <code>Object</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with an {@code Object} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
-     * @param scale for <code>java.sql.Types.DECIMAL</code>
-     *  or <code>java.sql.Types.NUMERIC</code> types,
+     * @param scale for {@code java.sql.Types.DECIMAL}
+     *  or {@code java.sql.Types.NUMERIC} types,
      *  this is the number of digits after the decimal point.  For all other
      *  types this value will be ignored.
      * @throws SQLException if a database access error occurs
@@ -2963,11 +2963,11 @@
     }
 
     /**
-     * Updates the designated column with an <code>Object</code> value.
-     * The <code>updateXXX</code> methods are used to update column values in the
-     * current row or the insert row.  The <code>updateXXX</code> methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * Updates the designated column with an {@code Object} value.
+     * The {@code updateXXX} methods are used to update column values in the
+     * current row or the insert row.  The {@code updateXXX} methods do not
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnName the name of the column
      * @param x the new column value
@@ -2980,7 +2980,7 @@
 
     /**
      * Inserts the contents of the insert row into this
-     * <code>ResultSet</code> object and into the database
+     * {@code ResultSet} object and into the database
      * and also notifies listeners that a row has changed.
      * The cursor must be on the insert row when this method is called.
      *
@@ -3000,14 +3000,14 @@
 
     /**
      * Updates the underlying database with the new contents of the
-     * current row of this rowset's <code>ResultSet</code> object
+     * current row of this rowset's {@code ResultSet} object
      * and notifies listeners that a row has changed.
      * This method cannot be called when the cursor is on the insert row.
      *
      * @throws SQLException if (1) a database access error occurs,
      *            (2) this method is called when the cursor is
      *             on the insert row, (3) the concurrency of the result
-     *             set is <code>ResultSet.CONCUR_READ_ONLY</code>, or
+     *             set is {@code ResultSet.CONCUR_READ_ONLY}, or
      *             (4) this rowset does not currently have a valid connection,
      *             prepared statement, and result set
      */
@@ -3019,18 +3019,18 @@
     }
 
     /**
-     * Deletes the current row from this rowset's <code>ResultSet</code> object
+     * Deletes the current row from this rowset's {@code ResultSet} object
      * and from the underlying database and also notifies listeners that a row
      * has changed.  This method cannot be called when the cursor is on the insert
      * row.
      *
      * @throws SQLException if a database access error occurs
-     * or if this method is called when the cursor is on the insert row
+     *         or if this method is called when the cursor is on the insert row
      * @throws SQLException if (1) a database access error occurs,
      *            (2) this method is called when the cursor is before the
      *            first row, after the last row, or on the insert row,
      *            (3) the concurrency of this rowset's result
-     *            set is <code>ResultSet.CONCUR_READ_ONLY</code>, or
+     *            set is {@code ResultSet.CONCUR_READ_ONLY}, or
      *            (4) this rowset does not currently have a valid connection,
      *            prepared statement, and result set
      */
@@ -3042,24 +3042,24 @@
     }
 
     /**
-     * Refreshes the current row of this rowset's <code>ResultSet</code>
+     * Refreshes the current row of this rowset's {@code ResultSet}
      * object with its most recent value in the database.  This method
      * cannot be called when the cursor is on the insert row.
      *
-     * <P>The <code>refreshRow</code> method provides a way for an
+     * <P>The {@code refreshRow} method provides a way for an
      * application to explicitly tell the JDBC driver to refetch
      * a row(s) from the database.  An application may want to call
-     * <code>refreshRow</code> when caching or prefetching is being
+     * {@code refreshRow} when caching or prefetching is being
      * done by the JDBC driver to fetch the latest value of a row
      * from the database.  The JDBC driver may actually refresh multiple
      * rows at once if the fetch size is greater than one.
      *
      * <P> All values are refetched subject to the transaction isolation
-     * level and cursor sensitivity.  If <code>refreshRow</code> is called after
-     * calling an <code>updateXXX</code> method, but before calling
-     * the method <code>updateRow</code>, then the
+     * level and cursor sensitivity.  If {@code refreshRow} is called after
+     * calling an {@code updateXXX} method, but before calling
+     * the method {@code updateRow}, then the
      * updates made to the row are lost.  Calling the method
-     * <code>refreshRow</code> frequently will likely slow performance.
+     * {@code refreshRow} frequently will likely slow performance.
      *
      * @throws SQLException if (1) a database access error occurs,
      *            (2) this method is called when the cursor is
@@ -3076,12 +3076,12 @@
 
     /**
      * Cancels the updates made to the current row in this
-     * <code>ResultSet</code> object and notifies listeners that a row
+     * {@code ResultSet} object and notifies listeners that a row
      * has changed. This method may be called after calling an
-     * <code>updateXXX</code> method(s) and before calling
-     * the method <code>updateRow</code> to roll back
+     * {@code updateXXX} method(s) and before calling
+     * the method {@code updateRow} to roll back
      * the updates made to a row.  If no updates have been made or
-     * <code>updateRow</code> has already been called, this method has no
+     * {@code updateRow} has already been called, this method has no
      * effect.
      *
      * @throws SQLException if (1) a database access error occurs,
@@ -3104,19 +3104,19 @@
      *
      * The insert row is a special row associated with an updatable
      * result set.  It is essentially a buffer where a new row may
-     * be constructed by calling the <code>updateXXX</code> methods prior to
+     * be constructed by calling the {@code updateXXX} methods prior to
      * inserting the row into the result set.
      *
-     * Only the <code>updateXXX</code>, <code>getXXX</code>,
-     * and <code>insertRow</code> methods may be
+     * Only the {@code updateXXX}, {@code getXXX},
+     * and {@code insertRow} methods may be
      * called when the cursor is on the insert row.  All of the columns in
      * a result set must be given a value each time this method is
-     * called before calling <code>insertRow</code>.
-     * An <code>updateXXX</code> method must be called before a
-     * <code>getXXX</code> method can be called on a column value.
+     * called before calling {@code insertRow}.
+     * An {@code updateXXX} method must be called before a
+     * {@code getXXX} method can be called on a column value.
      *
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) this rowset's <code>ResultSet</code> object is
+     *            (2) this rowset's {@code ResultSet} object is
      *             not updatable, or (3) this rowset does not
      *             currently have a valid connection, prepared statement,
      *             and result set
@@ -3134,7 +3134,7 @@
      * the insert row.
      *
      * @throws SQLException if (1) a database access error occurs,
-     *            (2) this rowset's <code>ResultSet</code> object is
+     *            (2) this rowset's {@code ResultSet} object is
      *             not updatable, or (3) this rowset does not
      *             currently have a valid connection, prepared statement,
      *             and result set
@@ -3146,14 +3146,14 @@
     }
 
     /**
-     * Returns the <code>Statement</code> object that produced this
-     * <code>ResultSet</code> object.
+     * Returns the {@code Statement} object that produced this
+     * {@code ResultSet} object.
      * If the result set was generated some other way, such as by a
-     * <code>DatabaseMetaData</code> method, this method returns
-     * <code>null</code>.
-     *
-     * @return the <code>Statement</code> object that produced
-     * this rowset's <code>ResultSet</code> object or <code>null</code>
+     * {@code DatabaseMetaData} method, this method returns
+     * {@code null}.
+     *
+     * @return the {@code Statement} object that produced
+     * this rowset's {@code ResultSet} object or {@code null}
      * if the result set was produced some other way
      * @throws SQLException if a database access error occurs
      */
@@ -3169,16 +3169,16 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as an <code>Object</code>.
-     * This method uses the given <code>Map</code> object
+     * of this rowset's {@code ResultSet} object as an {@code Object}.
+     * This method uses the given {@code Map} object
      * for the custom mapping of the
      * SQL structured or distinct type that is being retrieved.
      *
      * @param i the first column is 1, the second is 2, and so on
-     * @param map a <code>java.util.Map</code> object that contains the mapping
-     * from SQL type names to classes in the Java programming language
-     * @return an <code>Object</code> in the Java programming language
-     * representing the SQL value
+     * @param map a {@code java.util.Map} object that contains the mapping
+     *        from SQL type names to classes in the Java programming language
+     * @return an {@code Object} in the Java programming language
+     *         representing the SQL value
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -3193,10 +3193,10 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>Ref</code> object.
+     * of this rowset's {@code ResultSet} object as a {@code Ref} object.
      *
      * @param i the first column is 1, the second is 2, and so on
-     * @return a <code>Ref</code> object representing an SQL <code>REF</code> value
+     * @return a {@code Ref} object representing an SQL {@code REF} value
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -3210,10 +3210,10 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>Blob</code> object.
+     * of this rowset's {@code ResultSet} object as a {@code Blob} object.
      *
      * @param i the first column is 1, the second is 2, and so on
-     * @return a <code>Blob</code> object representing the SQL <code>BLOB</code>
+     * @return a {@code Blob} object representing the SQL {@code BLOB}
      *         value in the specified column
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
@@ -3227,10 +3227,10 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>Clob</code> object.
+     * of this rowset's {@code ResultSet} object as a {@code Clob} object.
      *
      * @param i the first column is 1, the second is 2, and so on
-     * @return a <code>Clob</code> object representing the SQL <code>CLOB</code>
+     * @return a {@code Clob} object representing the SQL {@code CLOB}
      *         value in the specified column
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
@@ -3244,10 +3244,10 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as an <code>Array</code> object.
+     * of this rowset's {@code ResultSet} object as an {@code Array} object.
      *
      * @param i the first column is 1, the second is 2, and so on.
-     * @return an <code>Array</code> object representing the SQL <code>ARRAY</code>
+     * @return an {@code Array} object representing the SQL {@code ARRAY}
      *         value in the specified column
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
@@ -3261,14 +3261,14 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as an <code>Object</code>.
-     * This method uses the specified <code>Map</code> object for
+     * of this rowset's {@code ResultSet} object as an {@code Object}.
+     * This method uses the specified {@code Map} object for
      * custom mapping if appropriate.
      *
      * @param colName the name of the column from which to retrieve the value
-     * @param map a <code>java.util.Map</code> object that contains the mapping
+     * @param map a {@code java.util.Map} object that contains the mapping
      * from SQL type names to classes in the Java programming language
-     * @return an <code>Object</code> representing the SQL
+     * @return an {@code Object} representing the SQL
      *         value in the specified column
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
@@ -3282,10 +3282,10 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>Ref</code> object.
+     * of this rowset's {@code ResultSet} object as a {@code Ref} object.
      *
      * @param colName the column name
-     * @return a <code>Ref</code> object representing the SQL <code>REF</code> value in
+     * @return a {@code Ref} object representing the SQL {@code REF} value in
      *         the specified column
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
@@ -3297,10 +3297,10 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>Blob</code> object.
+     * of this rowset's {@code ResultSet} object as a {@code Blob} object.
      *
      * @param colName the name of the column from which to retrieve the value
-     * @return a <code>Blob</code> object representing the SQL <code>BLOB</code>
+     * @return a {@code Blob} object representing the SQL {@code BLOB}
      *         value in the specified column
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
@@ -3312,10 +3312,10 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>Clob</code> object.
+     * of this rowset's {@code ResultSet} object as a {@code Clob} object.
      *
      * @param colName the name of the column from which to retrieve the value
-     * @return a <code>Clob</code> object representing the SQL <code>CLOB</code>
+     * @return a {@code Clob} object representing the SQL {@code CLOB}
      *         value in the specified column
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
@@ -3327,10 +3327,10 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as an <code>Array</code> object.
+     * of this rowset's {@code ResultSet} object as an {@code Array} object.
      *
      * @param colName the name of the column from which to retrieve the value
-     * @return an <code>Array</code> object representing the SQL <code>ARRAY</code>
+     * @return an {@code Array} object representing the SQL {@code ARRAY}
      *         value in the specified column
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
@@ -3342,17 +3342,17 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Date</code>
+     * of this rowset's {@code ResultSet} object as a {@code java.sql.Date}
      * object. This method uses the given calendar to construct an appropriate
      * millisecond value for the date if the underlying database does not store
      * timezone information.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @param cal the <code>java.util.Calendar</code> object
+     * @param cal the {@code java.util.Calendar} object
      *        to use in constructing the date
-     * @return the column value as a <code>java.sql.Date</code> object;
-     *         if the value is SQL <code>NULL</code>,
-     *         the value returned is <code>null</code>
+     * @return the column value as a {@code java.sql.Date} object;
+     *         if the value is SQL {@code NULL},
+     *         the value returned is {@code null}
      * @throws SQLException if (1) a database access error occurs
      *            or (2) this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -3365,17 +3365,17 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Date</code>
+     * of this rowset's {@code ResultSet} object as a {@code java.sql.Date}
      * object. This method uses the given calendar to construct an appropriate
      * millisecond value for the date if the underlying database does not store
      * timezone information.
      *
      * @param columnName the SQL name of the column from which to retrieve the value
-     * @param cal the <code>java.util.Calendar</code> object
+     * @param cal the {@code java.util.Calendar} object
      *        to use in constructing the date
-     * @return the column value as a <code>java.sql.Date</code> object;
-     *         if the value is SQL <code>NULL</code>,
-     *         the value returned is <code>null</code>
+     * @return the column value as a {@code java.sql.Date} object;
+     *         if the value is SQL {@code NULL},
+     *         the value returned is {@code null}
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -3387,17 +3387,17 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Time</code>
+     * of this rowset's {@code ResultSet} object as a {@code java.sql.Time}
      * object. This method uses the given calendar to construct an appropriate
      * millisecond value for the date if the underlying database does not store
      * timezone information.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @param cal the <code>java.util.Calendar</code> object
+     * @param cal the {@code java.util.Calendar} object
      *        to use in constructing the time
-     * @return the column value as a <code>java.sql.Time</code> object;
-     *         if the value is SQL <code>NULL</code>,
-     *         the value returned is <code>null</code> in the Java programming language
+     * @return the column value as a {@code java.sql.Time} object;
+     *         if the value is SQL {@code NULL},
+     *         the value returned is {@code null} in the Java programming language
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -3410,17 +3410,17 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Time</code>
+     * of this rowset's {@code ResultSet} object as a {@code java.sql.Time}
      * object. This method uses the given calendar to construct an appropriate
      * millisecond value for the date if the underlying database does not store
      * timezone information.
      *
      * @param columnName the SQL name of the column
-     * @param cal the <code>java.util.Calendar</code> object
+     * @param cal the {@code java.util.Calendar} object
      *        to use in constructing the time
-     * @return the column value as a <code>java.sql.Time</code> object;
-     *         if the value is SQL <code>NULL</code>,
-     *         the value returned is <code>null</code> in the Java programming language
+     * @return the column value as a {@code java.sql.Time} object;
+     *         if the value is SQL {@code NULL},
+     *         the value returned is {@code null} in the Java programming language
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -3431,18 +3431,18 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a
-     * <code>java.sql.Timestamp</code> object.
+     * of this rowset's {@code ResultSet} object as a
+     * {@code java.sql.Timestamp} object.
      * This method uses the given calendar to construct an appropriate millisecond
      * value for the timestamp if the underlying database does not store
      * timezone information.
      *
      * @param columnIndex the first column is 1, the second is 2, and so on
-     * @param cal the <code>java.util.Calendar</code> object
+     * @param cal the {@code java.util.Calendar} object
      *        to use in constructing the timestamp
-     * @return the column value as a <code>java.sql.Timestamp</code> object;
-     *         if the value is SQL <code>NULL</code>,
-     *         the value returned is <code>null</code>
+     * @return the column value as a {@code java.sql.Timestamp} object;
+     *         if the value is SQL {@code NULL},
+     *         the value returned is {@code null}
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -3455,18 +3455,18 @@
 
     /**
      * Returns the value of the designated column in the current row
-     * of this rowset's <code>ResultSet</code> object as a
-     * <code>java.sql.Timestamp</code> object.
+     * of this rowset's {@code ResultSet} object as a
+     * {@code java.sql.Timestamp} object.
      * This method uses the given calendar to construct an appropriate millisecond
      * value for the timestamp if the underlying database does not store
      * timezone information.
      *
      * @param columnName the SQL name of the column
-     * @param cal the <code>java.util.Calendar</code> object
+     * @param cal the {@code java.util.Calendar} object
      *        to use in constructing the timestamp
-     * @return the column value as a <code>java.sql.Timestamp</code> object;
-     *         if the value is SQL <code>NULL</code>,
-     *         the value returned is <code>null</code>
+     * @return the column value as a {@code java.sql.Timestamp} object;
+     *         if the value is SQL {@code NULL},
+     *         the value returned is {@code null}
      * @throws SQLException if a database access error occurs
      *            or this rowset does not currently have a valid connection,
      *            prepared statement, and result set
@@ -3478,8 +3478,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>JdbcRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code JdbcRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3490,14 +3490,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param ref the new <code>Ref</code> column value
+     * @param ref the new {@code Ref} column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateRef(int columnIndex, java.sql.Ref ref)
         throws SQLException {
@@ -3507,8 +3507,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>JdbcRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code JdbcRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3519,13 +3519,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param ref the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateRef(String columnName, java.sql.Ref ref)
         throws SQLException {
@@ -3534,8 +3534,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>JdbcRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code JdbcRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3546,14 +3546,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param c the new column <code>Clob</code> value
+     * @param c the new column {@code Clob} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateClob(int columnIndex, Clob c) throws SQLException {
         checkState();
@@ -3563,8 +3563,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>JdbcRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code JdbcRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3575,13 +3575,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param c the new column <code>Clob</code> value
+     * @param c the new column {@code Clob} value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateClob(String columnName, Clob c) throws SQLException {
         updateClob(findColumn(columnName), c);
@@ -3589,8 +3589,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>JdbcRowSetImpl</code> object with the given
-     * <code>java.sql.Blob</code> value.
+     * row of this {@code JdbcRowSetImpl} object with the given
+     * {@code java.sql.Blob} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3601,14 +3601,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param b the new column <code>Blob</code> value
+     * @param b the new column {@code Blob} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBlob(int columnIndex, Blob b) throws SQLException {
         checkState();
@@ -3617,8 +3617,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>JdbcRowSetImpl</code> object with the given
-     * <code>java.sql.Blob </code> value.
+     * row of this {@code JdbcRowSetImpl} object with the given
+     * {@code java.sql.Blob } value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3629,13 +3629,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param b the new column <code>Blob</code> value
+     * @param b the new column {@code Blob} value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBlob(String columnName, Blob b) throws SQLException {
         updateBlob(findColumn(columnName), b);
@@ -3643,8 +3643,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>JdbcRowSetImpl</code> object with the given
-     * <code>java.sql.Array</code> values.
+     * row of this {@code JdbcRowSetImpl} object with the given
+     * {@code java.sql.Array} values.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3655,14 +3655,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param a the new column <code>Array</code> value
+     * @param a the new column {@code Array} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateArray(int columnIndex, Array a) throws SQLException {
         checkState();
@@ -3671,8 +3671,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>JdbcRowSetImpl</code> object with the given
-     * <code>java.sql.Array</code> value.
+     * row of this {@code JdbcRowSetImpl} object with the given
+     * {@code java.sql.Array} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3683,20 +3683,20 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param a the new column <code>Array</code> value
+     * @param a the new column {@code Array} value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateArray(String columnName, Array a) throws SQLException {
         updateArray(findColumn(columnName), a);
     }
 
     /**
-     * Provide interface coverage for getURL(int) in ResultSet->RowSet
+     * Provide interface coverage for getURL(int) in {@code ResultSet->RowSet}
      */
     public java.net.URL getURL(int columnIndex) throws SQLException {
         checkState();
@@ -3704,7 +3704,7 @@
     }
 
     /**
-     * Provide interface coverage for getURL(String) in ResultSet->RowSet
+     * Provide interface coverage for getURL(String) in {@code ResultSet->RowSet}
      */
     public java.net.URL getURL(String columnName) throws SQLException {
         return getURL(findColumn(columnName));
@@ -3712,14 +3712,14 @@
 
     /**
      * Return the RowSetWarning object for the current row of a
-     * <code>JdbcRowSetImpl</code>
+     * {@code JdbcRowSetImpl}
      */
     public RowSetWarning getRowSetWarnings() throws SQLException {
        return null;
     }
     /**
      * Unsets the designated parameter to the given int array.
-     * This was set using <code>setMatchColumn</code>
+     * This was set using {@code setMatchColumn}
      * as the column which will form the basis of the join.
      * <P>
      * The parameter value unset by this method should be same
@@ -3728,8 +3728,8 @@
      * @param columnIdxes the index into this rowset
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
-     *  parameter index is out of bounds or if the columnIdx is
-     *  not the same as set using <code>setMatchColumn(int [])</code>
+     *         parameter index is out of bounds or if the columnIdx is
+     *         not the same as set using {@code setMatchColumn(int [])}
      */
     public void unsetMatchColumn(int[] columnIdxes) throws SQLException {
 
@@ -3748,7 +3748,7 @@
 
    /**
      * Unsets the designated parameter to the given String array.
-     * This was set using <code>setMatchColumn</code>
+     * This was set using {@code setMatchColumn}
      * as the column which will form the basis of the join.
      * <P>
      * The parameter value unset by this method should be same
@@ -3757,8 +3757,8 @@
      * @param columnIdxes the index into this rowset
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
-     *  parameter index is out of bounds or if the columnName is
-     *  not the same as set using <code>setMatchColumn(String [])</code>
+     *         parameter index is out of bounds or if the columnName is
+     *         not the same as set using {@code setMatchColumn(String [])}
      */
     public void unsetMatchColumn(String[] columnIdxes) throws SQLException {
 
@@ -3774,11 +3774,11 @@
     }
 
     /**
-     * Retrieves the column name as <code>String</code> array
-     * that was set using <code>setMatchColumn(String [])</code>
+     * Retrieves the column name as {@code String} array
+     * that was set using {@code setMatchColumn(String [])}
      * for this rowset.
      *
-     * @return a <code>String</code> array object that contains the column names
+     * @return a {@code String} array object that contains the column names
      *         for the rowset which has this the match columns
      *
      * @throws SQLException if an error occurs or column name is not set
@@ -3796,10 +3796,10 @@
     }
 
     /**
-     * Retrieves the column id as <code>int</code> array that was set using
-     * <code>setMatchColumn(int [])</code> for this rowset.
-     *
-     * @return a <code>int</code> array object that contains the column ids
+     * Retrieves the column id as {@code int} array that was set using
+     * {@code setMatchColumn(int [])} for this rowset.
+     *
+     * @return a {@code int} array object that contains the column ids
      *         for the rowset which has this as the match columns.
      *
      * @throws SQLException if an error occurs or column index is not set
@@ -3829,19 +3829,19 @@
     /**
      * Sets the designated parameter to the given int array.
      * This forms the basis of the join for the
-     * <code>JoinRowSet</code> as the column which will form the basis of the
+     * {@code JoinRowSet} as the column which will form the basis of the
      * join.
      * <P>
      * The parameter value set by this method is stored internally and
      * will be supplied as the appropriate parameter in this rowset's
-     * command when the method <code>getMatchColumnIndexes</code> is called.
+     * command when the method {@code getMatchColumnIndexes} is called.
      *
      * @param columnIdxes the indexes into this rowset
      *        object's internal representation of parameter values; the
      *        first parameter is 0, the second is 1, and so on; must be
-     *        <code>0</code> or greater
+     *        {@code 0} or greater
      * @throws SQLException if an error occurs or the
-     *                         parameter index is out of bounds
+     *         parameter index is out of bounds
      */
     public void setMatchColumn(int[] columnIdxes) throws SQLException {
 
@@ -3858,17 +3858,17 @@
     /**
      * Sets the designated parameter to the given String array.
      *  This forms the basis of the join for the
-     * <code>JoinRowSet</code> as the column which will form the basis of the
+     * {@code JoinRowSet} as the column which will form the basis of the
      * join.
      * <P>
      * The parameter value set by this method is stored internally and
      * will be supplied as the appropriate parameter in this rowset's
-     * command when the method <code>getMatchColumn</code> is called.
+     * command when the method {@code getMatchColumn} is called.
      *
      * @param columnNames the name of the column into this rowset
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
-     *  parameter index is out of bounds
+     *         parameter index is out of bounds
      */
     public void setMatchColumn(String[] columnNames) throws SQLException {
 
@@ -3883,22 +3883,22 @@
     }
 
 
-        /**
-     * Sets the designated parameter to the given <code>int</code>
+    /**
+     * Sets the designated parameter to the given {@code int}
      * object.  This forms the basis of the join for the
-     * <code>JoinRowSet</code> as the column which will form the basis of the
+     * {@code JoinRowSet} as the column which will form the basis of the
      * join.
      * <P>
      * The parameter value set by this method is stored internally and
      * will be supplied as the appropriate parameter in this rowset's
-     * command when the method <code>getMatchColumn</code> is called.
+     * command when the method {@code getMatchColumn} is called.
      *
      * @param columnIdx the index into this rowset
      *        object's internal representation of parameter values; the
      *        first parameter is 0, the second is 1, and so on; must be
-     *        <code>0</code> or greater
+     *        {@code 0} or greater
      * @throws SQLException if an error occurs or the
-     *                         parameter index is out of bounds
+     *         parameter index is out of bounds
      */
     public void setMatchColumn(int columnIdx) throws SQLException {
         // validate, if col is ok to be set
@@ -3912,19 +3912,19 @@
     }
 
     /**
-     * Sets the designated parameter to the given <code>String</code>
+     * Sets the designated parameter to the given {@code String}
      * object.  This forms the basis of the join for the
-     * <code>JoinRowSet</code> as the column which will form the basis of the
+     * {@code JoinRowSet} as the column which will form the basis of the
      * join.
      * <P>
      * The parameter value set by this method is stored internally and
      * will be supplied as the appropriate parameter in this rowset's
-     * command when the method <code>getMatchColumn</code> is called.
+     * command when the method {@code getMatchColumn} is called.
      *
      * @param columnName the name of the column into this rowset
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
-     *  parameter index is out of bounds
+     *         parameter index is out of bounds
      */
     public void setMatchColumn(String columnName) throws SQLException {
         // validate, if col is ok to be set
@@ -3938,8 +3938,8 @@
     }
 
     /**
-     * Unsets the designated parameter to the given <code>int</code>
-     * object.  This was set using <code>setMatchColumn</code>
+     * Unsets the designated parameter to the given {@code int}
+     * object.  This was set using {@code setMatchColumn}
      * as the column which will form the basis of the join.
      * <P>
      * The parameter value unset by this method should be same
@@ -3948,8 +3948,8 @@
      * @param columnIdx the index into this rowset
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
-     *  parameter index is out of bounds or if the columnIdx is
-     *  not the same as set using <code>setMatchColumn(int)</code>
+     *         parameter index is out of bounds or if the columnIdx is
+     *         not the same as set using {@code setMatchColumn(int)}
      */
     public void unsetMatchColumn(int columnIdx) throws SQLException {
         // check if we are unsetting the SAME column
@@ -3964,8 +3964,8 @@
     }
 
     /**
-     * Unsets the designated parameter to the given <code>String</code>
-     * object.  This was set using <code>setMatchColumn</code>
+     * Unsets the designated parameter to the given {@code String}
+     * object.  This was set using {@code setMatchColumn}
      * as the column which will form the basis of the join.
      * <P>
      * The parameter value unset by this method should be same
@@ -3974,8 +3974,8 @@
      * @param columnName the index into this rowset
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
-     *  parameter index is out of bounds or if the columnName is
-     *  not the same as set using <code>setMatchColumn(String)</code>
+     *         parameter index is out of bounds or if the columnName is
+     *         not the same as set using {@code setMatchColumn(String)}
      *
      */
     public void unsetMatchColumn(String columnName) throws SQLException {
@@ -3992,12 +3992,12 @@
     }
 
     /**
-     * Retrieves the <code>DatabaseMetaData</code> associated with
+     * Retrieves the {@code DatabaseMetaData} associated with
      * the connection handle associated with this
-     * <code>JdbcRowSet</code> object.
-     *
-     * @return the <code>DatabaseMetadata</code> associated
-     *  with the rowset's connection.
+     * {@code JdbcRowSet} object.
+     *
+     * @return the {@code DatabaseMetadata} associated
+     *         with the rowset's connection.
      * @throws SQLException if a database access error occurs
      */
     public DatabaseMetaData getDatabaseMetaData() throws SQLException {
@@ -4006,12 +4006,12 @@
     }
 
     /**
-     * Retrieves the <code>ParameterMetaData</code> associated with
+     * Retrieves the {@code ParameterMetaData} associated with
      * the connection handle associated with this
-     * <code>JdbcRowSet</code> object.
-     *
-     * @return the <code>ParameterMetadata</code> associated
-     *  with the rowset's connection.
+     * {@code JdbcRowSet} object.
+     *
+     * @return the {@code ParameterMetadata} associated
+     *         with the rowset's connection.
      * @throws SQLException if a database access error occurs
      */
     public ParameterMetaData getParameterMetaData() throws SQLException {
@@ -4020,18 +4020,18 @@
     }
 
     /**
-     * Commits all updates in this <code>JdbcRowSet</code> object by
-     * wrapping the internal <code>Connection</code> object and calling
-     * its <code>commit</code> method.
-     * This method sets this <code>JdbcRowSet</code> object's private field
-     * <code>rs</code> to <code>null</code> after saving its value to another
-     * object, but only if the <code>ResultSet</code>
-     * constant <code>HOLD_CURSORS_OVER_COMMIT</code> has not been set.
-     * (The field <code>rs</code> is this <code>JdbcRowSet</code> object's
-     * <code>ResultSet</code> object.)
+     * Commits all updates in this {@code JdbcRowSet} object by
+     * wrapping the internal {@code Connection} object and calling
+     * its {@code commit} method.
+     * This method sets this {@code JdbcRowSet} object's private field
+     * {@code rs} to {@code null} after saving its value to another
+     * object, but only if the {@code ResultSet}
+     * constant {@code HOLD_CURSORS_OVER_COMMIT} has not been set.
+     * (The field {@code rs} is this {@code JdbcRowSet} object's
+     * {@code ResultSet} object.)
      *
      * @throws SQLException if autoCommit is set to true or if a database
-     * access error occurs
+     *         access error occurs
      */
     public void commit() throws SQLException {
       conn.commit();
@@ -4045,8 +4045,8 @@
     }
 
     /**
-     * Sets auto-commit on the internal <code>Connection</code> object with this
-     * <code>JdbcRowSet</code>
+     * Sets auto-commit on the internal {@code Connection} object with this
+     * {@code JdbcRowSet}
      *
      * @throws SQLException if a database access error occurs
      */
@@ -4074,7 +4074,7 @@
     }
 
     /**
-     * Returns the auto-commit status with this <code>JdbcRowSet</code>.
+     * Returns the auto-commit status with this {@code JdbcRowSet}.
      *
      * @return true if auto commit is true; false otherwise
      * @throws SQLException if a database access error occurs
@@ -4084,16 +4084,16 @@
     }
 
     /**
-     * Rolls back all the updates in this <code>JdbcRowSet</code> object by
-     * wrapping the internal <code>Connection</code> object and calling its
-     * <code>rollback</code> method.
-     * This method sets this <code>JdbcRowSet</code> object's private field
-     * <code>rs</code> to <code>null</code> after saving its value to another object.
-     * (The field <code>rs</code> is this <code>JdbcRowSet</code> object's
-     * internal <code>ResultSet</code> object.)
+     * Rolls back all the updates in this {@code JdbcRowSet} object by
+     * wrapping the internal {@code Connection} object and calling its
+     * {@code rollback} method.
+     * This method sets this {@code JdbcRowSet} object's private field
+     * {@code rs} to {@code null} after saving its value to another object.
+     * (The field {@code rs} is this {@code JdbcRowSet} object's
+     * internal {@code ResultSet} object.)
      *
      * @throws SQLException if autoCommit is set to true or a database
-     * access error occurs
+     *         access error occurs
      */
     public void rollback() throws SQLException {
         conn.rollback();
@@ -4106,14 +4106,14 @@
 
 
     /**
-     * Rollbacks all the updates in the <code>JdbcRowSet</code> back to the
-     * last <code>Savepoint</code> transaction marker. Wraps the internal
-     * <code>Connection</code> object and call it's rollback method
-     *
-     * @param s the <code>Savepoint</code> transaction marker to roll the
-     * transaction to.
+     * Rollbacks all the updates in the {@code JdbcRowSet} back to the
+     * last {@code Savepoint} transaction marker. Wraps the internal
+     * {@code Connection} object and call it's rollback method
+     *
+     * @param s the {@code Savepoint} transaction marker to roll the
+     *        transaction to.
      * @throws SQLException if autoCommit is set to true; or ia a database
-     * access error occurs
+     *         access error occurs
      */
     public void rollback(Savepoint s) throws SQLException {
         conn.rollback(s);
@@ -4144,10 +4144,10 @@
     //  Added as per Rave requirements
 
     /**
-     * Gets this <code>JdbcRowSet</code> object's Connection property
-     *
-     *
-     * @return the <code>Connection</code> object associated with this rowset;
+     * Gets this {@code JdbcRowSet} object's Connection property
+     *
+     *
+     * @return the {@code Connection} object associated with this rowset;
      */
 
     protected Connection getConnection() {
@@ -4158,10 +4158,10 @@
     // Added as per rave requirements
 
     /**
-     * Sets this <code>JdbcRowSet</code> object's connection property
-     * to the given <code>Connection</code> object.
-     *
-     * @param connection the <code>Connection</code> object.
+     * Sets this {@code JdbcRowSet} object's connection property
+     * to the given {@code Connection} object.
+     *
+     * @param connection the {@code Connection} object.
      */
 
     protected void setConnection(Connection connection) {
@@ -4172,10 +4172,10 @@
     // Added as per Rave requirements
 
     /**
-     * Gets this <code>JdbcRowSet</code> object's PreparedStatement property
-     *
-     *
-     * @return the <code>PreparedStatement</code> object associated with this rowset;
+     * Gets this {@code JdbcRowSet} object's PreparedStatement property
+     *
+     *
+     * @return the {@code PreparedStatement} object associated with this rowset;
      */
 
     protected PreparedStatement getPreparedStatement() {
@@ -4186,10 +4186,10 @@
     // Added as per Rave requirements
 
     /**
-     * Sets this <code>JdbcRowSet</code> object's preparedtsatement property
-     * to the given <code>PreparedStatemennt</code> object.
-     *
-     * @param preparedStatement the <code>PreparedStatement</code> object
+     * Sets this {@code JdbcRowSet} object's preparedtsatement property
+     * to the given {@code PreparedStatemennt} object.
+     *
+     * @param preparedStatement the {@code PreparedStatement} object
      *
      */
     protected void setPreparedStatement(PreparedStatement preparedStatement) {
@@ -4200,10 +4200,10 @@
     // Added as per Rave requirements
 
     /**
-     * Gets this <code>JdbcRowSet</code> object's ResultSet property
-     *
-     *
-     * @return the <code>ResultSet</code> object associated with this rowset;
+     * Gets this {@code JdbcRowSet} object's ResultSet property
+     *
+     *
+     * @return the {@code ResultSet} object associated with this rowset;
      */
 
     protected ResultSet getResultSet() throws SQLException {
@@ -4217,10 +4217,10 @@
     // Added as per Rave requirements
 
     /**
-     * Sets this <code>JdbcRowSet</code> object's resultset property
-     * to the given <code>ResultSet</code> object.
-     *
-     * @param resultSet the <code>ResultSet</code> object
+     * Sets this {@code JdbcRowSet} object's resultset property
+     * to the given {@code ResultSet} object.
+     *
+     * @param resultSet the {@code ResultSet} object
      *
      */
     protected void setResultSet(ResultSet resultSet) {
@@ -4228,25 +4228,25 @@
     }
 
     /**
-     * Sets this <code>JdbcRowSet</code> object's <code>command</code> property to
-     * the given <code>String</code> object and clears the parameters, if any,
+     * Sets this {@code JdbcRowSet} object's {@code command} property to
+     * the given {@code String} object and clears the parameters, if any,
      * that were set for the previous command. In addition,
-     * if the <code>command</code> property has previously been set to a
+     * if the {@code command} property has previously been set to a
      * non-null value and it is
-     * different from the <code>String</code> object supplied,
-     * this method sets this <code>JdbcRowSet</code> object's private fields
-     * <code>ps</code> and <code>rs</code> to <code>null</code>.
-     * (The field <code>ps</code> is its <code>PreparedStatement</code> object, and
-     * the field <code>rs</code> is its <code>ResultSet</code> object.)
+     * different from the {@code String} object supplied,
+     * this method sets this {@code JdbcRowSet} object's private fields
+     * {@code ps} and {@code rs} to {@code null}.
+     * (The field {@code ps} is its {@code PreparedStatement} object, and
+     * the field {@code rs} is its {@code ResultSet} object.)
      * <P>
-     * The <code>command</code> property may not be needed if the <code>RowSet</code>
+     * The {@code command} property may not be needed if the {@code RowSet}
      * object gets its data from a source that does not support commands,
      * such as a spreadsheet or other tabular file.
-     * Thus, this property is optional and may be <code>null</code>.
-     *
-     * @param command a <code>String</code> object containing an SQL query
-     *            that will be set as this <code>RowSet</code> object's command
-     *            property; may be <code>null</code> but may not be an empty string
+     * Thus, this property is optional and may be {@code null}.
+     *
+     * @param command a {@code String} object containing an SQL query
+     *            that will be set as this {@code RowSet} object's command
+     *            property; may be {@code null} but may not be an empty string
      * @throws SQLException if an empty string is provided as the command value
      * @see #getCommand
      */
@@ -4265,32 +4265,32 @@
     }
 
     /**
-     * Sets the <code>dataSourceName</code> property for this <code>JdbcRowSet</code>
-     * object to the given logical name and sets this <code>JdbcRowSet</code> object's
-     * Url property to <code>null</code>. In addition, if the <code>dataSourceName</code>
+     * Sets the {@code dataSourceName} property for this {@code JdbcRowSet}
+     * object to the given logical name and sets this {@code JdbcRowSet} object's
+     * Url property to {@code null}. In addition, if the {@code dataSourceName}
      * property has previously been set and is different from the one supplied,
-     * this method sets this <code>JdbcRowSet</code> object's private fields
-     * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
-     * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
-     * the field <code>rs</code> is its <code>ResultSet</code> object, and
-     * the field <code>conn</code> is its <code>Connection</code> object.)
+     * this method sets this {@code JdbcRowSet} object's private fields
+     * {@code ps}, {@code rs}, and {@code conn} to {@code null}.
+     * (The field {@code ps} is its {@code PreparedStatement} object,
+     * the field {@code rs} is its {@code ResultSet} object, and
+     * the field {@code conn} is its {@code Connection} object.)
      * <P>
      * The name supplied to this method must have been bound to a
-     * <code>DataSource</code> object in a JNDI naming service so that an
+     * {@code DataSource} object in a JNDI naming service so that an
      * application can do a lookup using that name to retrieve the
-     * <code>DataSource</code> object bound to it. The <code>DataSource</code>
+     * {@code DataSource} object bound to it. The {@code DataSource}
      * object can then be used to establish a connection to the data source it
      * represents.
      * <P>
      * Users should set either the Url property or the dataSourceName property.
      * If both properties are set, the driver will use the property set most recently.
      *
-     * @param dsName a <code>String</code> object with the name that can be supplied
+     * @param dsName a {@code String} object with the name that can be supplied
      *        to a naming service based on JNDI technology to retrieve the
-     *        <code>DataSource</code> object that can be used to get a connection;
-     *        may be <code>null</code>
+     *        {@code DataSource} object that can be used to get a connection;
+     *        may be {@code null}
      * @throws SQLException if there is a problem setting the
-     *          <code>dataSourceName</code> property
+     *          {@code dataSourceName} property
      * @see #getDataSourceName
      */
     public void setDataSourceName(String dsName) throws SQLException{
@@ -4310,42 +4310,42 @@
 
 
     /**
-     * Sets the Url property for this <code>JdbcRowSet</code> object
-     * to the given <code>String</code> object and sets the dataSource name
-     * property to <code>null</code>. In addition, if the Url property has
-     * previously been set to a non <code>null</code> value and its value
+     * Sets the Url property for this {@code JdbcRowSet} object
+     * to the given {@code String} object and sets the dataSource name
+     * property to {@code null}. In addition, if the Url property has
+     * previously been set to a non {@code null} value and its value
      * is different from the value to be set,
-     * this method sets this <code>JdbcRowSet</code> object's private fields
-     * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
-     * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
-     * the field <code>rs</code> is its <code>ResultSet</code> object, and
-     * the field <code>conn</code> is its <code>Connection</code> object.)
+     * this method sets this {@code JdbcRowSet} object's private fields
+     * {@code ps}, {@code rs}, and {@code conn} to {@code null}.
+     * (The field {@code ps} is its {@code PreparedStatement} object,
+     * the field {@code rs} is its {@code ResultSet} object, and
+     * the field {@code conn} is its {@code Connection} object.)
      * <P>
      * The Url property is a JDBC URL that is used when
      * the connection is created using a JDBC technology-enabled driver
-     * ("JDBC driver") and the <code>DriverManager</code>.
+     * ("JDBC driver") and the {@code DriverManager}.
      * The correct JDBC URL for the specific driver to be used can be found
      * in the driver documentation.  Although there are guidelines for how
      * a JDBC URL is formed,
-     * a driver vendor can specify any <code>String</code> object except
-     * one with a length of <code>0</code> (an empty string).
+     * a driver vendor can specify any {@code String} object except
+     * one with a length of {@code 0} (an empty string).
      * <P>
      * Setting the Url property is optional if connections are established using
-     * a <code>DataSource</code> object instead of the <code>DriverManager</code>.
+     * a {@code DataSource} object instead of the {@code DriverManager}.
      * The driver will use either the URL property or the
      * dataSourceName property to create a connection, whichever was
      * specified most recently. If an application uses a JDBC URL, it
      * must load a JDBC driver that accepts the JDBC URL before it uses the
-     * <code>RowSet</code> object to connect to a database.  The <code>RowSet</code>
+     * {@code RowSet} object to connect to a database.  The {@code RowSet}
      * object will use the URL internally to create a database connection in order
      * to read or write data.
      *
-     * @param url a <code>String</code> object that contains the JDBC URL
+     * @param url a {@code String} object that contains the JDBC URL
      *            that will be used to establish the connection to a database for this
-     *            <code>RowSet</code> object; may be <code>null</code> but must not
+     *            {@code RowSet} object; may be {@code null} but must not
      *            be an empty string
      * @throws SQLException if an error occurs setting the Url property or the
-     *         parameter supplied is a string with a length of <code>0</code> (an
+     *         parameter supplied is a string with a length of {@code 0} (an
      *         empty string)
      * @see #getUrl
      */
@@ -4365,24 +4365,24 @@
        }
     }
 
-     /**
-     * Sets the username property for this <code>JdbcRowSet</code> object
+    /**
+     * Sets the username property for this {@code JdbcRowSet} object
      * to the given user name. Because it
      * is not serialized, the username property is set at run time before
-     * calling the method <code>execute</code>. In addition,
-     * if the <code>username</code> property is already set with a
-     * non-null value and that value is different from the <code>String</code>
+     * calling the method {@code execute}. In addition,
+     * if the {@code username} property is already set with a
+     * non-null value and that value is different from the {@code String}
      * object to be set,
-     * this method sets this <code>JdbcRowSet</code> object's private fields
-     * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
-     * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
-     * <code>rs</code> is its <code>ResultSet</code> object, and
-     * <code>conn</code> is its <code>Connection</code> object.)
-     * Setting these fields to <code>null</code> ensures that only current
+     * this method sets this {@code JdbcRowSet} object's private fields
+     * {@code ps}, {@code rs}, and {@code conn} to {@code null}.
+     * (The field {@code ps} is its {@code PreparedStatement} object,
+     * {@code rs} is its {@code ResultSet} object, and
+     * {@code conn} is its {@code Connection} object.)
+     * Setting these fields to {@code null} ensures that only current
      * values will be used.
      *
-     * @param uname the <code>String</code> object containing the user name that
-     *     is supplied to the data source to create a connection. It may be null.
+     * @param uname the {@code String} object containing the user name that
+     *        is supplied to the data source to create a connection. It may be null.
      * @see #getUsername
      */
     public void setUsername(String uname) {
@@ -4401,23 +4401,23 @@
     }
 
      /**
-     * Sets the password property for this <code>JdbcRowSet</code> object
-     * to the given <code>String</code> object. Because it
+     * Sets the password property for this {@code JdbcRowSet} object
+     * to the given {@code String} object. Because it
      * is not serialized, the password property is set at run time before
-     * calling the method <code>execute</code>. Its default valus is
-     * <code>null</code>. In addition,
-     * if the <code>password</code> property is already set with a
+     * calling the method {@code execute}. Its default valus is
+     * {@code null}. In addition,
+     * if the {@code password} property is already set with a
      * non-null value and that value is different from the one being set,
-     * this method sets this <code>JdbcRowSet</code> object's private fields
-     * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
-     * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
-     * <code>rs</code> is its <code>ResultSet</code> object, and
-     * <code>conn</code> is its <code>Connection</code> object.)
-     * Setting these fields to <code>null</code> ensures that only current
+     * this method sets this {@code JdbcRowSet} object's private fields
+     * {@code ps}, {@code rs}, and {@code conn} to {@code null}.
+     * (The field {@code ps} is its {@code PreparedStatement} object,
+     * {@code rs} is its {@code ResultSet} object, and
+     * {@code conn} is its {@code Connection} object.)
+     * Setting these fields to {@code null} ensures that only current
      * values will be used.
      *
-     * @param password the <code>String</code> object that represents the password
-     *     that must be supplied to the database to create a connection
+     * @param password the {@code String} object that represents the password
+     *        that must be supplied to the database to create a connection
      */
     public void setPassword(String password) {
 
@@ -4435,18 +4435,18 @@
     }
 
     /**
-     * Sets the type for this <code>RowSet</code> object to the specified type.
-     * The default type is <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>.
+     * Sets the type for this {@code RowSet} object to the specified type.
+     * The default type is {@code ResultSet.TYPE_SCROLL_INSENSITIVE}.
      *
      * @param type one of the following constants:
-     *             <code>ResultSet.TYPE_FORWARD_ONLY</code>,
-     *             <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>, or
-     *             <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
+     *             {@code ResultSet.TYPE_FORWARD_ONLY},
+     *             {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or
+     *             {@code ResultSet.TYPE_SCROLL_SENSITIVE}
      * @throws SQLException if the parameter supplied is not one of the
      *         following constants:
-     *          <code>ResultSet.TYPE_FORWARD_ONLY</code> or
-     *          <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>
-     *          <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
+     *          {@code ResultSet.TYPE_FORWARD_ONLY} or
+     *          {@code ResultSet.TYPE_SCROLL_INSENSITIVE}
+     *          {@code ResultSet.TYPE_SCROLL_SENSITIVE}
      * @see #getConcurrency
      * @see #getType
      */
@@ -4468,18 +4468,18 @@
     }
 
     /**
-     * Sets the concurrency for this <code>RowSet</code> object to
-     * the specified concurrency. The default concurrency for any <code>RowSet</code>
-     * object (connected or disconnected) is <code>ResultSet.CONCUR_UPDATABLE</code>,
+     * Sets the concurrency for this {@code RowSet} object to
+     * the specified concurrency. The default concurrency for any {@code RowSet}
+     * object (connected or disconnected) is {@code ResultSet.CONCUR_UPDATABLE},
      * but this method may be called at any time to change the concurrency.
      *
      * @param concur one of the following constants:
-     *                    <code>ResultSet.CONCUR_READ_ONLY</code> or
-     *                    <code>ResultSet.CONCUR_UPDATABLE</code>
+     *                    {@code ResultSet.CONCUR_READ_ONLY} or
+     *                    {@code ResultSet.CONCUR_UPDATABLE}
      * @throws SQLException if the parameter supplied is not one of the
      *         following constants:
-     *          <code>ResultSet.CONCUR_UPDATABLE</code> or
-     *          <code>ResultSet.CONCUR_READ_ONLY</code>
+     *          {@code ResultSet.CONCUR_UPDATABLE} or
+     *          {@code ResultSet.CONCUR_READ_ONLY}
      * @see #getConcurrency
      * @see #isReadOnly
      */
@@ -4500,8 +4500,8 @@
     }
 
     /**
-     * Retrieves the value of the designated <code>SQL XML</code> parameter as a
-     * <code>SQLXML</code> object in the Java programming language.
+     * Retrieves the value of the designated {@code SQL XML} parameter as a
+     * {@code SQLXML} object in the Java programming language.
      * @param columnIndex the first column is 1, the second is 2, ...
      * @return a SQLXML object that maps an SQL XML value
      * @throws SQLException if a database access error occurs
@@ -4512,8 +4512,8 @@
     }
 
     /**
-     * Retrieves the value of the designated <code>SQL XML</code> parameter as a
-     * <code>SQLXML</code> object in the Java programming language.
+     * Retrieves the value of the designated {@code SQL XML} parameter as a
+     * {@code SQLXML} object in the Java programming language.
      * @param colName the name of the column from which to retrieve the value
      * @return a SQLXML object that maps an SQL XML value
      * @throws SQLException if a database access error occurs
@@ -4524,12 +4524,12 @@
 
     /**
      * Retrieves the value of the designated column in the current row of this
-     * <code>ResultSet</code> object as a java.sql.RowId object in the Java
+     * {@code ResultSet} object as a java.sql.RowId object in the Java
      * programming language.
      *
      * @param columnIndex the first column is 1, the second 2, ...
-     * @return the column value if the value is a SQL <code>NULL</code> the
-     *     value returned is <code>null</code>
+     * @return the column value if the value is a SQL {@code NULL} the
+     *     value returned is {@code null}
      * @throws SQLException if a database access error occurs
      * @since 1.6
      */
@@ -4539,12 +4539,12 @@
 
     /**
      * Retrieves the value of the designated column in the current row of this
-     * <code>ResultSet</code> object as a java.sql.RowId object in the Java
+     * {@code ResultSet} object as a java.sql.RowId object in the Java
      * programming language.
      *
      * @param columnName the name of the column
-     * @return the column value if the value is a SQL <code>NULL</code> the
-     *     value returned is <code>null</code>
+     * @return the column value if the value is a SQL {@code NULL} the
+     *     value returned is {@code null}
      * @throws SQLException if a database access error occurs
      * @since 1.6
      */
@@ -4553,10 +4553,10 @@
     }
 
     /**
-     * Updates the designated column with a <code>RowId</code> value. The updater
+     * Updates the designated column with a {@code RowId} value. The updater
      * methods are used to update column values in the current row or the insert
      * row. The updater methods do not update the underlying database; instead
-     * the <code>updateRow<code> or <code>insertRow</code> methods are called
+     * the {@code updateRow} or {@code insertRow} methods are called
      * to update the database.
      *
      * @param columnIndex the first column is 1, the second 2, ...
@@ -4569,10 +4569,10 @@
     }
 
     /**
-     * Updates the designated column with a <code>RowId</code> value. The updater
+     * Updates the designated column with a {@code RowId} value. The updater
      * methods are used to update column values in the current row or the insert
      * row. The updater methods do not update the underlying database; instead
-     * the <code>updateRow<code> or <code>insertRow</code> methods are called
+     * the {@code updateRow} or {@code insertRow} methods are called
      * to update the database.
      *
      * @param columnName the name of the column
@@ -4631,8 +4631,8 @@
 
 
     /*o
-     * This method is used for updating SQL <code>NCLOB</code>  type that maps
-     * to <code>java.sql.Types.NCLOB</code>
+     * This method is used for updating SQL {@code NCLOB}  type that maps
+     * to {@code java.sql.Types.NCLOB}
      * @param columnIndex the first column is 1, the second 2, ...
      * @param nClob the value for the column to be updated
      * @throws SQLException if a database access error occurs
@@ -4643,8 +4643,8 @@
     }
 
     /**
-     * This method is used for updating SQL <code>NCLOB</code>  type that maps
-     * to <code>java.sql.Types.NCLOB</code>
+     * This method is used for updating SQL {@code NCLOB}  type that maps
+     * to {@code java.sql.Types.NCLOB}
      * @param columnName name of the column
      * @param nClob the value for the column to be updated
      * @throws SQLException if a database access error occurs
@@ -4656,12 +4656,12 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>ResultSet</code> object as a <code>NClob</code> object
+     * of this {@code ResultSet} object as a {@code NClob} object
      * in the Java programming language.
      *
      * @param i the first column is 1, the second is 2, ...
-     * @return a <code>NClob</code> object representing the SQL
-     *         <code>NCLOB</code> value in the specified column
+     * @return a {@code NClob} object representing the SQL
+     *         {@code NCLOB} value in the specified column
      * @exception SQLException if a database access error occurs
      * @since 1.6
      */
@@ -4672,11 +4672,11 @@
 
   /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>ResultSet</code> object as a <code>NClob</code> object
+     * of this {@code ResultSet} object as a {@code NClob} object
      * in the Java programming language.
      *
      * @param colName the name of the column from which to retrieve the value
-     * @return a <code>NClob</code> object representing the SQL <code>NCLOB</code>
+     * @return a {@code NClob} object representing the SQL {@code NCLOB}
      * value in the specified column
      * @exception SQLException if a database access error occurs
      * @since 1.6
@@ -4694,10 +4694,10 @@
     }
 
     /**
-      * Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver converts this to an
-      * SQL <code>XML</code> value when it sends it to the database.
+      * Sets the designated parameter to the given {@code java.sql.SQLXML} object. The driver converts this to an
+      * SQL {@code XML} value when it sends it to the database.
       * @param parameterIndex index of the first parameter is 1, the second is 2, ...
-      * @param xmlObject a <code>SQLXML</code> object that maps an SQL <code>XML</code> value
+      * @param xmlObject a {@code SQLXML} object that maps an SQL {@code XML} value
       * @throws SQLException if a database access error occurs
       * @since 1.6
       */
@@ -4706,10 +4706,10 @@
      }
 
     /**
-     * Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver converts this to an
-     * <code>SQL XML</code> value when it sends it to the database.
+     * Sets the designated parameter to the given {@code java.sql.SQLXML} object. The driver converts this to an
+     * {@code SQL XML} value when it sends it to the database.
      * @param parameterName the name of the parameter
-     * @param xmlObject a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
+     * @param xmlObject a {@code SQLXML} object that maps an {@code SQL XML} value
      * @throws SQLException if a database access error occurs
      * @since 1.6
      */
@@ -4718,8 +4718,8 @@
      }
 
     /**
-     * Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
-     * driver converts this to a SQL <code>ROWID</code> value when it sends it
+     * Sets the designated parameter to the given {@code java.sql.RowId} object. The
+     * driver converts this to a SQL {@code ROWID} value when it sends it
      * to the database
      *
      * @param parameterIndex the first parameter is 1, the second is 2, ...
@@ -4732,9 +4732,9 @@
          throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
      }
 
-    /**
-    * Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
-    * driver converts this to a SQL <code>ROWID</code> when it sends it to the
+   /**
+    * Sets the designated parameter to the given {@code java.sql.RowId} object. The
+    * driver converts this to a SQL {@code ROWID} when it sends it to the
     * database.
     *
     * @param parameterName the name of the parameter
@@ -4748,18 +4748,18 @@
 
 
    /**
-     * Sets the designated parameter to the given <code>String</code> object.
-     * The driver converts this to a SQL <code>NCHAR</code> or
-     * <code>NVARCHAR</code> or <code>LONGNVARCHAR</code> value
+     * Sets the designated parameter to the given {@code String} object.
+     * The driver converts this to a SQL {@code NCHAR} or
+     * {@code NVARCHAR} or {@code LONGNVARCHAR} value
      * (depending on the argument's
-     * size relative to the driver's limits on <code>NVARCHAR</code> values)
+     * size relative to the driver's limits on {@code NVARCHAR} values)
      * when it sends it to the database.
      *
      * @param parameterIndex of the first parameter is 1, the second is 2, ...
      * @param value the parameter value
      * @throws SQLException if the driver does not support national
      *         character sets;  if the driver can detect that a data conversion
-     *  error could occur ; or if a database access error occurs
+     *         error could occur ; or if a database access error occurs
      * @since 1.6
      */
      public void setNString(int parameterIndex, String value) throws SQLException {
@@ -4768,9 +4768,9 @@
 
 
    /**
-    * Sets the designated parameter in this <code>RowSet</code> object's command
-    * to a <code>Reader</code> object. The
-    * <code>Reader</code> reads the data till end-of-file is reached. The
+    * Sets the designated parameter in this {@code RowSet} object's command
+    * to a {@code Reader} object. The
+    * {@code Reader} reads the data till end-of-file is reached. The
     * driver does the necessary conversion from Java character format to
     * the national character set in the database.
 
@@ -4779,14 +4779,14 @@
     * standard interface.
     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
     * it might be more efficient to use a version of
-    * <code>setNCharacterStream</code> which takes a length parameter.
+    * {@code setNCharacterStream} which takes a length parameter.
     *
     * @param parameterIndex of the first parameter is 1, the second is 2, ...
     * @param value the parameter value
     * @throws SQLException if the driver does not support national
     *         character sets;  if the driver can detect that a data conversion
-    *  error could occur ; if a database access error occurs; or
-    * this method is called on a closed <code>PreparedStatement</code>
+    *         error could occur ; if a database access error occurs; or
+    *         this method is called on a closed {@code PreparedStatement}
     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
     * @since 1.6
     */
@@ -4795,14 +4795,14 @@
     }
 
   /**
-    * Sets the designated parameter to a <code>java.sql.NClob</code> object. The object
-    * implements the <code>java.sql.NClob</code> interface. This <code>NClob</code>
-    * object maps to a SQL <code>NCLOB</code>.
+    * Sets the designated parameter to a {@code java.sql.NClob} object. The object
+    * implements the {@code java.sql.NClob} interface. This {@code NClob}
+    * object maps to a SQL {@code NCLOB}.
     * @param parameterName the name of the column to be set
     * @param value the parameter value
     * @throws SQLException if the driver does not support national
     *         character sets;  if the driver can detect that a data conversion
-    *  error could occur; or if a database access error occurs
+    *         error could occur; or if a database access error occurs
     * @since 1.6
     */
     public void setNClob(String parameterName, NClob value) throws SQLException {
@@ -4810,17 +4810,17 @@
      }
 
 
-  /**
+    /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>ResultSet</code> object as a
-     * <code>java.io.Reader</code> object.
+     * of this {@code ResultSet} object as a
+     * {@code java.io.Reader} object.
      * It is intended for use when
-     * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
-     * and <code>LONGNVARCHAR</code> columns.
-     *
-     * @return a <code>java.io.Reader</code> object that contains the column
-     * value; if the value is SQL <code>NULL</code>, the value returned is
-     * <code>null</code> in the Java programming language.
+     * accessing  {@code NCHAR},{@code NVARCHAR}
+     * and {@code LONGNVARCHAR} columns.
+     *
+     * @return a {@code java.io.Reader} object that contains the column
+     * value; if the value is SQL {@code NULL}, the value returned is
+     * {@code null} in the Java programming language.
      * @param columnIndex the first column is 1, the second is 2, ...
      * @exception SQLException if a database access error occurs
      * @since 1.6
@@ -4832,16 +4832,16 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>ResultSet</code> object as a
-     * <code>java.io.Reader</code> object.
+     * of this {@code ResultSet} object as a
+     * {@code java.io.Reader} object.
      * It is intended for use when
-     * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
-     * and <code>LONGNVARCHAR</code> columns.
+     * accessing  {@code NCHAR},{@code NVARCHAR}
+     * and {@code LONGNVARCHAR} columns.
      *
      * @param columnName the name of the column
-     * @return a <code>java.io.Reader</code> object that contains the column
-     * value; if the value is SQL <code>NULL</code>, the value returned is
-     * <code>null</code> in the Java programming language
+     * @return a {@code java.io.Reader} object that contains the column
+     * value; if the value is SQL {@code NULL}, the value returned is
+     * {@code null} in the Java programming language
      * @exception SQLException if a database access error occurs
      * @since 1.6
      */
@@ -4850,11 +4850,11 @@
      }
 
     /**
-     * Updates the designated column with a <code>java.sql.SQLXML</code> value.
+     * Updates the designated column with a {@code java.sql.SQLXML} value.
      * The updater
      * methods are used to update column values in the current row or the insert
      * row. The updater methods do not update the underlying database; instead
-     * the <code>updateRow</code> or <code>insertRow</code> methods are called
+     * the {@code updateRow} or {@code insertRow} methods are called
      * to update the database.
      * @param columnIndex the first column is 1, the second 2, ...
      * @param xmlObject the value for the column to be updated
@@ -4866,11 +4866,11 @@
     }
 
     /**
-     * Updates the designated column with a <code>java.sql.SQLXML</code> value.
+     * Updates the designated column with a {@code java.sql.SQLXML} value.
      * The updater
      * methods are used to update column values in the current row or the insert
      * row. The updater methods do not update the underlying database; instead
-     * the <code>updateRow</code> or <code>insertRow</code> methods are called
+     * the {@code updateRow} or {@code insertRow} methods are called
      * to update the database.
      *
      * @param columnName the name of the column
@@ -4884,15 +4884,15 @@
 
      /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>ResultSet</code> object as
-     * a <code>String</code> in the Java programming language.
+     * of this {@code ResultSet} object as
+     * a {@code String} in the Java programming language.
      * It is intended for use when
-     * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
-     * and <code>LONGNVARCHAR</code> columns.
+     * accessing  {@code NCHAR},{@code NVARCHAR}
+     * and {@code LONGNVARCHAR} columns.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     * value returned is {@code null}
      * @exception SQLException if a database access error occurs
      * @since 1.6
      */
@@ -4902,15 +4902,15 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>ResultSet</code> object as
-     * a <code>String</code> in the Java programming language.
+     * of this {@code ResultSet} object as
+     * a {@code String} in the Java programming language.
      * It is intended for use when
-     * accessing  <code>NCHAR</code>,<code>NVARCHAR</code>
-     * and <code>LONGNVARCHAR</code> columns.
+     * accessing  {@code NCHAR},{@code NVARCHAR}
+     * and {@code LONGNVARCHAR} columns.
      *
      * @param columnName the SQL name of the column
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     * value returned is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     * value returned is {@code null}
      * @exception SQLException if a database access error occurs
      * @since 1.6
      */
@@ -4927,9 +4927,9 @@
        * the insert row. The updater methods do not update the underlying database;
        * instead the updateRow or insertRow methods are called to update the database.
        *
-       * @param columnIndex - the first column is 1, the second is 2, ...
-       * @param x - the new column value
-       * @param length - the length of the stream
+       * @param columnIndex the first column is 1, the second is 2, ...
+       * @param x the new column value
+       * @param length the length of the stream
        * @exception SQLException if a database access error occurs
        * @since 1.6
        */
@@ -4949,9 +4949,9 @@
        * the insert row. The updater methods do not update the underlying database;
        * instead the updateRow or insertRow methods are called to update the database.
        *
-       * @param columnName - name of the Column
-       * @param x - the new column value
-       * @param length - the length of the stream
+       * @param columnName name of the Column
+       * @param x the new column value
+       * @param length the length of the stream
        * @exception SQLException if a database access error occurs
        * @since 1.6
        */
@@ -4963,26 +4963,27 @@
        }
 
     /**
-     * Updates the designated column with a character stream value.   The
+     * Updates the designated column with a character stream value. The
      * driver does the necessary conversion from Java character format to
      * the national character set in the database.
      * It is intended for use when
-     * updating  <code>NCHAR</code>,<code>NVARCHAR</code>
-     * and <code>LONGNVARCHAR</code> columns.
+     * updating  {@code NCHAR},{@code NVARCHAR}
+     * and {@code LONGNVARCHAR} columns.
      *
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateNCharacterStream</code> which takes a length parameter.
+     * {@code updateNCharacterStream} which takes a length parameter.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param x the new column value
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
+     * the result set concurrency is {@code CONCUR_READ_ONLY} or this
+     * method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
      * this method
      * @since 1.6
@@ -4997,26 +4998,27 @@
      * driver does the necessary conversion from Java character format to
      * the national character set in the database.
      * It is intended for use when
-     * updating  <code>NCHAR</code>,<code>NVARCHAR</code>
-     * and <code>LONGNVARCHAR</code> columns.
+     * updating  {@code NCHAR},{@code NVARCHAR}
+     * and {@code LONGNVARCHAR} columns.
      *
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateNCharacterStream</code> which takes a length parameter.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
-bel is the name of the column
-     * @param reader the <code>java.io.Reader</code> object containing
+     * {@code updateNCharacterStream} which takes a length parameter.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then the label is the name of the column
+     * @param reader the {@code java.io.Reader} object containing
      *        the new column value
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
-      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *        the result set concurrency is {@code CONCUR_READ_ONLY} or
+     *        this method is called on a closed result set
+     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+     *        this method
      * @since 1.6
      */
     public void updateNCharacterStream(String columnLabel,
@@ -5027,9 +5029,9 @@
     /**
      * Updates the designated column using the given input stream, which
      * will have the specified number of bytes.
-     * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+     * When a very large ASCII value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.InputStream</code>. Data will be read from the stream
+     * {@code java.io.InputStream}. Data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from ASCII to the database char format.
      *
@@ -5039,16 +5041,16 @@
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param inputStream An object that contains the data to set the parameter
-     * value to.
+     *        value to.
      * @param length the number of bytes in the parameter data.
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
      * this method
      * @since 1.6
@@ -5060,9 +5062,9 @@
     /**
      * Updates the designated column using the given input stream, which
      * will have the specified number of bytes.
-     * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+     * When a very large ASCII value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.InputStream</code>. Data will be read from the stream
+     * {@code java.io.InputStream}. Data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from ASCII to the database char format.
      *
@@ -5072,18 +5074,20 @@
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified,
+     *        then the label is the name of the column.
      * @param inputStream An object that contains the data to set the parameter
-     * value to.
+     *        value to.
      * @param length the number of bytes in the parameter data.
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException {
@@ -5092,9 +5096,9 @@
 
     /**
      * Updates the designated column using the given input stream.
-     * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+     * When a very large ASCII value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.InputStream</code>. Data will be read from the stream
+     * {@code java.io.InputStream}. Data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from ASCII to the database char format.
      *
@@ -5102,23 +5106,23 @@
      * Java stream object or your own subclass that implements the
      * standard interface.
      *
-     *  <P><B>Note:</B> Consult your JDBC driver documentation to determine if
+     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateBlob</code> which takes a length parameter.
+     * {@code updateBlob} which takes a length parameter.
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param inputStream An object that contains the data to set the parameter
-     * value to.
+     *        value to.
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException {
@@ -5127,9 +5131,9 @@
 
     /**
      * Updates the designated column using the given input stream.
-     * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+     * When a very large ASCII value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.InputStream</code>. Data will be read from the stream
+     * {@code java.io.InputStream}. Data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from ASCII to the database char format.
      *
@@ -5138,22 +5142,23 @@
      * standard interface.
      *   <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateBlob</code> which takes a length parameter.
+     * {@code updateBlob} which takes a length parameter.
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
-bel is the name of the column
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then the label
+     *        is the name of the column
      * @param inputStream An object that contains the data to set the parameter
-     * value to.
+     *        value to.
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *        the result set concurrency is {@code CONCUR_READ_ONLY}
+     *        or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *        this method
      * @since 1.6
      */
     public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException {
@@ -5161,11 +5166,11 @@
     }
 
     /**
-     * Updates the designated column using the given <code>Reader</code>
+     * Updates the designated column using the given {@code Reader}
      * object, which is the given number of characters long.
-     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * When a very large UNICODE value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.Reader</code> object. The data will be read from the stream
+     * {@code java.io.Reader} object. The data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from UNICODE to the database char format.
      *
@@ -5175,17 +5180,17 @@
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param reader An object that contains the data to set the parameter value to.
      * @param length the number of characters in the parameter data.
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateClob(int columnIndex,  Reader reader, long length) throws SQLException {
@@ -5193,11 +5198,11 @@
     }
 
     /**
-     * Updates the designated column using the given <code>Reader</code>
+     * Updates the designated column using the given {@code Reader}
      * object, which is the given number of characters long.
-     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * When a very large UNICODE value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.Reader</code> object. The data will be read from the stream
+     * {@code java.io.Reader} object. The data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from UNICODE to the database char format.
      *
@@ -5207,17 +5212,18 @@
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then the label is the name of the column
      * @param reader An object that contains the data to set the parameter value to.
      * @param length the number of characters in the parameter data.
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateClob(String columnLabel,  Reader reader, long length) throws SQLException {
@@ -5225,33 +5231,33 @@
     }
 
     /**
-     * Updates the designated column using the given <code>Reader</code>
+     * Updates the designated column using the given {@code Reader}
      * object.
-     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * When a very large UNICODE value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.Reader</code> object. The data will be read from the stream
+     * {@code java.io.Reader} object. The data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from UNICODE to the database char format.
      *
      * <P><B>Note:</B> This stream object can either be a standard
      * Java stream object or your own subclass that implements the
      * standard interface.
-     *   <P><B>Note:</B> Consult your JDBC driver documentation to determine if
+     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateClob</code> which takes a length parameter.
+     * {@code updateClob} which takes a length parameter.
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param reader An object that contains the data to set the parameter value to.
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateClob(int columnIndex,  Reader reader) throws SQLException {
@@ -5259,34 +5265,35 @@
     }
 
     /**
-     * Updates the designated column using the given <code>Reader</code>
+     * Updates the designated column using the given {@code Reader}
      * object.
-     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * When a very large UNICODE value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.Reader</code> object. The data will be read from the stream
+     * {@code java.io.Reader} object. The data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from UNICODE to the database char format.
      *
      * <P><B>Note:</B> This stream object can either be a standard
      * Java stream object or your own subclass that implements the
      * standard interface.
-     *  <P><B>Note:</B> Consult your JDBC driver documentation to determine if
+     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateClob</code> which takes a length parameter.
+     * {@code updateClob} which takes a length parameter.
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
-bel is the name of the column
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then the label
+     *        is the name of the column
      * @param reader An object that contains the data to set the parameter value to.
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateClob(String columnLabel,  Reader reader) throws SQLException {
@@ -5294,11 +5301,11 @@
     }
 
    /**
-     * Updates the designated column using the given <code>Reader</code>
+     * Updates the designated column using the given {@code Reader}
      * object, which is the given number of characters long.
-     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * When a very large UNICODE value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.Reader</code> object. The data will be read from the stream
+     * {@code java.io.Reader} object. The data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from UNICODE to the database char format.
      *
@@ -5308,19 +5315,19 @@
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second 2, ...
      * @param reader An object that contains the data to set the parameter value to.
      * @param length the number of characters in the parameter data.
      * @throws SQLException if the driver does not support national
      *         character sets;  if the driver can detect that a data conversion
-     *  error could occur; this method is called on a closed result set,
-     * if a database access error occurs or
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     *         error could occur; this method is called on a closed result set,
+     *         if a database access error occurs or
+     *         the result set concurrency is {@code CONCUR_READ_ONLY}
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateNClob(int columnIndex,  Reader reader, long length) throws SQLException {
@@ -5328,11 +5335,11 @@
     }
 
     /**
-     * Updates the designated column using the given <code>Reader</code>
+     * Updates the designated column using the given {@code Reader}
      * object, which is the given number of characters long.
-     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * When a very large UNICODE value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.Reader</code> object. The data will be read from the stream
+     * {@code java.io.Reader} object. The data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from UNICODE to the database char format.
      *
@@ -5342,19 +5349,20 @@
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then the label is the name of the column
      * @param reader An object that contains the data to set the parameter value to.
      * @param length the number of characters in the parameter data.
      * @throws SQLException if the driver does not support national
      *         character sets;  if the driver can detect that a data conversion
-     *  error could occur; this method is called on a closed result set;
-     *  if a database access error occurs or
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     *         error could occur; this method is called on a closed result set;
+     *         if a database access error occurs or
+     *         the result set concurrency is {@code CONCUR_READ_ONLY}
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateNClob(String columnLabel,  Reader reader, long length) throws SQLException {
@@ -5362,11 +5370,11 @@
     }
 
     /**
-     * Updates the designated column using the given <code>Reader</code>
+     * Updates the designated column using the given {@code Reader}
      * object.
-     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * When a very large UNICODE value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.Reader</code> object. The data will be read from the stream
+     * {@code java.io.Reader} object. The data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from UNICODE to the database char format.
      *
@@ -5375,22 +5383,22 @@
      * standard interface.
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateNClob</code> which takes a length parameter.
+     * {@code updateNClob} which takes a length parameter.
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second 2, ...
      * @param reader An object that contains the data to set the parameter value to.
      * @throws SQLException if the driver does not support national
      *         character sets;  if the driver can detect that a data conversion
-     *  error could occur; this method is called on a closed result set,
-     * if a database access error occurs or
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     *         error could occur; this method is called on a closed result set,
+     *         if a database access error occurs or
+     *         the result set concurrency is {@code CONCUR_READ_ONLY}
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateNClob(int columnIndex,  Reader reader) throws SQLException {
@@ -5398,11 +5406,11 @@
     }
 
     /**
-     * Updates the designated column using the given <code>Reader</code>
+     * Updates the designated column using the given {@code Reader}
      * object.
-     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * When a very large UNICODE value is input to a {@code LONGVARCHAR}
      * parameter, it may be more practical to send it via a
-     * <code>java.io.Reader</code> object. The data will be read from the stream
+     * {@code java.io.Reader} object. The data will be read from the stream
      * as needed until end-of-file is reached.  The JDBC driver will
      * do any necessary conversion from UNICODE to the database char format.
      *
@@ -5411,23 +5419,24 @@
      * standard interface.
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateNClob</code> which takes a length parameter.
+     * {@code updateNClob} which takes a length parameter.
      * <p>
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
-bel is the name of the column
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then
+     *        the label is the name of the column
      * @param reader An object that contains the data to set the parameter value to.
      * @throws SQLException if the driver does not support national
      *         character sets;  if the driver can detect that a data conversion
-     *  error could occur; this method is called on a closed result set;
-     *  if a database access error occurs or
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     *         error could occur; this method is called on a closed result set;
+     *         if a database access error occurs or
+     *         the result set concurrency is {@code CONCUR_READ_ONLY}
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *         this method
      * @since 1.6
      */
     public void updateNClob(String columnLabel,  Reader reader) throws SQLException {
@@ -5435,22 +5444,22 @@
     }
 
 
-        /**
+    /**
      * Updates the designated column with an ascii stream value, which will have
      * the specified number of bytes.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param x the new column value
      * @param length the length of the stream
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateAsciiStream(int columnIndex,
@@ -5464,17 +5473,17 @@
      * the specified number of bytes.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param x the new column value
      * @param length the length of the stream
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateBinaryStream(int columnIndex,
@@ -5488,17 +5497,17 @@
      * the specified number of bytes.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param x the new column value
      * @param length the length of the stream
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateCharacterStream(int columnIndex,
@@ -5512,17 +5521,19 @@
      * the specified number of bytes..
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then
+     *        the label is the name of the column
      * @param x the new column value
      * @param length the length of the stream
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateAsciiStream(String columnLabel,
@@ -5535,20 +5546,20 @@
      * Updates the designated column with an ascii stream value.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateAsciiStream</code> which takes a length parameter.
+     * {@code updateAsciiStream} which takes a length parameter.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param x the new column value
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateAsciiStream(int columnIndex,
@@ -5560,21 +5571,22 @@
      * Updates the designated column with an ascii stream value.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateAsciiStream</code> which takes a length parameter.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
-bel is the name of the column
+     * {@code updateAsciiStream} which takes a length parameter.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then the label
+     *        is the name of the column
      * @param x the new column value
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateAsciiStream(String columnLabel,
@@ -5588,15 +5600,17 @@
      * the specified number of bytes.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then
+     *        the label is the name of the column
      * @param x the new column value
      * @param length the length of the stream
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
      * this method
      * @since 1.6
@@ -5611,18 +5625,18 @@
      * Updates the designated column with a binary stream value.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateBinaryStream</code> which takes a length parameter.
+     * {@code updateBinaryStream} which takes a length parameter.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param x the new column value
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
      * this method
      * @since 1.6
@@ -5637,19 +5651,20 @@
      * Updates the designated column with a binary stream value.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateBinaryStream</code> which takes a length parameter.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
-bel is the name of the column
+     * {@code updateBinaryStream} which takes a length parameter.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then
+     *        the label is the name of the column
      * @param x the new column value
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
      * this method
      * @since 1.6
@@ -5665,18 +5680,20 @@
      * the specified number of bytes.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the label is the name of the column
-     * @param reader the <code>java.io.Reader</code> object containing
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then
+     *        the label is the name of the column
+     * @param reader the {@code java.io.Reader} object containing
      *        the new column value
      * @param length the length of the stream
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateCharacterStream(String columnLabel,
@@ -5689,20 +5706,20 @@
      * Updates the designated column with a character stream value.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateCharacterStream</code> which takes a length parameter.
+     * {@code updateCharacterStream} which takes a length parameter.
      *
      * @param columnIndex the first column is 1, the second is 2, ...
      * @param x the new column value
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateCharacterStream(int columnIndex,
@@ -5714,22 +5731,23 @@
      * Updates the designated column with a character stream value.
      * The updater methods are used to update column values in the
      * current row or the insert row.  The updater methods do not
-     * update the underlying database; instead the <code>updateRow</code> or
-     * <code>insertRow</code> methods are called to update the database.
+     * update the underlying database; instead the {@code updateRow} or
+     * {@code insertRow} methods are called to update the database.
      *
      * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
      * it might be more efficient to use a version of
-     * <code>updateCharacterStream</code> which takes a length parameter.
-     *
-     * @param columnLabel the label for the column specified with the SQL AS clause.  If the SQL AS clause was not specified, then the la
-bel is the name of the column
-     * @param reader the <code>java.io.Reader</code> object containing
+     * {@code updateCharacterStream} which takes a length parameter.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS clause.
+     *        If the SQL AS clause was not specified, then the label
+     *        is the name of the column
+     * @param reader the {@code java.io.Reader} object containing
      *        the new column value
      * @exception SQLException if a database access error occurs,
-     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
-     * or this method is called on a closed result set
+     *            the result set concurrency is {@code CONCUR_READ_ONLY}
+     *            or this method is called on a closed result set
      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-     * this method
+     *            this method
      * @since 1.6
      */
     public void updateCharacterStream(String columnLabel,
@@ -5738,97 +5756,98 @@
     }
 
 
-     /**
-  * Sets the designated parameter to the given <code>java.net.URL</code> value.
-  * The driver converts this to an SQL <code>DATALINK</code> value
-  * when it sends it to the database.
-  *
-  * @param parameterIndex the first parameter is 1, the second is 2, ...
-  * @param x the <code>java.net.URL</code> object to be set
-  * @exception SQLException if a database access error occurs or
-  * this method is called on a closed <code>PreparedStatement</code>
-  * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
-  * @since 1.4
-  */
+  /**
+   * Sets the designated parameter to the given {@code java.net.URL} value.
+   * The driver converts this to an SQL {@code DATALINK} value
+   * when it sends it to the database.
+   *
+   * @param parameterIndex the first parameter is 1, the second is 2, ...
+   * @param x the {@code java.net.URL} object to be set
+   * @exception SQLException if a database access error occurs or
+   *            this method is called on a closed {@code PreparedStatement}
+   * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
+   * @since 1.4
+   */
   public void setURL(int parameterIndex, java.net.URL x) throws SQLException{
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
 
-   /**
-  * Sets the designated parameter to a <code>Reader</code> object.
-  * This method differs from the <code>setCharacterStream (int, Reader)</code> method
-  * because it informs the driver that the parameter value should be sent to
-  * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
-  * driver may have to do extra work to determine whether the parameter
-  * data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
-  * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
-  * it might be more efficient to use a version of
-  * <code>setNClob</code> which takes a length parameter.
-  *
-  * @param parameterIndex index of the first parameter is 1, the second is 2, ...
-  * @param reader An object that contains the data to set the parameter value to.
-  * @throws SQLException if parameterIndex does not correspond to a parameter
-  * marker in the SQL statement;
-  * if the driver does not support national character sets;
-  * if the driver can detect that a data conversion
-  *  error could occur;  if a database access error occurs or
-  * this method is called on a closed <code>PreparedStatement</code>
-  * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
-  *
-  * @since 1.6
-  */
+  /**
+   * Sets the designated parameter to a {@code Reader} object.
+   * This method differs from the {@code setCharacterStream (int, Reader)} method
+   * because it informs the driver that the parameter value should be sent to
+   * the server as a {@code NCLOB}.  When the {@code setCharacterStream} method is used, the
+   * driver may have to do extra work to determine whether the parameter
+   * data should be sent to the server as a {@code LONGNVARCHAR} or a {@code NCLOB}
+   * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
+   * it might be more efficient to use a version of
+   * {@code setNClob} which takes a length parameter.
+   *
+   * @param parameterIndex index of the first parameter is 1, the second is 2, ...
+   * @param reader An object that contains the data to set the parameter value to.
+   * @throws SQLException if parameterIndex does not correspond to a parameter
+   *         marker in the SQL statement;
+   *         if the driver does not support national character sets;
+   *         if the driver can detect that a data conversion
+   *         error could occur;  if a database access error occurs or
+   *         this method is called on a closed {@code PreparedStatement}
+   * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
+   *
+   * @since 1.6
+   */
   public void setNClob(int parameterIndex, Reader reader)
     throws SQLException{
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
-   /**
-  * Sets the designated parameter to a <code>Reader</code> object.  The <code>reader</code> must contain the number
-             * of characters specified by length otherwise a <code>SQLException</code> will be
-            * generated when the <code>CallableStatement</code> is executed.
-            * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
-            * because it informs the driver that the parameter value should be sent to
-            * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
-            * driver may have to do extra work to determine whether the parameter
-            * data should be send to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
-            *
-            * @param parameterName the name of the parameter to be set
-            * @param reader An object that contains the data to set the parameter value to.
-            * @param length the number of characters in the parameter data.
-            * @throws SQLException if parameterIndex does not correspond to a parameter
-            * marker in the SQL statement; if the length specified is less than zero;
-            * if the driver does not support national
-            *         character sets;  if the driver can detect that a data conversion
-            *  error could occur; if a database access error occurs or
-            * this method is called on a closed <code>CallableStatement</code>
-            * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-            * this method
-            * @since 1.6
-            */
-            public void setNClob(String parameterName, Reader reader, long length)
+  /**
+   * Sets the designated parameter to a {@code Reader} object.
+   * The {@code reader} must contain the number
+   * of characters specified by length otherwise a {@code SQLException} will be
+   * generated when the {@code CallableStatement} is executed.
+   * This method differs from the {@code setCharacterStream (int, Reader, int)} method
+   * because it informs the driver that the parameter value should be sent to
+   * the server as a {@code NCLOB}.  When the {@code setCharacterStream} method is used, the
+   * driver may have to do extra work to determine whether the parameter
+   * data should be send to the server as a {@code LONGNVARCHAR} or a {@code NCLOB}
+   *
+   * @param parameterName the name of the parameter to be set
+   * @param reader An object that contains the data to set the parameter value to.
+   * @param length the number of characters in the parameter data.
+   * @throws SQLException if parameterIndex does not correspond to a parameter
+   * marker in the SQL statement; if the length specified is less than zero;
+   * if the driver does not support national
+   *         character sets;  if the driver can detect that a data conversion
+   *  error could occur; if a database access error occurs or
+   * this method is called on a closed {@code CallableStatement}
+   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+   * this method
+   * @since 1.6
+   */
+  public void setNClob(String parameterName, Reader reader, long length)
     throws SQLException{
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
-   }
+  }
 
 
  /**
-  * Sets the designated parameter to a <code>Reader</code> object.
-  * This method differs from the <code>setCharacterStream (int, Reader)</code> method
+  * Sets the designated parameter to a {@code Reader} object.
+  * This method differs from the {@code setCharacterStream (int, Reader)} method
   * because it informs the driver that the parameter value should be sent to
-  * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
+  * the server as a {@code NCLOB}.  When the {@code setCharacterStream} method is used, the
   * driver may have to do extra work to determine whether the parameter
-  * data should be send to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
+  * data should be send to the server as a {@code LONGNVARCHAR} or a {@code NCLOB}
   * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
   * it might be more efficient to use a version of
-  * <code>setNClob</code> which takes a length parameter.
+  * {@code setNClob} which takes a length parameter.
   *
   * @param parameterName the name of the parameter
   * @param reader An object that contains the data to set the parameter value to.
   * @throws SQLException if the driver does not support national character sets;
-  * if the driver can detect that a data conversion
-  *  error could occur;  if a database access error occurs or
-  * this method is called on a closed <code>CallableStatement</code>
+  *         if the driver can detect that a data conversion
+  *         error could occur;  if a database access error occurs or
+  *         this method is called on a closed {@code CallableStatement}
   * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
   *
   * @since 1.6
@@ -5839,23 +5858,25 @@
    }
 
 
-   /**
-     ** of characters specified by length otherwise a <code>SQLException</code> will becontain  the number
-     * generated when the <code>PreparedStatement</code> is executed.
-     * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
+    /**
+     * Sets the designated parameter to a {@code Reader} object. The reader must contain the number
+     * of characters specified by length otherwise a {@code SQLException} will be
+     * generated when the {@code PreparedStatement} is executed.
+     * This method differs from the {@code setCharacterStream (int, Reader, int)} method
      * because it informs the driver that the parameter value should be sent to
-     * the server as a <code>NCLOB</code>.  When the <code>setCharacterStream</code> method is used, the
+     * the server as a {@code NCLOB}.  When the {@code setCharacterStream} method is used, the
      * driver may have to do extra work to determine whether the parameter
-     * data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
+     * data should be sent to the server as a {@code LONGNVARCHAR} or a {@code NCLOB}
+     *
      * @param parameterIndex index of the first parameter is 1, the second is 2, ...
      * @param reader An object that contains the data to set the parameter value to.
      * @param length the number of characters in the parameter data.
      * @throws SQLException if parameterIndex does not correspond to a parameter
-     * marker in the SQL statement; if the length specified is less than zero;
-     * if the driver does not support national character sets;
-     * if the driver can detect that a data conversion
-     *  error could occur;  if a database access error occurs or
-     * this method is called on a closed <code>PreparedStatement</code>
+     *         marker in the SQL statement; if the length specified is less than zero;
+     *         if the driver does not support national character sets;
+     *         if the driver can detect that a data conversion
+     *         error could occur;  if a database access error occurs or
+     *         this method is called on a closed {@code PreparedStatement}
      * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
      *
      * @since 1.6
@@ -5867,14 +5888,14 @@
 
 
     /**
-     * Sets the designated parameter to a <code>java.sql.NClob</code> object. The driver converts this to
-a
-     * SQL <code>NCLOB</code> value when it sends it to the database.
+     * Sets the designated parameter to a {@code java.sql.NClob} object.
+     * The driver converts this to an
+     * SQL {@code NCLOB} value when it sends it to the database.
      * @param parameterIndex of the first parameter is 1, the second is 2, ...
      * @param value the parameter value
      * @throws SQLException if the driver does not support national
      *         character sets;  if the driver can detect that a data conversion
-     *  error could occur ; or if a database access error occurs
+     *         error could occur; or if a database access error occurs
      * @since 1.6
      */
      public void setNClob(int parameterIndex, NClob value) throws SQLException{
@@ -5883,14 +5904,14 @@
 
 
  /**
-  * Sets the designated parameter to the given <code>String</code> object.
-  * The driver converts this to a SQL <code>NCHAR</code> or
-  * <code>NVARCHAR</code> or <code>LONGNVARCHAR</code>
+  * Sets the designated parameter to the given {@code String} object.
+  * The driver converts this to a SQL {@code NCHAR} or
+  * {@code NVARCHAR} or {@code LONGNVARCHAR}
   * @param parameterName the name of the column to be set
   * @param value the parameter value
   * @throws SQLException if the driver does not support national
   *         character sets;  if the driver can detect that a data conversion
-  *  error could occur; or if a database access error occurs
+  *         error could occur; or if a database access error occurs
   * @since 1.6
   */
  public void setNString(String parameterName, String value)
@@ -5899,8 +5920,8 @@
    }
 
  /**
-  * Sets the designated parameter to a <code>Reader</code> object. The
-  * <code>Reader</code> reads the data till end-of-file is reached. The
+  * Sets the designated parameter to a {@code Reader} object. The
+  * {@code Reader} reads the data till end-of-file is reached. The
   * driver does the necessary conversion from Java character format to
   * the national character set in the database.
   * @param parameterIndex of the first parameter is 1, the second is 2, ...
@@ -5908,7 +5929,7 @@
   * @param length the number of characters in the parameter data.
   * @throws SQLException if the driver does not support national
   *         character sets;  if the driver can detect that a data conversion
-  *  error could occur ; or if a database access error occurs
+  *         error could occur ; or if a database access error occurs
   * @since 1.6
   */
   public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException{
@@ -5918,8 +5939,8 @@
 
 
  /**
-  * Sets the designated parameter to a <code>Reader</code> object. The
-  * <code>Reader</code> reads the data till end-of-file is reached. The
+  * Sets the designated parameter to a {@code Reader} object. The
+  * {@code Reader} reads the data till end-of-file is reached. The
   * driver does the necessary conversion from Java character format to
   * the national character set in the database.
   * @param parameterName the name of the column to be set
@@ -5935,9 +5956,9 @@
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
-  /**
-  * Sets the designated parameter to a <code>Reader</code> object. The
-  * <code>Reader</code> reads the data till end-of-file is reached. The
+ /**
+  * Sets the designated parameter to a {@code Reader} object. The
+  * {@code Reader} reads the data till end-of-file is reached. The
   * driver does the necessary conversion from Java character format to
   * the national character set in the database.
 
@@ -5946,14 +5967,14 @@
   * standard interface.
   * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
   * it might be more efficient to use a version of
-  * <code>setNCharacterStream</code> which takes a length parameter.
+  * {@code setNCharacterStream} which takes a length parameter.
   *
   * @param parameterName the name of the parameter
   * @param value the parameter value
   * @throws SQLException if the driver does not support national
   *         character sets;  if the driver can detect that a data conversion
-  *  error could occur ; if a database access error occurs; or
-  * this method is called on a closed <code>CallableStatement</code>
+  *         error could occur ; if a database access error occurs; or
+  *         this method is called on a closed {@code CallableStatement}
   * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
   * @since 1.6
   */
@@ -5962,23 +5983,23 @@
    }
 
   /**
-    * Sets the designated parameter to the given <code>java.sql.Timestamp</code> value,
-    * using the given <code>Calendar</code> object.  The driver uses
-    * the <code>Calendar</code> object to construct an SQL <code>TIMESTAMP</code> value,
+    * Sets the designated parameter to the given {@code java.sql.Timestamp} value,
+    * using the given {@code Calendar} object.  The driver uses
+    * the {@code Calendar} object to construct an SQL {@code TIMESTAMP} value,
     * which the driver then sends to the database.  With a
-    * a <code>Calendar</code> object, the driver can calculate the timestamp
+    * a {@code Calendar} object, the driver can calculate the timestamp
     * taking into account a custom timezone.  If no
-    * <code>Calendar</code> object is specified, the driver uses the default
+    * {@code Calendar} object is specified, the driver uses the default
     * timezone, which is that of the virtual machine running the application.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
-    * @param cal the <code>Calendar</code> object the driver will use
-    *            to construct the timestamp
+    * @param cal the {@code Calendar} object the driver will use
+    *         to construct the timestamp
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getTimestamp
     * @since 1.4
     */
@@ -5987,28 +6008,29 @@
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
-    /**
-    * Sets the designated parameter to a <code>Reader</code> object.  The <code>reader</code> must contain  the number
-               * of characters specified by length otherwise a <code>SQLException</code> will be
-               * generated when the <code>CallableStatement</code> is executed.
-              * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
-              * because it informs the driver that the parameter value should be sent to
-              * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
-               * driver may have to do extra work to determine whether the parameter
-               * data should be send to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
-               * @param parameterName the name of the parameter to be set
-              * @param reader An object that contains the data to set the parameter value to.
-              * @param length the number of characters in the parameter data.
-              * @throws SQLException if parameterIndex does not correspond to a parameter
-              * marker in the SQL statement; if the length specified is less than zero;
-              * a database access error occurs or
-              * this method is called on a closed <code>CallableStatement</code>
-              * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-              * this method
-              *
-              * @since 1.6
-              */
-      public  void setClob(String parameterName, Reader reader, long length)
+  /**
+   * Sets the designated parameter to a {@code Reader} object.  The {@code reader} must contain  the number
+   * of characters specified by length otherwise a {@code SQLException} will be
+   * generated when the {@code CallableStatement} is executed.
+   * This method differs from the {@code setCharacterStream (int, Reader, int)} method
+   * because it informs the driver that the parameter value should be sent to
+   * the server as a {@code CLOB}.  When the {@code setCharacterStream} method is used, the
+   * driver may have to do extra work to determine whether the parameter
+   * data should be send to the server as a {@code LONGVARCHAR} or a {@code CLOB}
+   *
+   * @param parameterName the name of the parameter to be set
+   * @param reader An object that contains the data to set the parameter value to.
+   * @param length the number of characters in the parameter data.
+   * @throws SQLException if parameterIndex does not correspond to a parameter
+   *         marker in the SQL statement; if the length specified is less than zero;
+   *         a database access error occurs or
+   *         this method is called on a closed {@code CallableStatement}
+   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+   *         this method
+   *
+   * @since 1.6
+   */
+   public  void setClob(String parameterName, Reader reader, long length)
       throws SQLException{
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
@@ -6016,16 +6038,16 @@
 
 
   /**
-    * Sets the designated parameter to the given <code>java.sql.Clob</code> object.
-    * The driver converts this to an SQL <code>CLOB</code> value when it
+    * Sets the designated parameter to the given {@code java.sql.Clob} object.
+    * The driver converts this to an SQL {@code CLOB} value when it
     * sends it to the database.
     *
     * @param parameterName the name of the parameter
-    * @param x a <code>Clob</code> object that maps an SQL <code>CLOB</code> value
+    * @param x a {@code Clob} object that maps an SQL {@code CLOB} value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @since 1.6
     */
     public void setClob (String parameterName, Clob x) throws SQLException{
@@ -6033,21 +6055,21 @@
    }
 
  /**
-    * Sets the designated parameter to a <code>Reader</code> object.
-    * This method differs from the <code>setCharacterStream (int, Reader)</code> method
+    * Sets the designated parameter to a {@code Reader} object.
+    * This method differs from the {@code setCharacterStream (int, Reader)} method
     * because it informs the driver that the parameter value should be sent to
-    * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
+    * the server as a {@code CLOB}.  When the {@code setCharacterStream} method is used, the
     * driver may have to do extra work to determine whether the parameter
-    * data should be send to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
+    * data should be send to the server as a {@code LONGVARCHAR} or a {@code CLOB}
     *
     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
     * it might be more efficient to use a version of
-    * <code>setClob</code> which takes a length parameter.
+    * {@code setClob} which takes a length parameter.
     *
     * @param parameterName the name of the parameter
     * @param reader An object that contains the data to set the parameter value to.
     * @throws SQLException if a database access error occurs or this method is called on
-    * a closed <code>CallableStatement</code>
+    *         a closed {@code CallableStatement}
     *
     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
     * @since 1.6
@@ -6058,19 +6080,19 @@
    }
 
 
- /**
-    * Sets the designated parameter to the given <code>java.sql.Date</code> value
+   /**
+    * Sets the designated parameter to the given {@code java.sql.Date} value
     * using the default time zone of the virtual machine that is running
     * the application.
     * The driver converts this
-    * to an SQL <code>DATE</code> value when it sends it to the database.
+    * to an SQL {@code DATE} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getDate
     * @since 1.4
     */
@@ -6080,23 +6102,23 @@
    }
 
    /**
-    * Sets the designated parameter to the given <code>java.sql.Date</code> value,
-    * using the given <code>Calendar</code> object.  The driver uses
-    * the <code>Calendar</code> object to construct an SQL <code>DATE</code> value,
+    * Sets the designated parameter to the given {@code java.sql.Date} value,
+    * using the given {@code Calendar} object.  The driver uses
+    * the {@code Calendar} object to construct an SQL {@code DATE} value,
     * which the driver then sends to the database.  With a
-    * a <code>Calendar</code> object, the driver can calculate the date
+    * a {@code Calendar} object, the driver can calculate the date
     * taking into account a custom timezone.  If no
-    * <code>Calendar</code> object is specified, the driver uses the default
+    * {@code Calendar} object is specified, the driver uses the default
     * timezone, which is that of the virtual machine running the application.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
-    * @param cal the <code>Calendar</code> object the driver will use
+    * @param cal the {@code Calendar} object the driver will use
     *            to construct the date
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getDate
     * @since 1.4
     */
@@ -6107,16 +6129,16 @@
 
 
  /**
-    * Sets the designated parameter to the given <code>java.sql.Time</code> value.
+    * Sets the designated parameter to the given {@code java.sql.Time} value.
     * The driver converts this
-    * to an SQL <code>TIME</code> value when it sends it to the database.
+    * to an SQL {@code TIME} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getTime
     * @since 1.4
     */
@@ -6126,23 +6148,23 @@
    }
 
  /**
-    * Sets the designated parameter to the given <code>java.sql.Time</code> value,
-    * using the given <code>Calendar</code> object.  The driver uses
-    * the <code>Calendar</code> object to construct an SQL <code>TIME</code> value,
+    * Sets the designated parameter to the given {@code java.sql.Time} value,
+    * using the given {@code Calendar} object.  The driver uses
+    * the {@code Calendar} object to construct an SQL {@code TIME} value,
     * which the driver then sends to the database.  With a
-    * a <code>Calendar</code> object, the driver can calculate the time
+    * a {@code Calendar} object, the driver can calculate the time
     * taking into account a custom timezone.  If no
-    * <code>Calendar</code> object is specified, the driver uses the default
+    * {@code Calendar} object is specified, the driver uses the default
     * timezone, which is that of the virtual machine running the application.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
-    * @param cal the <code>Calendar</code> object the driver will use
+    * @param cal the {@code Calendar} object the driver will use
     *            to construct the time
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getTime
     * @since 1.4
     */
@@ -6152,22 +6174,22 @@
    }
 
    /**
-   * Sets the designated parameter to a <code>Reader</code> object.
-   * This method differs from the <code>setCharacterStream (int, Reader)</code> method
+   * Sets the designated parameter to a {@code Reader} object.
+   * This method differs from the {@code setCharacterStream (int, Reader)} method
    * because it informs the driver that the parameter value should be sent to
-   * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
+   * the server as a {@code CLOB}.  When the {@code setCharacterStream} method is used, the
    * driver may have to do extra work to determine whether the parameter
-   * data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
+   * data should be sent to the server as a {@code LONGVARCHAR} or a {@code CLOB}
    *
    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
    * it might be more efficient to use a version of
-   * <code>setClob</code> which takes a length parameter.
+   * {@code setClob} which takes a length parameter.
    *
    * @param parameterIndex index of the first parameter is 1, the second is 2, ...
    * @param reader An object that contains the data to set the parameter value to.
    * @throws SQLException if a database access error occurs, this method is called on
-   * a closed <code>PreparedStatement</code>or if parameterIndex does not correspond to a parameter
-   * marker in the SQL statement
+   *         a closed {@code PreparedStatement}or if parameterIndex does not correspond to a parameter
+   *         marker in the SQL statement
    *
    * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
    * @since 1.6
@@ -6178,20 +6200,20 @@
    }
 
 
-   /**
-   * Sets the designated parameter to a <code>Reader</code> object.  The reader must contain  the number
-   * of characters specified by length otherwise a <code>SQLException</code> will be
-   * generated when the <code>PreparedStatement</code> is executed.
-   *This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
+  /**
+   * Sets the designated parameter to a {@code Reader} object.  The reader must contain  the number
+   * of characters specified by length otherwise a {@code SQLException} will be
+   * generated when the {@code PreparedStatement} is executed.
+   * This method differs from the {@code setCharacterStream (int, Reader, int)} method
    * because it informs the driver that the parameter value should be sent to
-   * the server as a <code>CLOB</code>.  When the <code>setCharacterStream</code> method is used, the
+   * the server as a {@code CLOB}.  When the {@code setCharacterStream} method is used, the
    * driver may have to do extra work to determine whether the parameter
-   * data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
+   * data should be sent to the server as a {@code LONGVARCHAR} or a {@code CLOB}
    * @param parameterIndex index of the first parameter is 1, the second is 2, ...
    * @param reader An object that contains the data to set the parameter value to.
    * @param length the number of characters in the parameter data.
    * @throws SQLException if a database access error occurs, this method is called on
-   * a closed <code>PreparedStatement</code>, if parameterIndex does not correspond to a parameter
+   * a closed {@code PreparedStatement}, if parameterIndex does not correspond to a parameter
    * marker in the SQL statement, or if the length specified is less than zero.
    *
    * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
@@ -6203,26 +6225,27 @@
    }
 
 
- /**
-    * Sets the designated parameter to a <code>InputStream</code> object.  The inputstream must contain  the number
-    * of characters specified by length otherwise a <code>SQLException</code> will be
-    * generated when the <code>PreparedStatement</code> is executed.
-    * This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
+   /**
+    * Sets the designated parameter to a {@code InputStream} object.  The inputstream must contain  the number
+    * of characters specified by length otherwise a {@code SQLException} will be
+    * generated when the {@code PreparedStatement} is executed.
+    * This method differs from the {@code setBinaryStream (int, InputStream, int)}
     * method because it informs the driver that the parameter value should be
-    * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
+    * sent to the server as a {@code BLOB}.  When the {@code setBinaryStream} method is used,
     * the driver may have to do extra work to determine whether the parameter
-    * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
+    * data should be sent to the server as a {@code LONGVARBINARY} or a {@code BLOB}
+    *
     * @param parameterIndex index of the first parameter is 1,
-    * the second is 2, ...
+    *        the second is 2, ...
     * @param inputStream An object that contains the data to set the parameter
-    * value to.
+    *        value to.
     * @param length the number of bytes in the parameter data.
     * @throws SQLException if a database access error occurs,
-    * this method is called on a closed <code>PreparedStatement</code>,
-    * if parameterIndex does not correspond
-    * to a parameter marker in the SQL statement,  if the length specified
-    * is less than zero or if the number of bytes in the inputstream does not match
-    * the specified length.
+    *         this method is called on a closed {@code PreparedStatement},
+    *         if parameterIndex does not correspond
+    *         to a parameter marker in the SQL statement,  if the length specified
+    *         is less than zero or if the number of bytes in the inputstream does not match
+    *         the specified length.
     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
     *
     * @since 1.6
@@ -6233,28 +6256,27 @@
    }
 
  /**
-    * Sets the designated parameter to a <code>InputStream</code> object.
-    * This method differs from the <code>setBinaryStream (int, InputStream)</code>
-    * This method differs from the <code>setBinaryStream (int, InputStream)</code>
+    * Sets the designated parameter to a {@code InputStream} object.
+    * This method differs from the {@code setBinaryStream (int, InputStream)}
+    * This method differs from the {@code setBinaryStream (int, InputStream)}
     * method because it informs the driver that the parameter value should be
-    * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
+    * sent to the server as a {@code BLOB}.  When the {@code setBinaryStream} method is used,
     * the driver may have to do extra work to determine whether the parameter
-    * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
+    * data should be sent to the server as a {@code LONGVARBINARY} or a {@code BLOB}
     *
     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
     * it might be more efficient to use a version of
-    * <code>setBlob</code> which takes a length parameter.
+    * {@code setBlob} which takes a length parameter.
     *
     * @param parameterIndex index of the first parameter is 1,
-    * the second is 2, ...
-
-
+    *        the second is 2, ...
+    *
     * @param inputStream An object that contains the data to set the parameter
-    * value to.
+    *        value to.
     * @throws SQLException if a database access error occurs,
-    * this method is called on a closed <code>PreparedStatement</code> or
-    * if parameterIndex does not correspond
-    * to a parameter marker in the SQL statement,
+    *         this method is called on a closed {@code PreparedStatement} or
+    *         if parameterIndex does not correspond
+    *         to a parameter marker in the SQL statement,
     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
     *
     * @since 1.6
@@ -6264,72 +6286,72 @@
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
- /**
-    * Sets the designated parameter to a <code>InputStream</code> object.  The <code>inputstream</code> must contain  the number
-      * of characters specified by length, otherwise a <code>SQLException</code> will be
-      * generated when the <code>CallableStatement</code> is executed.
-      * This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
-      * method because it informs the driver that the parameter value should be
-      * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
-      * the driver may have to do extra work to determine whether the parameter
-      * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
-      *
-      * @param parameterName the name of the parameter to be set
-      * the second is 2, ...
-      *
-      * @param inputStream An object that contains the data to set the parameter
-      * value to.
-      * @param length the number of bytes in the parameter data.
-      * @throws SQLException  if parameterIndex does not correspond
-      * to a parameter marker in the SQL statement,  or if the length specified
-      * is less than zero; if the number of bytes in the inputstream does not match
-      * the specified length; if a database access error occurs or
-      * this method is called on a closed <code>CallableStatement</code>
-      * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-      * this method
-      *
-      * @since 1.6
-      */
-      public void setBlob(String parameterName, InputStream inputStream, long length)
+   /**
+    * Sets the designated parameter to a {@code InputStream} object.  The {@code inputstream} must contain  the number
+    * of characters specified by length, otherwise a {@code SQLException} will be
+    * generated when the {@code CallableStatement} is executed.
+    * This method differs from the {@code setBinaryStream (int, InputStream, int)}
+    * method because it informs the driver that the parameter value should be
+    * sent to the server as a {@code BLOB}.  When the {@code setBinaryStream} method is used,
+    * the driver may have to do extra work to determine whether the parameter
+    * data should be sent to the server as a {@code LONGVARBINARY} or a {@code BLOB}
+    *
+    * @param parameterName the name of the parameter to be set
+    * the second is 2, ...
+    *
+    * @param inputStream An object that contains the data to set the parameter
+    *        value to.
+    * @param length the number of bytes in the parameter data.
+    * @throws SQLException  if parameterIndex does not correspond
+    *         to a parameter marker in the SQL statement,  or if the length specified
+    *         is less than zero; if the number of bytes in the inputstream does not match
+    *         the specified length; if a database access error occurs or
+    *         this method is called on a closed {@code CallableStatement}
+    * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+    *         this method
+    *
+    * @since 1.6
+    */
+   public void setBlob(String parameterName, InputStream inputStream, long length)
          throws SQLException{
          throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
     }
 
 
- /**
-    * Sets the designated parameter to the given <code>java.sql.Blob</code> object.
-    * The driver converts this to an SQL <code>BLOB</code> value when it
+   /**
+    * Sets the designated parameter to the given {@code java.sql.Blob} object.
+    * The driver converts this to an SQL {@code BLOB} value when it
     * sends it to the database.
     *
     * @param parameterName the name of the parameter
-    * @param x a <code>Blob</code> object that maps an SQL <code>BLOB</code> value
+    * @param x a {@code Blob} object that maps an SQL {@code BLOB} value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @since 1.6
     */
    public void setBlob (String parameterName, Blob x) throws SQLException{
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
- /**
-    * Sets the designated parameter to a <code>InputStream</code> object.
-    * This method differs from the <code>setBinaryStream (int, InputStream)</code>
+   /**
+    * Sets the designated parameter to a {@code InputStream} object.
+    * This method differs from the {@code setBinaryStream (int, InputStream)}
     * method because it informs the driver that the parameter value should be
-    * sent to the server as a <code>BLOB</code>.  When the <code>setBinaryStream</code> method is used,
+    * sent to the server as a {@code BLOB}.  When the {@code setBinaryStream} method is used,
     * the driver may have to do extra work to determine whether the parameter
-    * data should be send to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
+    * data should be send to the server as a {@code LONGVARBINARY} or a {@code BLOB}
     *
     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
     * it might be more efficient to use a version of
-    * <code>setBlob</code> which takes a length parameter.
+    * {@code setBlob} which takes a length parameter.
     *
     * @param parameterName the name of the parameter
     * @param inputStream An object that contains the data to set the parameter
-    * value to.
+    *        value to.
     * @throws SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *         this method is called on a closed {@code CallableStatement}
     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
     *
     * @since 1.6
@@ -6339,22 +6361,22 @@
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
-  /**
+ /**
   * Sets the value of the designated parameter with the given object. The second
   * argument must be an object type; for integral values, the
-  * <code>java.lang</code> equivalent objects should be used.
+  * {@code java.lang} equivalent objects should be used.
   *
   * <p>The given Java object will be converted to the given targetSqlType
   * before being sent to the database.
   *
   * If the object has a custom mapping (is of a class implementing the
-  * interface <code>SQLData</code>),
-  * the JDBC driver should call the method <code>SQLData.writeSQL</code> to write it
+  * interface {@code SQLData}),
+  * the JDBC driver should call the method {@code SQLData.writeSQL} to write it
   * to the SQL data stream.
   * If, on the other hand, the object is of a class implementing
-  * <code>Ref</code>, <code>Blob</code>, <code>Clob</code>,  <code>NClob</code>,
-  *  <code>Struct</code>, <code>java.net.URL</code>,
-  * or <code>Array</code>, the driver should pass it to the database as a
+  * {@code Ref}, {@code Blob}, {@code Clob},  {@code NClob},
+  *  {@code Struct}, {@code java.net.URL},
+  * or {@code Array}, the driver should pass it to the database as a
   * value of the corresponding SQL type.
   * <P>
   * Note that this method may be used to pass datatabase-
@@ -6365,17 +6387,17 @@
   * @param targetSqlType the SQL type (as defined in java.sql.Types) to be
   * sent to the database. The scale argument may further qualify this type.
   * @param scale for java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types,
-  *          this is the number of digits after the decimal point.  For all other
-  *          types, this value will be ignored.
+  *        this is the number of digits after the decimal point.  For all other
+  *        types, this value will be ignored.
   * @exception SQLException if a database access error occurs or
-  * this method is called on a closed <code>CallableStatement</code>
-  * @exception SQLFeatureNotSupportedException if <code>targetSqlType</code> is
-  * a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
-  * <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
-  * <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
-  *  <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
-  * or  <code>STRUCT</code> data type and the JDBC driver does not support
-  * this data type
+  *        this method is called on a closed {@code CallableStatement}
+  * @exception SQLFeatureNotSupportedException if {@code targetSqlType} is
+  *            an {@code ARRAY, BLOB, CLOB,
+  *            DATALINK, JAVA_OBJECT, NCHAR,
+  *            NCLOB, NVARCHAR, LONGNVARCHAR,
+  *            REF, ROWID, SQLXML}
+  *            or {@code STRUCT} data type and the JDBC driver does not support
+  *            this data type
   * @see Types
   * @see #getObject
   * @since 1.4
@@ -6387,7 +6409,7 @@
 
   /**
     * Sets the value of the designated parameter with the given object.
-    * This method is like the method <code>setObject</code>
+    * This method is like the method {@code setObject}
     * above, except that it assumes a scale of zero.
     *
     * @param parameterName the name of the parameter
@@ -6395,14 +6417,14 @@
     * @param targetSqlType the SQL type (as defined in java.sql.Types) to be
     *                      sent to the database
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
-    * @exception SQLFeatureNotSupportedException if <code>targetSqlType</code> is
-    * a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
-    * <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
-    * <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
-    *  <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
-    * or  <code>STRUCT</code> data type and the JDBC driver does not support
-    * this data type
+    * this method is called on a closed {@code CallableStatement}
+    * @exception SQLFeatureNotSupportedException if {@code targetSqlType} is
+    *            an {@code ARRAY, BLOB, CLOB,
+    *            DATALINK, JAVA_OBJECT, NCHAR,
+    *            NCLOB, NVARCHAR, LONGNVARCHAR,
+    *            REF, ROWID, SQLXML}
+    *            or {@code STRUCT} data type and the JDBC driver does not support
+    *            this data type
     * @see #getObject
     * @since 1.4
     */
@@ -6411,13 +6433,13 @@
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
- /**
+  /**
    * Sets the value of the designated parameter with the given object.
-   * The second parameter must be of type <code>Object</code>; therefore, the
-   * <code>java.lang</code> equivalent objects should be used for built-in types.
+   * The second parameter must be of type {@code Object}; therefore, the
+   * {@code java.lang} equivalent objects should be used for built-in types.
    *
    * <p>The JDBC specification specifies a standard mapping from
-   * Java <code>Object</code> types to SQL types.  The given argument
+   * Java {@code Object} types to SQL types.  The given argument
    * will be converted to the corresponding SQL type before being
    * sent to the database.
    *
@@ -6425,13 +6447,13 @@
    * specific abstract data types, by using a driver-specific Java
    * type.
    *
-   * If the object is of a class implementing the interface <code>SQLData</code>,
-   * the JDBC driver should call the method <code>SQLData.writeSQL</code>
+   * If the object is of a class implementing the interface {@code SQLData},
+   * the JDBC driver should call the method {@code SQLData.writeSQL}
    * to write it to the SQL data stream.
    * If, on the other hand, the object is of a class implementing
-   * <code>Ref</code>, <code>Blob</code>, <code>Clob</code>,  <code>NClob</code>,
-   *  <code>Struct</code>, <code>java.net.URL</code>,
-   * or <code>Array</code>, the driver should pass it to the database as a
+   * {@code Ref}, {@code Blob}, {@code Clob},  {@code NClob},
+   *  {@code Struct}, {@code java.net.URL},
+   * or {@code Array}, the driver should pass it to the database as a
    * value of the corresponding SQL type.
    * <P>
    * This method throws an exception if there is an ambiguity, for example, if the
@@ -6440,10 +6462,10 @@
    * @param parameterName the name of the parameter
    * @param x the object containing the input parameter value
    * @exception SQLException if a database access error occurs,
-   * this method is called on a closed <code>CallableStatement</code> or if the given
-   *            <code>Object</code> parameter is ambiguous
+   *            this method is called on a closed {@code CallableStatement} or if the given
+   *            {@code Object} parameter is ambiguous
    * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-   * this method
+   *            this method
    * @see #getObject
    * @since 1.4
    */
@@ -6454,9 +6476,9 @@
   /**
   * Sets the designated parameter to the given input stream, which will have
   * the specified number of bytes.
-  * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+  * When a very large ASCII value is input to a {@code LONGVARCHAR}
   * parameter, it may be more practical to send it via a
-  * <code>java.io.InputStream</code>. Data will be read from the stream
+  * {@code java.io.InputStream}. Data will be read from the stream
   * as needed until end-of-file is reached.  The JDBC driver will
   * do any necessary conversion from ASCII to the database char format.
   *
@@ -6468,9 +6490,9 @@
   * @param x the Java input stream that contains the ASCII parameter value
   * @param length the number of bytes in the stream
   * @exception SQLException if a database access error occurs or
-  * this method is called on a closed <code>CallableStatement</code>
+  *            this method is called on a closed {@code CallableStatement}
   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-  * this method
+  *            this method
   * @since 1.4
   */
  public void setAsciiStream(String parameterName, java.io.InputStream x, int length)
@@ -6482,9 +6504,9 @@
 /**
   * Sets the designated parameter to the given input stream, which will have
   * the specified number of bytes.
-  * When a very large binary value is input to a <code>LONGVARBINARY</code>
+  * When a very large binary value is input to a {@code LONGVARBINARY}
   * parameter, it may be more practical to send it via a
-  * <code>java.io.InputStream</code> object. The data will be read from the stream
+  * {@code java.io.InputStream} object. The data will be read from the stream
   * as needed until end-of-file is reached.
   *
   * <P><B>Note:</B> This stream object can either be a standard
@@ -6495,9 +6517,9 @@
   * @param x the java input stream which contains the binary parameter value
   * @param length the number of bytes in the stream
   * @exception SQLException if a database access error occurs or
-  * this method is called on a closed <code>CallableStatement</code>
+  *            this method is called on a closed {@code CallableStatement}
   * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-  * this method
+  *            this method
   * @since 1.4
   */
  public void setBinaryStream(String parameterName, java.io.InputStream x,
@@ -6506,11 +6528,11 @@
  }
 
  /**
-   * Sets the designated parameter to the given <code>Reader</code>
+   * Sets the designated parameter to the given {@code Reader}
    * object, which is the given number of characters long.
-   * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+   * When a very large UNICODE value is input to a {@code LONGVARCHAR}
    * parameter, it may be more practical to send it via a
-   * <code>java.io.Reader</code> object. The data will be read from the stream
+   * {@code java.io.Reader} object. The data will be read from the stream
    * as needed until end-of-file is reached.  The JDBC driver will
    * do any necessary conversion from UNICODE to the database char format.
    *
@@ -6519,13 +6541,13 @@
    * standard interface.
    *
    * @param parameterName the name of the parameter
-   * @param reader the <code>java.io.Reader</code> object that
+   * @param reader the {@code java.io.Reader} object that
    *        contains the UNICODE data used as the designated parameter
    * @param length the number of characters in the stream
    * @exception SQLException if a database access error occurs or
-   * this method is called on a closed <code>CallableStatement</code>
+   *            this method is called on a closed {@code CallableStatement}
    * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-   * this method
+   *            this method
    * @since 1.4
    */
   public void setCharacterStream(String parameterName,
@@ -6536,9 +6558,9 @@
 
   /**
    * Sets the designated parameter to the given input stream.
-   * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+   * When a very large ASCII value is input to a {@code LONGVARCHAR}
    * parameter, it may be more practical to send it via a
-   * <code>java.io.InputStream</code>. Data will be read from the stream
+   * {@code java.io.InputStream}. Data will be read from the stream
    * as needed until end-of-file is reached.  The JDBC driver will
    * do any necessary conversion from ASCII to the database char format.
    *
@@ -6547,15 +6569,15 @@
    * standard interface.
    * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
    * it might be more efficient to use a version of
-   * <code>setAsciiStream</code> which takes a length parameter.
+   * {@code setAsciiStream} which takes a length parameter.
    *
    * @param parameterName the name of the parameter
    * @param x the Java input stream that contains the ASCII parameter value
    * @exception SQLException if a database access error occurs or
-   * this method is called on a closed <code>CallableStatement</code>
+   *            this method is called on a closed {@code CallableStatement}
    * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
-     * @since 1.6
-  */
+   * @since 1.6
+   */
   public void setAsciiStream(String parameterName, java.io.InputStream x)
           throws SQLException{
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
@@ -6564,9 +6586,9 @@
 
  /**
     * Sets the designated parameter to the given input stream.
-    * When a very large binary value is input to a <code>LONGVARBINARY</code>
+    * When a very large binary value is input to a {@code LONGVARBINARY}
     * parameter, it may be more practical to send it via a
-    * <code>java.io.InputStream</code> object. The data will be read from the
+    * {@code java.io.InputStream} object. The data will be read from the
     * stream as needed until end-of-file is reached.
     *
     * <P><B>Note:</B> This stream object can either be a standard
@@ -6574,12 +6596,12 @@
     * standard interface.
     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
     * it might be more efficient to use a version of
-    * <code>setBinaryStream</code> which takes a length parameter.
+    * {@code setBinaryStream} which takes a length parameter.
     *
     * @param parameterName the name of the parameter
     * @param x the java input stream which contains the binary parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
     * @since 1.6
     */
@@ -6589,11 +6611,11 @@
    }
 
  /**
-    * Sets the designated parameter to the given <code>Reader</code>
+    * Sets the designated parameter to the given {@code Reader}
     * object.
-    * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+    * When a very large UNICODE value is input to a {@code LONGVARCHAR}
     * parameter, it may be more practical to send it via a
-    * <code>java.io.Reader</code> object. The data will be read from the stream
+    * {@code java.io.Reader} object. The data will be read from the stream
     * as needed until end-of-file is reached.  The JDBC driver will
     * do any necessary conversion from UNICODE to the database char format.
     *
@@ -6602,13 +6624,13 @@
     * standard interface.
     * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
     * it might be more efficient to use a version of
-    * <code>setCharacterStream</code> which takes a length parameter.
+    * {@code setCharacterStream} which takes a length parameter.
     *
     * @param parameterName the name of the parameter
-    * @param reader the <code>java.io.Reader</code> object that contains the
+    * @param reader the {@code java.io.Reader} object that contains the
     *        Unicode data
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @throws SQLFeatureNotSupportedException  if the JDBC driver does not support this method
     * @since 1.6
     */
@@ -6619,16 +6641,16 @@
 
    /**
     * Sets the designated parameter to the given
-    * <code>java.math.BigDecimal</code> value.
-    * The driver converts this to an SQL <code>NUMERIC</code> value when
+    * {@code java.math.BigDecimal} value.
+    * The driver converts this to an SQL {@code NUMERIC} value when
     * it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getBigDecimal
     * @since 1.4
     */
@@ -6636,20 +6658,20 @@
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
- /**
-    * Sets the designated parameter to the given Java <code>String</code> value.
+   /**
+    * Sets the designated parameter to the given Java {@code String} value.
     * The driver converts this
-    * to an SQL <code>VARCHAR</code> or <code>LONGVARCHAR</code> value
+    * to an SQL {@code VARCHAR} or {@code LONGVARCHAR} value
     * (depending on the argument's
-    * size relative to the driver's limits on <code>VARCHAR</code> values)
+    * size relative to the driver's limits on {@code VARCHAR} values)
     * when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getString
     * @since 1.4
     */
@@ -6659,19 +6681,19 @@
 
 
 
- /**
+   /**
     * Sets the designated parameter to the given Java array of bytes.
-    * The driver converts this to an SQL <code>VARBINARY</code> or
-    * <code>LONGVARBINARY</code> (depending on the argument's size relative
-    * to the driver's limits on <code>VARBINARY</code> values) when it sends
+    * The driver converts this to an SQL {@code VARBINARY} or
+    * {@code LONGVARBINARY} (depending on the argument's size relative
+    * to the driver's limits on {@code VARBINARY} values) when it sends
     * it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getBytes
     * @since 1.4
     */
@@ -6680,17 +6702,17 @@
    }
 
  /**
-    * Sets the designated parameter to the given <code>java.sql.Timestamp</code> value.
+    * Sets the designated parameter to the given {@code java.sql.Timestamp} value.
     * The driver
-    * converts this to an SQL <code>TIMESTAMP</code> value when it sends it to the
+    * converts this to an SQL {@code TIMESTAMP} value when it sends it to the
     * database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getTimestamp
     * @since 1.4
     */
@@ -6700,16 +6722,16 @@
    }
 
     /**
-    * Sets the designated parameter to SQL <code>NULL</code>.
+    * Sets the designated parameter to SQL {@code NULL}.
     *
     * <P><B>Note:</B> You must specify the parameter's SQL type.
     *
     * @param parameterName the name of the parameter
-    * @param sqlType the SQL type code defined in <code>java.sql.Types</code>
+    * @param sqlType the SQL type code defined in {@code java.sql.Types}
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @since 1.4
     */
    public void setNull(String parameterName, int sqlType) throws SQLException {
@@ -6717,8 +6739,8 @@
    }
 
  /**
-    * Sets the designated parameter to SQL <code>NULL</code>.
-    * This version of the method <code>setNull</code> should
+    * Sets the designated parameter to SQL {@code NULL}.
+    * This version of the method {@code setNull} should
     * be used for user-defined types and REF type parameters.  Examples
     * of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and
     * named array types.
@@ -6738,14 +6760,14 @@
     *
     *
     * @param parameterName the name of the parameter
-    * @param sqlType a value from <code>java.sql.Types</code>
+    * @param sqlType a value from {@code java.sql.Types}
     * @param typeName the fully-qualified name of an SQL user-defined type;
     *        ignored if the parameter is not a user-defined type or
-    *        SQL <code>REF</code> value
+    *        SQL {@code REF} value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *        this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *        this method
     * @since 1.4
     */
    public void setNull (String parameterName, int sqlType, String typeName)
@@ -6754,17 +6776,17 @@
    }
 
  /**
-    * Sets the designated parameter to the given Java <code>boolean</code> value.
+    * Sets the designated parameter to the given Java {@code boolean} value.
     * The driver converts this
-    * to an SQL <code>BIT</code> or <code>BOOLEAN</code> value when it sends it to the database.
+    * to an SQL {@code BIT} or {@code BOOLEAN} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @see #getBoolean
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @since 1.4
     */
    public void setBoolean(String parameterName, boolean x) throws SQLException{
@@ -6774,16 +6796,16 @@
 
 
  /**
-    * Sets the designated parameter to the given Java <code>byte</code> value.
+    * Sets the designated parameter to the given Java {@code byte} value.
     * The driver converts this
-    * to an SQL <code>TINYINT</code> value when it sends it to the database.
+    * to an SQL {@code TINYINT} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getByte
     * @since 1.4
     */
@@ -6793,16 +6815,16 @@
 
 
  /**
-    * Sets the designated parameter to the given Java <code>short</code> value.
+    * Sets the designated parameter to the given Java {@code short} value.
     * The driver converts this
-    * to an SQL <code>SMALLINT</code> value when it sends it to the database.
+    * to an SQL {@code SMALLINT} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getShort
     * @since 1.4
     */
@@ -6812,16 +6834,16 @@
 
 
    /**
-    * Sets the designated parameter to the given Java <code>int</code> value.
+    * Sets the designated parameter to the given Java {@code int} value.
     * The driver converts this
-    * to an SQL <code>INTEGER</code> value when it sends it to the database.
+    * to an SQL {@code INTEGER} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getInt
     * @since 1.4
     */
@@ -6829,17 +6851,17 @@
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
- /**
-    * Sets the designated parameter to the given Java <code>long</code> value.
+   /**
+    * Sets the designated parameter to the given Java {@code long} value.
     * The driver converts this
-    * to an SQL <code>BIGINT</code> value when it sends it to the database.
+    * to an SQL {@code BIGINT} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getLong
     * @since 1.4
     */
@@ -6848,17 +6870,17 @@
    }
 
 
- /**
-    * Sets the designated parameter to the given Java <code>float</code> value.
+   /**
+    * Sets the designated parameter to the given Java {@code float} value.
     * The driver converts this
-    * to an SQL <code>FLOAT</code> value when it sends it to the database.
+    * to an SQL {@code FLOAT} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getFloat
     * @since 1.4
     */
@@ -6866,17 +6888,17 @@
         throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
    }
 
- /**
-    * Sets the designated parameter to the given Java <code>double</code> value.
+   /**
+    * Sets the designated parameter to the given Java {@code double} value.
     * The driver converts this
-    * to an SQL <code>DOUBLE</code> value when it sends it to the database.
+    * to an SQL {@code DOUBLE} value when it sends it to the database.
     *
     * @param parameterName the name of the parameter
     * @param x the parameter value
     * @exception SQLException if a database access error occurs or
-    * this method is called on a closed <code>CallableStatement</code>
+    *            this method is called on a closed {@code CallableStatement}
     * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
-    * this method
+    *            this method
     * @see #getDouble
     * @since 1.4
     */
@@ -6887,7 +6909,6 @@
     /**
      * This method re populates the resBundle
      * during the deserialization process
-     *
      */
     private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
         // Default state initialization happens here
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java	Wed Jul 05 20:37:47 2017 +0200
@@ -43,22 +43,22 @@
 
 
 /**
- * The facility called on internally by the <code>RIOptimisticProvider</code> implementation to
+ * The facility called on internally by the {@code RIOptimisticProvider} implementation to
  * propagate changes back to the data source from which the rowset got its data.
  * <P>
- * A <code>CachedRowSetWriter</code> object, called a writer, has the public
- * method <code>writeData</code> for writing modified data to the underlying data source.
+ * A {@code CachedRowSetWriter} object, called a writer, has the public
+ * method {@code writeData} for writing modified data to the underlying data source.
  * This method is invoked by the rowset internally and is never invoked directly by an application.
  * A writer also has public methods for setting and getting
- * the <code>CachedRowSetReader</code> object, called a reader, that is associated
+ * the {@code CachedRowSetReader} object, called a reader, that is associated
  * with the writer. The remainder of the methods in this class are private and
  * are invoked internally, either directly or indirectly, by the method
- * <code>writeData</code>.
+ * {@code writeData}.
  * <P>
- * Typically the <code>SyncFactory</code> manages the <code>RowSetReader</code> and
- * the <code>RowSetWriter</code> implementations using <code>SyncProvider</code> objects.
+ * Typically the {@code SyncFactory} manages the {@code RowSetReader} and
+ * the {@code RowSetWriter} implementations using {@code SyncProvider} objects.
  * Standard JDBC RowSet implementations provide an object instance of this
- * writer by invoking the <code>SyncProvider.getRowSetWriter()</code> method.
+ * writer by invoking the {@code SyncProvider.getRowSetWriter()} method.
  *
  * @version 0.2
  * @author Jonathan Bruce
@@ -69,15 +69,15 @@
 public class CachedRowSetWriter implements TransactionalWriter, Serializable {
 
 /**
- * The <code>Connection</code> object that this writer will use to make a
+ * The {@code Connection} object that this writer will use to make a
  * connection to the data source to which it will write data.
  *
  */
     private transient Connection con;
 
 /**
- * The SQL <code>SELECT</code> command that this writer will call
- * internally. The method <code>initSQLStatements</code> builds this
+ * The SQL {@code SELECT} command that this writer will call
+ * internally. The method {@code initSQLStatements} builds this
  * command by supplying the words "SELECT" and "FROM," and using
  * metadata to get the table name and column names .
  *
@@ -86,9 +86,9 @@
     private String selectCmd;
 
 /**
- * The SQL <code>UPDATE</code> command that this writer will call
+ * The SQL {@code UPDATE} command that this writer will call
  * internally to write data to the rowset's underlying data source.
- * The method <code>initSQLStatements</code> builds this <code>String</code>
+ * The method {@code initSQLStatements} builds this {@code String}
  * object.
  *
  * @serial
@@ -96,8 +96,8 @@
     private String updateCmd;
 
 /**
- * The SQL <code>WHERE</code> clause the writer will use for update
- * statements in the <code>PreparedStatement</code> object
+ * The SQL {@code WHERE} clause the writer will use for update
+ * statements in the {@code PreparedStatement} object
  * it sends to the underlying data source.
  *
  * @serial
@@ -105,7 +105,7 @@
     private String updateWhere;
 
 /**
- * The SQL <code>DELETE</code> command that this writer will call
+ * The SQL {@code DELETE} command that this writer will call
  * internally to delete a row in the rowset's underlying data source.
  *
  * @serial
@@ -113,8 +113,8 @@
     private String deleteCmd;
 
 /**
- * The SQL <code>WHERE</code> clause the writer will use for delete
- * statements in the <code>PreparedStatement</code> object
+ * The SQL {@code WHERE} clause the writer will use for delete
+ * statements in the {@code PreparedStatement} object
  * it sends to the underlying data source.
  *
  * @serial
@@ -122,9 +122,9 @@
     private String deleteWhere;
 
 /**
- * The SQL <code>INSERT INTO</code> command that this writer will internally use
+ * The SQL {@code INSERT INTO} command that this writer will internally use
  * to insert data into the rowset's underlying data source.  The method
- * <code>initSQLStatements</code> builds this command with a question
+ * {@code initSQLStatements} builds this command with a question
  * mark parameter placeholder for each column in the rowset.
  *
  * @serial
@@ -133,8 +133,8 @@
 
 /**
  * An array containing the column numbers of the columns that are
- * needed to uniquely identify a row in the <code>CachedRowSet</code> object
- * for which this <code>CachedRowSetWriter</code> object is the writer.
+ * needed to uniquely identify a row in the {@code CachedRowSet} object
+ * for which this {@code CachedRowSetWriter} object is the writer.
  *
  * @serial
  */
@@ -142,7 +142,7 @@
 
 /**
  * An array of the parameters that should be used to set the parameter
- * placeholders in a <code>PreparedStatement</code> object that this
+ * placeholders in a {@code PreparedStatement} object that this
  * writer will execute.
  *
  * @serial
@@ -150,33 +150,33 @@
     private Object[] params;
 
 /**
- * The <code>CachedRowSetReader</code> object that has been
- * set as the reader for the <code>CachedRowSet</code> object
- * for which this <code>CachedRowSetWriter</code> object is the writer.
+ * The {@code CachedRowSetReader} object that has been
+ * set as the reader for the {@code CachedRowSet} object
+ * for which this {@code CachedRowSetWriter} object is the writer.
  *
  * @serial
  */
     private CachedRowSetReader reader;
 
 /**
- * The <code>ResultSetMetaData</code> object that contains information
- * about the columns in the <code>CachedRowSet</code> object
- * for which this <code>CachedRowSetWriter</code> object is the writer.
+ * The {@code ResultSetMetaData} object that contains information
+ * about the columns in the {@code CachedRowSet} object
+ * for which this {@code CachedRowSetWriter} object is the writer.
  *
  * @serial
  */
     private ResultSetMetaData callerMd;
 
 /**
- * The number of columns in the <code>CachedRowSet</code> object
- * for which this <code>CachedRowSetWriter</code> object is the writer.
+ * The number of columns in the {@code CachedRowSet} object
+ * for which this {@code CachedRowSetWriter} object is the writer.
  *
  * @serial
  */
     private int callerColumnCount;
 
 /**
- * This <code>CachedRowSet<code> will hold the conflicting values
+ * This {@code CachedRowSet} will hold the conflicting values
  *  retrieved from the db and hold it.
  */
     private CachedRowSetImpl crsResolve;
@@ -209,8 +209,8 @@
     }
 
 /**
- * Propagates changes in the given <code>RowSet</code> object
- * back to its underlying data source and returns <code>true</code>
+ * Propagates changes in the given {@code RowSet} object
+ * back to its underlying data source and returns {@code true}
  * if successful. The writer will check to see if
  * the data in the pre-modified rowset (the original values) differ
  * from the data in the underlying data source.  If data in the data
@@ -221,15 +221,15 @@
  * access for concurrent users.
  * <P>
  * This method is called by the rowset internally when
- * the application invokes the method <code>acceptChanges</code>.
- * The <code>writeData</code> method in turn calls private methods that
+ * the application invokes the method {@code acceptChanges}.
+ * The {@code writeData} method in turn calls private methods that
  * it defines internally.
  * The following is a general summary of what the method
- * <code>writeData</code> does, much of which is accomplished
+ * {@code writeData} does, much of which is accomplished
  * through calls to its own internal methods.
  * <OL>
- * <LI>Creates a <code>CachedRowSet</code> object from the given
- *     <code>RowSet</code> object
+ * <LI>Creates a {@code CachedRowSet} object from the given
+ *     {@code RowSet} object
  * <LI>Makes a connection with the data source
  *   <UL>
  *      <LI>Disables autocommit mode if it is not already disabled
@@ -237,32 +237,32 @@
  *   </UL>
  * <LI>Checks to see if the reader has read new data since the writer
  *     was last called and, if so, calls the method
- *    <code>initSQLStatements</code> to initialize new SQL statements
+ *    {@code initSQLStatements} to initialize new SQL statements
  *   <UL>
- *       <LI>Builds new <code>SELECT</code>, <code>UPDATE</code>,
- *           <code>INSERT</code>, and <code>DELETE</code> statements
- *       <LI>Uses the <code>CachedRowSet</code> object's metadata to
+ *       <LI>Builds new {@code SELECT}, {@code UPDATE},
+ *           {@code INSERT}, and {@code DELETE} statements
+ *       <LI>Uses the {@code CachedRowSet} object's metadata to
  *           determine the table name, column names, and the columns
  *           that make up the primary key
  *   </UL>
  * <LI>When there is no conflict, propagates changes made to the
- *     <code>CachedRowSet</code> object back to its underlying data source
+ *     {@code CachedRowSet} object back to its underlying data source
  *   <UL>
- *      <LI>Iterates through each row of the <code>CachedRowSet</code> object
+ *      <LI>Iterates through each row of the {@code CachedRowSet} object
  *          to determine whether it has been updated, inserted, or deleted
  *      <LI>If the corresponding row in the data source has not been changed
  *          since the rowset last read its
  *          values, the writer will use the appropriate command to update,
  *          insert, or delete the row
  *      <LI>If any data in the data source does not match the original values
- *          for the <code>CachedRowSet</code> object, the writer will roll
+ *          for the {@code CachedRowSet} object, the writer will roll
  *          back any changes it has made to the row in the data source.
  *   </UL>
  * </OL>
  *
- * @return <code>true</code> if changes to the rowset were successfully
+ * @return {@code true} if changes to the rowset were successfully
  *         written to the rowset's underlying data source;
- *         <code>false</code> otherwise
+ *         {@code false} otherwise
  */
     public boolean writeData(RowSetInternal caller) throws SQLException {
         long conflicts = 0;
@@ -434,25 +434,25 @@
 
   } //end writeData
 
-/**
- * Updates the given <code>CachedRowSet</code> object's underlying data
- * source so that updates to the rowset are reflected in the original
- * data source, and returns <code>false</code> if the update was successful.
- * A return value of <code>true</code> indicates that there is a conflict,
- * meaning that a value updated in the rowset has already been changed by
- * someone else in the underlying data source.  A conflict can also exist
- * if, for example, more than one row in the data source would be affected
- * by the update or if no rows would be affected.  In any case, if there is
- * a conflict, this method does not update the underlying data source.
- * <P>
- * This method is called internally by the method <code>writeData</code>
- * if a row in the <code>CachedRowSet</code> object for which this
- * <code>CachedRowSetWriter</code> object is the writer has been updated.
- *
- * @return <code>false</code> if the update to the underlying data source is
- *         successful; <code>true</code> otherwise
- * @throws SQLException if a database access error occurs
- */
+    /**
+     * Updates the given {@code CachedRowSet} object's underlying data
+     * source so that updates to the rowset are reflected in the original
+     * data source, and returns {@code false} if the update was successful.
+     * A return value of {@code true} indicates that there is a conflict,
+     * meaning that a value updated in the rowset has already been changed by
+     * someone else in the underlying data source.  A conflict can also exist
+     * if, for example, more than one row in the data source would be affected
+     * by the update or if no rows would be affected.  In any case, if there is
+     * a conflict, this method does not update the underlying data source.
+     * <P>
+     * This method is called internally by the method {@code writeData}
+     * if a row in the {@code CachedRowSet} object for which this
+     * {@code CachedRowSetWriter} object is the writer has been updated.
+     *
+     * @return {@code false} if the update to the underlying data source is
+     *         successful; {@code true} otherwise
+     * @throws SQLException if a database access error occurs
+     */
     private boolean updateOriginalRow(CachedRowSet crs)
         throws SQLException {
         PreparedStatement pstmt;
@@ -805,16 +805,16 @@
 
    /**
     * Inserts a row that has been inserted into the given
-    * <code>CachedRowSet</code> object into the data source from which
-    * the rowset is derived, returning <code>false</code> if the insertion
+    * {@code CachedRowSet} object into the data source from which
+    * the rowset is derived, returning {@code false} if the insertion
     * was successful.
     *
-    * @param crs the <code>CachedRowSet</code> object that has had a row inserted
+    * @param crs the {@code CachedRowSet} object that has had a row inserted
     *            and to whose underlying data source the row will be inserted
-    * @param pstmt the <code>PreparedStatement</code> object that will be used
+    * @param pstmt the {@code PreparedStatement} object that will be used
     *              to execute the insertion
-    * @return <code>false</code> to indicate that the insertion was successful;
-    *         <code>true</code> otherwise
+    * @return {@code false} to indicate that the insertion was successful;
+    *         {@code true} otherwise
     * @throws SQLException if a database access error occurs
     */
    private boolean insertNewRow(CachedRowSet crs,
@@ -917,24 +917,24 @@
        }
    }
 
-/**
- * Deletes the row in the underlying data source that corresponds to
- * a row that has been deleted in the given <code> CachedRowSet</code> object
- * and returns <code>false</code> if the deletion was successful.
- * <P>
- * This method is called internally by this writer's <code>writeData</code>
- * method when a row in the rowset has been deleted. The values in the
- * deleted row are the same as those that are stored in the original row
- * of the given <code>CachedRowSet</code> object.  If the values in the
- * original row differ from the row in the underlying data source, the row
- * in the data source is not deleted, and <code>deleteOriginalRow</code>
- * returns <code>true</code> to indicate that there was a conflict.
- *
- *
- * @return <code>false</code> if the deletion was successful, which means that
- *         there was no conflict; <code>true</code> otherwise
- * @throws SQLException if there was a database access error
- */
+   /**
+    * Deletes the row in the underlying data source that corresponds to
+    * a row that has been deleted in the given {@code  CachedRowSet} object
+    * and returns {@code false} if the deletion was successful.
+    * <P>
+    * This method is called internally by this writer's {@code writeData}
+    * method when a row in the rowset has been deleted. The values in the
+    * deleted row are the same as those that are stored in the original row
+    * of the given {@code CachedRowSet} object.  If the values in the
+    * original row differ from the row in the underlying data source, the row
+    * in the data source is not deleted, and {@code deleteOriginalRow}
+    * returns {@code true} to indicate that there was a conflict.
+    *
+    *
+    * @return {@code false} if the deletion was successful, which means that
+    *         there was no conflict; {@code true} otherwise
+    * @throws SQLException if there was a database access error
+    */
     private boolean deleteOriginalRow(CachedRowSet crs, CachedRowSetImpl crsRes) throws SQLException {
         PreparedStatement pstmt;
         int i;
@@ -1056,13 +1056,13 @@
     }
 
     /**
-     * Composes a <code>SELECT</code>, <code>UPDATE</code>, <code>INSERT</code>,
-     * and <code>DELETE</code> statement that can be used by this writer to
-     * write data to the data source backing the given <code>CachedRowSet</code>
+     * Composes a {@code SELECT}, {@code UPDATE}, {@code INSERT},
+     * and {@code DELETE} statement that can be used by this writer to
+     * write data to the data source backing the given {@code CachedRowSet}
      * object.
      *
-     * @ param caller a <code>CachedRowSet</code> object for which this
-     *                <code>CachedRowSetWriter</code> object is the writer
+     * @param caller a {@code CachedRowSet} object for which this
+     *        {@code CachedRowSetWriter} object is the writer
      * @throws SQLException if a database access error occurs
      */
     private void initSQLStatements(CachedRowSet caller) throws SQLException {
@@ -1177,13 +1177,13 @@
      * table names. The given metadata object is used to get the proper order
      * and separator.
      *
-     * @param dbmd a <code>DatabaseMetaData</code> object that contains metadata
-     *          about this writer's <code>CachedRowSet</code> object
-     * @param catalog a <code>String</code> object with the rowset's catalog
+     * @param dbmd a {@code DatabaseMetaData} object that contains metadata
+     *          about this writer's {@code CachedRowSet} object
+     * @param catalog a {@code String} object with the rowset's catalog
      *          name
-     * @param table a <code>String</code> object with the name of the table from
+     * @param table a {@code String} object with the name of the table from
      *          which this writer's rowset was derived
-     * @return a <code>String</code> object with the fully qualified name of the
+     * @return a {@code String} object with the fully qualified name of the
      *          table from which this writer's rowset was derived
      * @throws SQLException if a database access error occurs
      */
@@ -1221,21 +1221,21 @@
     }
 
     /**
-     * Assigns to the given <code>CachedRowSet</code> object's
-     * <code>params</code>
+     * Assigns to the given {@code CachedRowSet} object's
+     * {@code params}
      * field an array whose length equals the number of columns needed
      * to uniquely identify a row in the rowset. The array is given
-     * values by the method <code>buildWhereClause</code>.
+     * values by the method {@code buildWhereClause}.
      * <P>
-     * If the <code>CachedRowSet</code> object's <code>keyCols</code>
-     * field has length <code>0</code> or is <code>null</code>, the array
+     * If the {@code CachedRowSet} object's {@code keyCols}
+     * field has length {@code 0} or is {@code null}, the array
      * is set with the column number of every column in the rowset.
-     * Otherwise, the array in the field <code>keyCols</code> is set with only
+     * Otherwise, the array in the field {@code keyCols} is set with only
      * the column numbers of the columns that are required to form a unique
      * identifier for a row.
      *
-     * @param crs the <code>CachedRowSet</code> object for which this
-     *     <code>CachedRowSetWriter</code> object is the writer
+     * @param crs the {@code CachedRowSet} object for which this
+     *     {@code CachedRowSetWriter} object is the writer
      *
      * @throws SQLException if a database access error occurs
      */
@@ -1263,29 +1263,29 @@
     }
 
     /**
-         * Constructs an SQL <code>WHERE</code> clause using the given
-         * string as a starting point. The resulting clause will contain
-         * a column name and " = ?" for each key column, that is, each column
-         * that is needed to form a unique identifier for a row in the rowset.
-         * This <code>WHERE</code> clause can be added to
-         * a <code>PreparedStatement</code> object that updates, inserts, or
-         * deletes a row.
-         * <P>
-         * This method uses the given result set to access values in the
-         * <code>CachedRowSet</code> object that called this writer.  These
-         * values are used to build the array of parameters that will serve as
-         * replacements for the "?" parameter placeholders in the
-         * <code>PreparedStatement</code> object that is sent to the
-         * <code>CachedRowSet</code> object's underlying data source.
-         *
-         * @param whereClause a <code>String</code> object that is an empty
-         *                    string ("")
-         * @param rs a <code>ResultSet</code> object that can be used
-         *           to access the <code>CachedRowSet</code> object's data
-         * @return a <code>WHERE</code> clause of the form "<code>WHERE</code>
-         *         columnName = ? AND columnName = ? AND columnName = ? ..."
-         * @throws SQLException if a database access error occurs
-         */
+     * Constructs an SQL {@code WHERE} clause using the given
+     * string as a starting point. The resulting clause will contain
+     * a column name and " = ?" for each key column, that is, each column
+     * that is needed to form a unique identifier for a row in the rowset.
+     * This {@code WHERE} clause can be added to
+     * a {@code PreparedStatement} object that updates, inserts, or
+     * deletes a row.
+     * <P>
+     * This method uses the given result set to access values in the
+     * {@code CachedRowSet} object that called this writer.  These
+     * values are used to build the array of parameters that will serve as
+     * replacements for the "?" parameter placeholders in the
+     * {@code PreparedStatement} object that is sent to the
+     * {@code CachedRowSet} object's underlying data source.
+     *
+     * @param whereClause a {@code String} object that is an empty
+     *                    string ("")
+     * @param rs a {@code ResultSet} object that can be used
+     *           to access the {@code CachedRowSet} object's data
+     * @return a {@code WHERE} clause of the form "{@code WHERE}
+     *         columnName = ? AND columnName = ? AND columnName = ? ..."
+     * @throws SQLException if a database access error occurs
+     */
     private String buildWhereClause(String whereClause,
                                     ResultSet rs) throws SQLException {
         whereClause = "WHERE ";
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/SyncResolverImpl.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/SyncResolverImpl.java	Wed Jul 05 20:37:47 2017 +0200
@@ -39,8 +39,8 @@
 
 /**
  * There will be two sets of data which will be maintained by the rowset at the
- * time of synchronization. The <code>SyncProvider</code> will utilize the
- * <code>SyncResolver</code> to synchronize the changes back to database.
+ * time of synchronization. The {@code SyncProvider} will utilize the
+ * {@code SyncResolver} to synchronize the changes back to database.
  */
 public class SyncResolverImpl extends CachedRowSetImpl implements SyncResolver {
     /**
@@ -79,19 +79,19 @@
     private int rowStatus;
 
     /**
-     * This will contain the size of the <code>CachedRowSet</code> object
+     * This will contain the size of the {@code CachedRowSet} object
      */
     private int sz;
 
     /**
-     * The <code>Connection</code> handle used to synchronize the changes
+     * The {@code Connection} handle used to synchronize the changes
      * back to datasource. This is the same connection handle as was passed
      * to the CachedRowSet while fetching the data.
      */
     private transient Connection con;
 
     /**
-     * The <code>CachedRowSet</code> object which will encapsulate
+     * The {@code CachedRowSet} object which will encapsulate
      * a row at any time. This will be built from CachedRowSet and
      * SyncResolver values. Synchronization takes place on a row by
      * row basis encapsulated as a CahedRowSet.
@@ -123,13 +123,13 @@
 
     /**
      * Retrieves the conflict status of the current row of this
-     * <code>SyncResolver</code>, which indicates the operationthe <code>RowSet</code>
+     * {@code SyncResolver}, which indicates the operationthe {@code RowSet}
      * object was attempting when the conflict occurred.
      *
      * @return one of the following constants:
-     *         <code>SyncResolver.UPDATE_ROW_CONFLICT</code>,
-     *         <code>SyncResolver.DELETE_ROW_CONFLICT</code>, or
-     *         <code>SyncResolver.INSERT_ROW_CONFLICT</code>
+     *         {@code SyncResolver.UPDATE_ROW_CONFLICT},
+     *         {@code SyncResolver.DELETE_ROW_CONFLICT}, or
+     *         {@code SyncResolver.INSERT_ROW_CONFLICT}
      */
     public int getStatus() {
         return ((Integer)stats.get(rowStatus-1)).intValue();
@@ -137,10 +137,10 @@
 
     /**
      * Retrieves the value in the designated column in the current row of this
-     * <code>SyncResolver</code> object, which is the value that caused a conflict.
-     *
-     * @param index <code>int</code> designating the column in this row of this
-     *        <code>SyncResolver</code> object from which to retrieve the value
+     * {@code SyncResolver} object, which is the value that caused a conflict.
+     *
+     * @param index {@code int} designating the column in this row of this
+     *        {@code SyncResolver} object from which to retrieve the value
      *        causing a conflict
      */
     public Object getConflictValue(int index) throws SQLException {
@@ -153,10 +153,10 @@
 
     /**
      * Retrieves the value in the designated column in the current row of this
-     * <code>SyncResolver</code> object, which is the value that caused a conflict.
-     *
-     * @param columnName a <code>String</code> object designating the column in this row of this
-     *        <code>SyncResolver</code> object from which to retrieve the value
+     * {@code SyncResolver} object, which is the value that caused a conflict.
+     *
+     * @param columnName a {@code String} object designating the column in this row of this
+     *        {@code SyncResolver} object from which to retrieve the value
      *        causing a conflict
      */
     public Object getConflictValue(String columnName) throws SQLException {
@@ -169,12 +169,12 @@
 
     /**
      * Sets <i>obj</i> as the value in column <i>index</i> in the current row of the
-     * <code>RowSet</code> object. This value is the resolved value that is to be
+     * {@code RowSet} object. This value is the resolved value that is to be
      * persisted in the data source.
      *
-     * @param index an <code>int</code> giving the number of the column into which to
+     * @param index an {@code int} giving the number of the column into which to
      *        set the value to be persisted
-     * @param obj an <code>Object</code> that is the value to be set in the data source
+     * @param obj an {@code Object} that is the value to be set in the data source
      */
     public void setResolvedValue(int index, Object obj) throws SQLException {
         // modify method to throw SQLException in spec
@@ -291,18 +291,18 @@
      * This passes a CachedRowSet as a row to the CachedRowSetWriter
      * after the values have been resolved, back to the datasource.
      *
-     * @param row a <code>CachedRowSet</code> object which will hold the
+     * @param row a {@code CachedRowSet} object which will hold the
      *        values of a particular row after they have been resolved by
      *        the user to synchronize back to datasource.
      * @throws SQLException if synchronization does not happen properly
-     *         maybe beacuse <code>Connection</code> has timed out.
+     *         maybe beacuse {@code Connection} has timed out.
      **/
      private void writeData(CachedRowSet row) throws SQLException {
         crw.updateResolvedConflictToDB(row, crw.getReader().connect((RowSetInternal)crsSync));
      }
 
     /**
-     * This function builds a row  as a <code>CachedRowSet</code> object
+     * This function builds a row  as a {@code CachedRowSet} object
      * which has been resolved and is ready to be synchrinized to the datasource
      *
      * @throws SQLException if there is problem in building
@@ -385,12 +385,12 @@
 
     /**
      * Sets <i>obj</i> as the value in column <i>columnName</i> in the current row of the
-     * <code>RowSet</code> object. This value is the resolved value that is to be
+     * {@code RowSet} object. This value is the resolved value that is to be
      * persisted in the data source.
      *
-     * @param columnName a <code>String</code> object giving the name of the column
+     * @param columnName a {@code String} object giving the name of the column
      *        into which to set the value to be persisted
-     * @param obj an <code>Object</code> that is the value to be set in the data source
+     * @param obj an {@code Object} that is the value to be set in the data source
      */
     public void setResolvedValue(String columnName, Object obj) throws SQLException {
        // modify method to throw SQLException in spec
@@ -445,13 +445,13 @@
     }
 
     /**
-     * Moves the cursor down one row from its current position. A <code>SyncResolver</code>
+     * Moves the cursor down one row from its current position. A {@code SyncResolver}
      * cursor is initially positioned before the first conflict row; the first call to the
-     * method <code>nextConflict()</code> makes the first conflict row the current row;
+     * method {@code nextConflict()} makes the first conflict row the current row;
      * the second call makes the second conflict row the current row, and so on.
      * <p>
      * If an input stream is open for the current row, a call to the method next will
-     * implicitly close it. A <code>SyncResolver</code> object's warning chain is cleared
+     * implicitly close it. A {@code SyncResolver} object's warning chain is cleared
      * when a new row
      *
      * @return true if the new current row is valid; false if there are no more rows
@@ -495,9 +495,9 @@
 
 
     /**
-     * Moves the cursor to the previous conflict row in this <code>SyncResolver</code> object.
-     *
-     * @return <code>true</code> if the cursor is on a valid row; <code>false</code>
+     * Moves the cursor to the previous conflict row in this {@code SyncResolver} object.
+     *
+     * @return {@code true} if the cursor is on a valid row; {@code false}
      *     if it is off the result set
      * @throws SQLException if a database access error occurs or the result set type
      *     is TYPE_FORWARD_ONLY
@@ -511,17 +511,17 @@
     //-----------------------------------------------------------------------
 
     /**
-     * Sets this <code>CachedRowSetImpl</code> object's command property
-     * to the given <code>String</code> object and clears the parameters,
+     * Sets this {@code CachedRowSetImpl} object's command property
+     * to the given {@code String} object and clears the parameters,
      * if any, that were set for the previous command.
      * <P>
      * The command property may not be needed
      * if the rowset is produced by a data source, such as a spreadsheet,
      * that does not support commands. Thus, this property is optional
-     * and may be <code>null</code>.
-     *
-     * @param cmd a <code>String</code> object containing an SQL query
-     *            that will be set as the command; may be <code>null</code>
+     * and may be {@code null}.
+     *
+     * @param cmd a {@code String} object containing an SQL query
+     *            that will be set as the command; may be {@code null}
      * @throws SQLException if an error occurs
      */
     public void setCommand(String cmd) throws SQLException {
@@ -534,25 +534,25 @@
     //---------------------------------------------------------------------
 
     /**
-     * Populates this <code>CachedRowSetImpl</code> object with data from
-     * the given <code>ResultSet</code> object.  This
-     * method is an alternative to the method <code>execute</code>
-     * for filling the rowset with data.  The method <code>populate</code>
+     * Populates this {@code CachedRowSetImpl} object with data from
+     * the given {@code ResultSet} object.  This
+     * method is an alternative to the method {@code execute}
+     * for filling the rowset with data.  The method {@code populate}
      * does not require that the properties needed by the method
-     * <code>execute</code>, such as the <code>command</code> property,
-     * be set. This is true because the method <code>populate</code>
-     * is given the <code>ResultSet</code> object from
+     * {@code execute}, such as the {@code command} property,
+     * be set. This is true because the method {@code populate}
+     * is given the {@code ResultSet} object from
      * which to get data and thus does not need to use the properties
      * required for setting up a connection and executing this
-     * <code>CachedRowSetImpl</code> object's command.
+     * {@code CachedRowSetImpl} object's command.
      * <P>
      * After populating this rowset with data, the method
-     * <code>populate</code> sets the rowset's metadata and
-     * then sends a <code>RowSetChangedEvent</code> object
+     * {@code populate} sets the rowset's metadata and
+     * then sends a {@code RowSetChangedEvent} object
      * to all registered listeners prior to returning.
      *
-     * @param data the <code>ResultSet</code> object containing the data
-     *             to be read into this <code>CachedRowSetImpl</code> object
+     * @param data the {@code ResultSet} object containing the data
+     *             to be read into this {@code CachedRowSetImpl} object
      * @throws SQLException if an error occurs; or the max row setting is
      *          violated while populating the RowSet
      * @see #execute
@@ -562,18 +562,18 @@
     }
 
     /**
-     * Populates this <code>CachedRowSetImpl</code> object with data,
+     * Populates this {@code CachedRowSetImpl} object with data,
      * using the given connection to produce the result set from
      * which data will be read.  A second form of this method,
      * which takes no arguments, uses the values from this rowset's
      * user, password, and either url or data source properties to
-     * create a new database connection. The form of <code>execute</code>
+     * create a new database connection. The form of {@code execute}
      * that is given a connection ignores these properties.
      *
-     * @param conn A standard JDBC <code>Connection</code> object that this
-     * <code>CachedRowSet</code> object can pass to a synchronization provider
+     * @param conn A standard JDBC {@code Connection} object that this
+     * {@code CachedRowSet} object can pass to a synchronization provider
      * to establish a connection to the data source
-     * @throws SQLException if an invalid <code>Connection</code> is supplied
+     * @throws SQLException if an invalid {@code Connection} is supplied
      *           or an error occurs in establishing the connection to the
      *           data source
      * @see #populate
@@ -585,11 +585,11 @@
 
     /**
      * Propagates all row update, insert, and delete changes to the
-     * underlying data source backing this <code>CachedRowSetImpl</code>
+     * underlying data source backing this {@code CachedRowSetImpl}
      * object.
      * <P>
      * <b>Note</b>In the reference implementation an optimistic concurrency implementation
-     * is provided as a sample implementation of a the <code>SyncProvider</code>
+     * is provided as a sample implementation of a the {@code SyncProvider}
      * abstract class.
      * <P>
      * This method fails if any of the updates cannot be propagated back
@@ -601,17 +601,17 @@
      * In that case, when deleted rows are not shown, which is usually true,
      * the current row is not affected.
      * <P>
-     * If no <code>SyncProvider</code> is configured, the reference implementation
-     * leverages the <code>RIOptimisticProvider</code> available which provides the
+     * If no {@code SyncProvider} is configured, the reference implementation
+     * leverages the {@code RIOptimisticProvider} available which provides the
      * default and reference synchronization capabilities for disconnected
-     * <code>RowSets</code>.
+     * {@code RowSets}.
      *
      * @throws SQLException if the cursor is on the insert row or the underlying
      *          reference synchronization provider fails to commit the updates
      *          to the datasource
      * @throws SyncProviderException if an internal error occurs within the
-     *          <code>SyncProvider</code> instance during either during the
-     *          process or at any time when the <code>SyncProvider</code>
+     *          {@code SyncProvider} instance during either during the
+     *          process or at any time when the {@code SyncProvider}
      *          instance touches the data source.
      * @see #acceptChanges(java.sql.Connection)
      * @see javax.sql.RowSetWriter
@@ -623,18 +623,18 @@
 
     /**
      * Propagates all row update, insert, and delete changes to the
-     * data source backing this <code>CachedRowSetImpl</code> object
-     * using the given <code>Connection</code> object.
+     * data source backing this {@code CachedRowSetImpl} object
+     * using the given {@code Connection} object.
      * <P>
-     * The reference implementation <code>RIOptimisticProvider</code>
+     * The reference implementation {@code RIOptimisticProvider}
      * modifies its synchronization to a write back function given
      * the updated connection
      * The reference implementation modifies its synchronization behaviour
-     * via the <code>SyncProvider</code> to ensure the synchronization
-     * occurs according to the updated JDBC <code>Connection</code>
+     * via the {@code SyncProvider} to ensure the synchronization
+     * occurs according to the updated JDBC {@code Connection}
      * properties.
      *
-     * @param con a standard JDBC <code>Connection</code> object
+     * @param con a standard JDBC {@code Connection} object
      * @throws SQLException if the cursor is on the insert row or the underlying
      *                   synchronization provider fails to commit the updates
      *                   back to the data source
@@ -648,11 +648,11 @@
     }
 
     /**
-     * Restores this <code>CachedRowSetImpl</code> object to its original state,
+     * Restores this {@code CachedRowSetImpl} object to its original state,
      * that is, its state before the last set of changes.
      * <P>
      * Before returning, this method moves the cursor before the first row
-     * and sends a <code>rowSetChanged</code> event to all registered
+     * and sends a {@code rowSetChanged} event to all registered
      * listeners.
      * @throws SQLException if an error is occurs rolling back the RowSet
      *           state to the definied original value.
@@ -663,8 +663,8 @@
     }
 
     /**
-     * Releases the current contents of this <code>CachedRowSetImpl</code>
-     * object and sends a <code>rowSetChanged</code> event object to all
+     * Releases the current contents of this {@code CachedRowSetImpl}
+     * object and sends a {@code rowSetChanged} event object to all
      * registered listeners.
      *
      * @throws SQLException if an error occurs flushing the contents of
@@ -690,7 +690,7 @@
 
     /**
      * Immediately removes the current row from this
-     * <code>CachedRowSetImpl</code> object if the row has been inserted, and
+     * {@code CachedRowSetImpl} object if the row has been inserted, and
      * also notifies listeners the a row has changed.  An exception is thrown
      * if the row is not a row that has been inserted or the cursor is before
      * the first row, after the last row, or on the insert row.
@@ -710,10 +710,10 @@
      * row has been modified. This method can be
      * called to reverse updates on a all columns until all updates in a row have
      * been rolled back to their originating state since the last synchronization
-     * (<code>acceptChanges</code>) or population. This method may also be called
+     * ({@code acceptChanges}) or population. This method may also be called
      * while performing updates to the insert row.
      * <P>
-     * <code>undoUpdate</code may be called at any time during the life-time of a
+     * {@code undoUpdate} may be called at any time during the life-time of a
      * rowset, however after a synchronization has occurs this method has no
      * affect until further modification to the RowSet data occurs.
      *
@@ -733,12 +733,12 @@
     //--------------------------------------------------------------------
 
     /**
-     * Returns a new <code>RowSet</code> object backed by the same data as
-     * that of this <code>CachedRowSetImpl</code> object and sharing a set of cursors
+     * Returns a new {@code RowSet} object backed by the same data as
+     * that of this {@code CachedRowSetImpl} object and sharing a set of cursors
      * with it. This allows cursors to interate over a shared set of rows, providing
      * multiple views of the underlying data.
      *
-     * @return a <code>RowSet</code> object that is a copy of this <code>CachedRowSetImpl</code>
+     * @return a {@code RowSet} object that is a copy of this {@code CachedRowSetImpl}
      * object and shares a set of cursors with it
      * @throws SQLException if an error occurs or cloning is
      *                         not supported
@@ -750,19 +750,19 @@
     }
 
     /**
-     * Returns a new <code>RowSet</code> object containing by the same data
-     * as this <code>CachedRowSetImpl</code> object.  This method
-     * differs from the method <code>createCopy</code> in that it throws a
-     * <code>CloneNotSupportedException</code> object instead of an
-     * <code>SQLException</code> object, as the method <code>createShared</code>
-     * does.  This <code>clone</code>
-     * method is called internally by the method <code>createShared</code>,
-     * which catches the <code>CloneNotSupportedException</code> object
-     * and in turn throws a new <code>SQLException</code> object.
-     *
-     * @return a copy of this <code>CachedRowSetImpl</code> object
+     * Returns a new {@code RowSet} object containing by the same data
+     * as this {@code CachedRowSetImpl} object.  This method
+     * differs from the method {@code createCopy} in that it throws a
+     * {@code CloneNotSupportedException} object instead of an
+     * {@code SQLException} object, as the method {@code createShared}
+     * does.  This {@code clone}
+     * method is called internally by the method {@code createShared},
+     * which catches the {@code CloneNotSupportedException} object
+     * and in turn throws a new {@code SQLException} object.
+     *
+     * @return a copy of this {@code CachedRowSetImpl} object
      * @throws CloneNotSupportedException if an error occurs when
-     * attempting to clone this <code>CachedRowSetImpl</code> object
+     * attempting to clone this {@code CachedRowSetImpl} object
      * @see #createShared
      */
     protected Object clone() throws CloneNotSupportedException  {
@@ -770,8 +770,8 @@
     }
 
     /**
-     * Creates a <code>RowSet</code> object that is a deep copy of
-     * this <code>CachedRowSetImpl</code> object's data, including
+     * Creates a {@code RowSet} object that is a deep copy of
+     * this {@code CachedRowSetImpl} object's data, including
      * constraints.  Updates made
      * on a copy are not visible to the original rowset;
      * a copy of a rowset is completely independent from the original.
@@ -780,12 +780,12 @@
      * from first principles, which can be quite expensive.
      * For example, it can eliminate the need to query a
      * remote database server.
-     * @return a new <code>CachedRowSet</code> object that is a deep copy
-     *           of this <code>CachedRowSet</code> object and is
-     *           completely independent from this <code>CachedRowSetImpl</code>
+     * @return a new {@code CachedRowSet} object that is a deep copy
+     *           of this {@code CachedRowSet} object and is
+     *           completely independent from this {@code CachedRowSetImpl}
      *           object.
      * @throws SQLException if an error occurs in generating the copy of this
-     *           of the <code>CachedRowSetImpl</code>
+     *           of the {@code CachedRowSetImpl}
      * @see #createShared
      * @see javax.sql.RowSetEvent
      * @see javax.sql.RowSetListener
@@ -795,21 +795,21 @@
     }
 
     /**
-     * Creates a <code>RowSet</code> object that is a copy of
-     * this <code>CachedRowSetImpl</code> object's table structure
+     * Creates a {@code RowSet} object that is a copy of
+     * this {@code CachedRowSetImpl} object's table structure
      * and the constraints only.
      * There will be no data in the object being returned.
      * Updates made on a copy are not visible to the original rowset.
      * <P>
      * This helps in getting the underlying XML schema which can
-     * be used as the basis for populating a <code>WebRowSet</code>.
-     *
-     * @return a new <code>CachedRowSet</code> object that is a copy
-     * of this <code>CachedRowSetImpl</code> object's schema and
+     * be used as the basis for populating a {@code WebRowSet}.
+     *
+     * @return a new {@code CachedRowSet} object that is a copy
+     * of this {@code CachedRowSetImpl} object's schema and
      * retains all the constraints on the original rowset but contains
      * no data
      * @throws SQLException if an error occurs in generating the copy
-     * of the <code>CachedRowSet</code> object
+     * of the {@code CachedRowSet} object
      * @see #createShared
      * @see #createCopy
      * @see #createCopyNoConstraints
@@ -821,17 +821,17 @@
     }
 
     /**
-     * Creates a <code>CachedRowSet</code> object that is a copy of
-     * this <code>CachedRowSetImpl</code> object's data only.
+     * Creates a {@code CachedRowSet} object that is a copy of
+     * this {@code CachedRowSetImpl} object's data only.
      * All constraints set in this object will not be there
      * in the returning object.  Updates made
      * on a copy are not visible to the original rowset.
      *
-     * @return a new <code>CachedRowSet</code> object that is a deep copy
-     * of this <code>CachedRowSetImpl</code> object and is
-     * completely independent from this <code>CachedRowSetImpl</code> object
+     * @return a new {@code CachedRowSet} object that is a deep copy
+     * of this {@code CachedRowSetImpl} object and is
+     * completely independent from this {@code CachedRowSetImpl} object
      * @throws SQLException if an error occurs in generating the copy of the
-     * of the <code>CachedRowSet</code>
+     * of the {@code CachedRowSet}
      * @see #createShared
      * @see #createCopy
      * @see #createCopySchema
@@ -843,15 +843,15 @@
     }
 
     /**
-     * Converts this <code>CachedRowSetImpl</code> object to a collection
-     * of tables. The sample implementation utilitizes the <code>TreeMap</code>
+     * Converts this {@code CachedRowSetImpl} object to a collection
+     * of tables. The sample implementation utilitizes the {@code TreeMap}
      * collection type.
      * This class guarantees that the map will be in ascending key order,
      * sorted according to the natural order for the key's class.
      *
-     * @return a <code>Collection</code> object consisting of tables,
+     * @return a {@code Collection} object consisting of tables,
      *         each of which is a copy of a row in this
-     *         <code>CachedRowSetImpl</code> object
+     *         {@code CachedRowSetImpl} object
      * @throws SQLException if an error occurs in generating the collection
      * @see #toCollection(int)
      * @see #toCollection(String)
@@ -863,16 +863,16 @@
     }
 
     /**
-     * Returns the specified column of this <code>CachedRowSetImpl</code> object
-     * as a <code>Collection</code> object.  This method makes a copy of the
-     * column's data and utilitizes the <code>Vector</code> to establish the
-     * collection. The <code>Vector</code> class implements a growable array
+     * Returns the specified column of this {@code CachedRowSetImpl} object
+     * as a {@code Collection} object.  This method makes a copy of the
+     * column's data and utilitizes the {@code Vector} to establish the
+     * collection. The {@code Vector} class implements a growable array
      * objects allowing the individual components to be accessed using an
      * an integer index similar to that of an array.
      *
-     * @return a <code>Collection</code> object that contains the value(s)
+     * @return a {@code Collection} object that contains the value(s)
      *         stored in the specified column of this
-     *         <code>CachedRowSetImpl</code>
+     *         {@code CachedRowSetImpl}
      *         object
      * @throws SQLException if an error occurs generated the collection; or
      *          an invalid column is provided.
@@ -886,16 +886,16 @@
     }
 
     /**
-     * Returns the specified column of this <code>CachedRowSetImpl</code> object
-     * as a <code>Collection</code> object.  This method makes a copy of the
-     * column's data and utilitizes the <code>Vector</code> to establish the
-     * collection. The <code>Vector</code> class implements a growable array
+     * Returns the specified column of this {@code CachedRowSetImpl} object
+     * as a {@code Collection} object.  This method makes a copy of the
+     * column's data and utilitizes the {@code Vector} to establish the
+     * collection. The {@code Vector} class implements a growable array
      * objects allowing the individual components to be accessed using an
      * an integer index similar to that of an array.
      *
-     * @return a <code>Collection</code> object that contains the value(s)
+     * @return a {@code Collection} object that contains the value(s)
      *         stored in the specified column of this
-     *         <code>CachedRowSetImpl</code>
+     *         {@code CachedRowSetImpl}
      *         object
      * @throws SQLException if an error occurs generated the collection; or
      *          an invalid column is provided.
@@ -914,25 +914,25 @@
 
 
     /**
-     * Returns the <code>SyncProvider</code> implementation being used
-     * with this <code>CachedRowSetImpl</code> implementation rowset.
+     * Returns the {@code SyncProvider} implementation being used
+     * with this {@code CachedRowSetImpl} implementation rowset.
      *
      * @return the SyncProvider used by the rowset. If not provider was
      *          set when the rowset was instantiated, the reference
      *          implementation (default) provider is returned.
      * @throws SQLException if error occurs while return the
-     *          <code>SyncProvider</code> instance.
+     *          {@code SyncProvider} instance.
      */
     public SyncProvider getSyncProvider() throws SQLException {
       throw new UnsupportedOperationException();
     }
 
     /**
-     * Sets the active <code>SyncProvider</code> and attempts to load
-     * load the new provider using the <code>SyncFactory</code> SPI.
+     * Sets the active {@code SyncProvider} and attempts to load
+     * load the new provider using the {@code SyncFactory} SPI.
      *
      * @throws SQLException if an error occurs while resetting the
-     *          <code>SyncProvider</code>.
+     *          {@code SyncProvider}.
      */
     public void setSyncProvider(String providerStr) throws SQLException {
         throw new UnsupportedOperationException();
@@ -953,23 +953,23 @@
     //---------------------------------------------------------------------
 
     /**
-     * Populates this <code>CachedRowSetImpl</code> object with data.
+     * Populates this {@code CachedRowSetImpl} object with data.
      * This form of the method uses the rowset's user, password, and url or
      * data source name properties to create a database
      * connection.  If properties that are needed
      * have not been set, this method will throw an exception.
      * <P>
-     * Another form of this method uses an existing JDBC <code>Connection</code>
+     * Another form of this method uses an existing JDBC {@code Connection}
      * object instead of creating a new one; therefore, it ignores the
      * properties used for establishing a new connection.
      * <P>
      * The query specified by the command property is executed to create a
-     * <code>ResultSet</code> object from which to retrieve data.
+     * {@code ResultSet} object from which to retrieve data.
      * The current contents of the rowset are discarded, and the
      * rowset's metadata is also (re)set.  If there are outstanding updates,
      * they are also ignored.
      * <P>
-     * The method <code>execute</code> closes any database connections that it
+     * The method {@code execute} closes any database connections that it
      * creates.
      *
      * @throws SQLException if an error occurs or the
@@ -987,20 +987,20 @@
 
     /**
      * Moves the cursor down one row from its current position and
-     * returns <code>true</code> if the new cursor position is a
+     * returns {@code true} if the new cursor position is a
      * valid row.
-     * The cursor for a new <code>ResultSet</code> object is initially
+     * The cursor for a new {@code ResultSet} object is initially
      * positioned before the first row. The first call to the method
-     * <code>next</code> moves the cursor to the first row, making it
+     * {@code next} moves the cursor to the first row, making it
      * the current row; the second call makes the second row the
      * current row, and so on.
      *
      * <P>If an input stream from the previous row is open, it is
-     * implicitly closed. The <code>ResultSet</code> object's warning
+     * implicitly closed. The {@code ResultSet} object's warning
      * chain is cleared when a new row is read.
      *
-     * @return <code>true</code> if the new current row is valid;
-     *         <code>false</code> if there are no more rows
+     * @return {@code true} if the new current row is valid;
+     *         {@code false} if there are no more rows
      * @throws SQLException if an error occurs or
      *            the cursor is not positioned in the rowset, before
      *            the first row, or after the last row
@@ -1010,9 +1010,9 @@
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the next
-     * row and returns <code>true</code> if the cursor is still in the rowset;
-     * returns <code>false</code> if the cursor has moved to the position after
+     * Moves this {@code CachedRowSetImpl} object's cursor to the next
+     * row and returns {@code true} if the cursor is still in the rowset;
+     * returns {@code false} if the cursor has moved to the position after
      * the last row.
      * <P>
      * This method handles the cases where the cursor moves to a row that
@@ -1021,15 +1021,15 @@
      * that has been deleted, this method moves the cursor to the next
      * row until the cursor is on a row that has not been deleted.
      * <P>
-     * The method <code>internalNext</code> is called by methods such as
-     * <code>next</code>, <code>absolute</code>, and <code>relative</code>,
+     * The method {@code internalNext} is called by methods such as
+     * {@code next}, {@code absolute}, and {@code relative},
      * and, as its name implies, is only called internally.
      * <p>
      * This is a implementation only method and is not required as a standard
-     * implementation of the <code>CachedRowSet</code> interface.
-     *
-     * @return <code>true</code> if the cursor is on a valid row in this
-     *         rowset; <code>false</code> if it is after the last row
+     * implementation of the {@code CachedRowSet} interface.
+     *
+     * @return {@code true} if the cursor is on a valid row in this
+     *         rowset; {@code false} if it is after the last row
      * @throws SQLException if an error occurs
      */
     protected boolean internalNext() throws SQLException {
@@ -1037,25 +1037,25 @@
     }
 
     /**
-     * Closes this <code>CachedRowSetImpl</code> objecy and releases any resources
+     * Closes this {@code CachedRowSetImpl} objecy and releases any resources
      * it was using.
      *
      * @throws SQLException if an error occurs when releasing any resources in use
-     * by this <code>CachedRowSetImpl</code> object
+     * by this {@code CachedRowSetImpl} object
      */
     public void close() throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Reports whether the last column read was SQL <code>NULL</code>.
-     * Note that you must first call the method <code>getXXX</code>
+     * Reports whether the last column read was SQL {@code NULL}.
+     * Note that you must first call the method {@code getXXX}
      * on a column to try to read its value and then call the method
-     * <code>wasNull</code> to determine whether the value was
-     * SQL <code>NULL</code>.
-     *
-     * @return <code>true</code> if the value in the last column read
-     *         was SQL <code>NULL</code>; <code>false</code> otherwise
+     * {@code wasNull} to determine whether the value was
+     * SQL {@code NULL}.
+     *
+     * @return {@code true} if the value in the last column read
+     *         was SQL {@code NULL}; {@code false} otherwise
      * @throws SQLException if an error occurs
      */
     public boolean wasNull() throws SQLException {
@@ -1064,9 +1064,9 @@
 
     /**
      * Returns the insert row or the current row of this
-     * <code>CachedRowSetImpl</code>object.
-     *
-     * @return the <code>Row</code> object on which this <code>CachedRowSetImpl</code>
+     * {@code CachedRowSetImpl}object.
+     *
+     * @return the {@code Row} object on which this {@code CachedRowSetImpl}
      * objects's cursor is positioned
      */
     protected BaseRow getCurrentRow() {
@@ -1077,7 +1077,7 @@
      * Removes the row on which the cursor is positioned.
      * <p>
      * This is a implementation only method and is not required as a standard
-     * implementation of the <code>CachedRowSet</code> interface.
+     * implementation of the {@code CachedRowSet} interface.
      *
      * @throws SQLException if the cursor is positioned on the insert
      *            row
@@ -1089,20 +1089,20 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>String</code> object.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code String} object.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     *         result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         result is {@code null}
      * @throws SQLException if (1) the given column index is out of bounds,
      * (2) the cursor is not on one of this rowset's rows or its
      * insert row, or (3) the designated column does not store an
-     * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
-     * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, <b>CHAR</b>, <b>VARCHAR</b></code>
-     * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
+     * SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
+     * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT,} <b>{@code CHAR, VARCHAR}</b>
+     * or {@code LONGVARCHAR} value. The bold SQL type designates the
      * recommended return type.
      */
     public String getString(int columnIndex) throws SQLException {
@@ -1111,18 +1111,18 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>boolean</code> value.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code boolean} value.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value as a <code>boolean</code> in the Java progamming language;
-     *        if the value is SQL <code>NULL</code>, the result is <code>false</code>
+     * @return the column value as a {@code boolean} in the Java progamming language;
+     *        if the value is SQL {@code NULL}, the result is {@code false}
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) the designated column does not store an
-     *            SQL <code>BOOLEAN</code> value
+     *            SQL {@code BOOLEAN} value
      * @see #getBoolean(String)
      */
     public boolean getBoolean(int columnIndex) throws SQLException {
@@ -1131,20 +1131,20 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>byte</code> value.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code byte} value.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value as a <code>byte</code> in the Java programming
-     * language; if the value is SQL <code>NULL</code>, the result is <code>0</code>
+     * @return the column value as a {@code byte} in the Java programming
+     * language; if the value is SQL {@code NULL}, the result is {@code 0}
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) the designated column does not store an
-     *            SQL <code><b>TINYINT</b>, SMALLINT, INTEGER, BIGINT, REAL,
-     *            FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
-     *            or <code>LONGVARCHAR</code> value. The bold SQL type
+     *            SQL <b>{@code TINYINT}</b>, {@code SMALLINT, INTEGER,
+     *            BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
+     *            VARCHAR} or {@code LONGVARCHAR} value. The bold SQL type
      *            designates the recommended return type.
      * @see #getByte(String)
      */
@@ -1154,21 +1154,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>short</code> value.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code short} value.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     *         result is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         result is {@code 0}
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>TINYINT, <b>SMALLINT</b>, INTEGER, BIGINT, REAL
-     * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
-     * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
-     * recommended return type.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code TINYINT}, <b>{@code SMALLINT}</b>,
+     *         {@code INTEGER, BIGINT, REAL, FLOAT, DOUBLE,
+     *         DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
+     *         or {@code LONGVARCHAR} value. The bold SQL type
+     *         designates the recommended return type.
      * @see #getShort(String)
      */
     public short getShort(int columnIndex) throws SQLException {
@@ -1177,21 +1178,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as an
-     * <code>int</code> value.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as an
+     * {@code int} value.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     *         result is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         result is {@code 0}
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>TINYINT, SMALLINT, <b>INTEGER</b>, BIGINT, REAL
-     * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
-     * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
-     * recommended return type.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code TINYINT, SMALLINT,} <b>{@code INTEGER}</b>,
+     *         {@code BIGINT, REAL, FLOAT, DOUBLE, DECIMAL,
+     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the
+     *         recommended return type.
      */
     public int getInt(int columnIndex) throws SQLException {
         throw new UnsupportedOperationException();
@@ -1199,21 +1201,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>long</code> value.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code long} value.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     *         result is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         result is {@code 0}
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>TINYINT, SMALLINT, INTEGER, <b>BIGINT</b>, REAL
-     * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
-     * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
-     * recommended return type.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code TINYINT, SMALLINT, INTEGER,}
+     *         <b>{@code BIGINT}</b>, {@code REAL, FLOAT, DOUBLE,
+     *         DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
+     *         or {@code LONGVARCHAR} value. The bold SQL type
+     * designates the recommended return type.
      * @see #getLong(String)
      */
     public long getLong(int columnIndex) throws SQLException {
@@ -1222,21 +1225,21 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>float</code> value.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code float} value.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     *         result is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         result is {@code 0}
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, <b>REAL</b>,
-     * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
-     * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
-     * recommended return type.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT,}
+     *         <b>{@code REAL}</b>, {@code FLOAT, DOUBLE, DECIMAL, NUMERIC,
+     *         BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the recommended return type.
      * @see #getFloat(String)
      */
     public float getFloat(int columnIndex) throws SQLException {
@@ -1245,21 +1248,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>double</code> value.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code double} value.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     *         result is <code>0</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         result is {@code 0}
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
-     * <b>FLOAT</b>, <b>DOUBLE</b>, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
-     * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
-     * recommended return type.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT, REAL,}
+     *         <b>{@code FLOAT, DOUBLE}</b>,
+     *         {@code DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
+     *         or {@code LONGVARCHAR} value. The bold SQL type
+     *         designates the recommended return type.
      * @see #getDouble(String)
      *
      */
@@ -1269,21 +1273,21 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>java.math.BigDecimal</code> object.
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code java.math.BigDecimal} object.
      * <P>
-     * This method is deprecated; use the version of <code>getBigDecimal</code>
+     * This method is deprecated; use the version of {@code getBigDecimal}
      * that does not take a scale parameter and returns a value with full
      * precision.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
      * @param scale the number of digits to the right of the decimal point in the
      *        value returned
      * @return the column value with the specified number of digits to the right
-     *         of the decimal point; if the value is SQL <code>NULL</code>, the
-     *         result is <code>null</code>
+     *         of the decimal point; if the value is SQL {@code NULL}, the
+     *         result is {@code null}
      * @throws SQLException if the given column index is out of bounds,
      *            the cursor is not on a valid row, or this method fails
      * @deprecated
@@ -1295,22 +1299,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>byte</code> array value.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code byte} array value.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value as a <code>byte</code> array in the Java programming
-     * language; if the value is SQL <code>NULL</code>, the
-     * result is <code>null</code>
+     * @return the column value as a {@code byte} array in the Java programming
+     * language; if the value is SQL {@code NULL}, the
+     * result is {@code null}
      *
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code><b>BINARY</b>, <b>VARBINARY</b> or
-     * LONGVARBINARY</code> value.
-     * The bold SQL type designates the recommended return type.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL <b>{@code BINARY, VARBINARY}</b> or
+     *         {@code LONGVARBINARY} value.
+     *         The bold SQL type designates the recommended return type.
      * @see #getBytes(String)
      */
     public byte[] getBytes(int columnIndex) throws SQLException {
@@ -1319,17 +1323,17 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>java.sql.Date</code> object.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code java.sql.Date} object.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value as a <code>java.sql.Data</code> object; if
-     *        the value is SQL <code>NULL</code>, the
-     *        result is <code>null</code>
+     * @return the column value as a {@code java.sql.Data} object; if
+     *        the value is SQL {@code NULL}, the
+     *        result is {@code null}
      * @throws SQLException if the given column index is out of bounds,
-     *            the cursor is not on a valid row, or this method fails
+     *         the cursor is not on a valid row, or this method fails
      */
     public java.sql.Date getDate(int columnIndex) throws SQLException {
         throw new UnsupportedOperationException();
@@ -1337,14 +1341,14 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>java.sql.Time</code> object.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code java.sql.Time} object.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     *         result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         result is {@code null}
      * @throws SQLException if the given column index is out of bounds,
      *         the cursor is not on a valid row, or this method fails
      */
@@ -1354,14 +1358,14 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>java.sql.Timestamp</code> object.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code java.sql.Timestamp} object.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return the column value; if the value is SQL <code>NULL</code>, the
-     *         result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL}, the
+     *         result is {@code null}
      * @throws SQLException if the given column index is out of bounds,
      *            the cursor is not on a valid row, or this method fails
      */
@@ -1371,33 +1375,33 @@
 
     /**
      * Retrieves the value of the designated column in the current row of this
-     * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
+     * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
      * object.
      *
      * A column value can be retrieved as a stream of ASCII characters
      * and then read in chunks from the stream.  This method is particularly
-     * suitable for retrieving large <code>LONGVARCHAR</code> values.  The JDBC
+     * suitable for retrieving large {@code LONGVARCHAR} values.  The JDBC
      * driver will do any necessary conversion from the database format into ASCII.
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
      * call to a get method implicitly closes the stream. . Also, a
-     * stream may return <code>0</code> for <code>CachedRowSetImpl.available()</code>
+     * stream may return {@code 0} for {@code CachedRowSetImpl.available()}
      * whether there is data available or not.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @return a Java input stream that delivers the database column value
      *         as a stream of one-byte ASCII characters.  If the value is SQL
-     *         <code>NULL</code>, the result is <code>null</code>.
+     *         {@code NULL}, the result is {@code null}.
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>CHAR, VARCHAR</code>, <code><b>LONGVARCHAR</b></code>
-     * <code>BINARY, VARBINARY</code> or <code>LONGVARBINARY</code> value. The
-     * bold SQL type designates the recommended return types that this method is
-     * used to retrieve.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code CHAR, VARCHAR}, <b>{@code LONGVARCHAR}</b>,
+     *         {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value. The
+     *         bold SQL type designates the recommended return types
+     *         that this method is used to retrieve.
      * @see #getAsciiStream(String)
      */
     public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException {
@@ -1416,8 +1420,8 @@
      * stream may return 0 for available() whether there is data
      * available or not.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @return a Java input stream that delivers the database column value
      * as a stream of two byte Unicode characters.  If the value is SQL NULL
@@ -1432,30 +1436,30 @@
 
     /**
      * Retrieves the value of the designated column in the current row of this
-     * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
+     * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
      * object.
      * <P>
      * A column value can be retrieved as a stream of uninterpreted bytes
      * and then read in chunks from the stream.  This method is particularly
-     * suitable for retrieving large <code>LONGVARBINARY</code> values.
+     * suitable for retrieving large {@code LONGVARBINARY} values.
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
      * call to a get method implicitly closes the stream. Also, a
-     * stream may return <code>0</code> for
-     * <code>CachedRowSetImpl.available()</code> whether there is data
+     * stream may return {@code 0} for
+     * {@code CachedRowSetImpl.available()} whether there is data
      * available or not.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     * is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     * is {@code 2}, and so on; must be {@code 1} or larger
      * and equal to or less than the number of columns in the rowset
      * @return a Java input stream that delivers the database column value
-     * as a stream of uninterpreted bytes.  If the value is SQL <code>NULL</code>
-     * then the result is <code>null</code>.
+     * as a stream of uninterpreted bytes.  If the value is SQL {@code NULL}
+     * then the result is {@code null}.
      * @throws SQLException if (1) the given column index is out of bounds,
      * (2) the cursor is not on one of this rowset's rows or its
      * insert row, or (3) the designated column does not store an
-     * SQL <code>BINARY, VARBINARY</code> or <code><b>LONGVARBINARY</b></code>
+     * SQL {@code BINARY, VARBINARY} or <b>{@code LONGVARBINARY}</b>.
      * The bold type indicates the SQL type that this method is recommened
      * to retrieve.
      * @see #getBinaryStream(String)
@@ -1472,19 +1476,19 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>String</code> object.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * of the current row as a {@code String} object.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
-     * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, <b>CHAR</b>,
-     * <b>VARCHAR</b></code> or <code>LONGVARCHAR<</code> value. The bold SQL type
-     * designates the recommended return type.
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+     *         BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT,}
+     *         <b>{@code CHAR, VARCHAR}</b> or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the recommended return type.
      */
     public String getString(String columnName) throws SQLException {
         throw new UnsupportedOperationException();
@@ -1492,17 +1496,17 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>boolean</code> value.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value as a <code>boolean</code> in the Java programming
-     *        language; if the value is SQL <code>NULL</code>,
-     *        the result is <code>false</code>
+     * of the current row as a {@code boolean} value.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value as a {@code boolean} in the Java programming
+     *        language; if the value is SQL {@code NULL},
+     *        the result is {@code false}
      * @throws SQLException if (1) the given column name is not the name of
-     *            a column in this rowset, (2) the cursor is not on one of
-     *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>BOOLEAN</code> value
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code BOOLEAN} value
      * @see #getBoolean(int)
      */
     public boolean getBoolean(String columnName) throws SQLException {
@@ -1511,19 +1515,19 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>byte</code> value.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value as a <code>byte</code> in the Java programming
-     * language; if the value is SQL <code>NULL</code>, the result is <code>0</code>
+     * of the current row as a {@code byte} value.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value as a {@code byte} in the Java programming
+     * language; if the value is SQL {@code NULL}, the result is {@code 0}
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code><B>TINYINT</B>, SMALLINT, INTEGER,
-     * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
-     * VARCHAR</code> or <code>LONGVARCHAR</code> value. The
-     * bold type designates the recommended return type
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL <b>{@code TINYINT}</b>,
+     *         {@code SMALLINT, INTEGER, BIGINT, REAL, FLOAT, DOUBLE,
+     *         DECIMAL, NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR}
+     *         value. The bold type designates the recommended return type.
      */
     public byte getByte(String columnName) throws SQLException {
         throw new UnsupportedOperationException();
@@ -1531,19 +1535,20 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>short</code> value.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>0</code>
+     * of the current row as a {@code short} value.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code 0}
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code>TINYINT, <b>SMALLINT</b>, INTEGER
-     * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
-     * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
-     * designates the recommended return type.
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code TINYINT,}
+     *         <b>{@code SMALLINT}</b>, {@code INTEGER,
+     *         BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
+     *         VARCHAR} or {@code LONGVARCHAR} value. The bold SQL type
+     *         designates the recommended return type.
      * @see #getShort(int)
      */
     public short getShort(String columnName) throws SQLException {
@@ -1552,20 +1557,21 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as an <code>int</code> value.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>0</code>
+     * of the current row as an {@code int} value.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code 0}
      * @throws SQLException if (1) the given column name is not the name
-     * of a column in this rowset,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>TINYINT, SMALLINT, <b>INTEGER</b>, BIGINT, REAL
-     * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
-     * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
-     * recommended return type.
+     *         of a column in this rowset,
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code TINYINT, SMALLINT,} <b>{@code INTEGER}</b>,
+     *         {@code BIGINT, REAL, FLOAT, DOUBLE, DECIMAL,
+     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the
+     *         recommended return type.
      */
     public int getInt(String columnName) throws SQLException {
         throw new UnsupportedOperationException();
@@ -1573,19 +1579,19 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>long</code> value.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>0</code>
+     * of the current row as a {@code long} value.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code 0}
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
-     * <b>BIGINT</b>, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
-     * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
-     * designates the recommended return type.
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,}
+     *         <b>{@code BIGINT}</b>, {@code REAL, FLOAT, DOUBLE, DECIMAL,
+     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the recommended return type.
      * @see #getLong(int)
      */
     public long getLong(String columnName) throws SQLException {
@@ -1594,19 +1600,19 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>float</code> value.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>0</code>
+     * of the current row as a {@code float} value.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code 0}
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
-     * BIGINT, <b>REAL</b>, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
-     * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
-     * designates the recommended return type.
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+     *         BIGINT,} <b>{@code REAL}</b>, {@code FLOAT, DOUBLE, DECIMAL,
+     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the recommended return type.
      * @see #getFloat(String)
      */
     public float getFloat(String columnName) throws SQLException {
@@ -1615,20 +1621,20 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row of this <code>CachedRowSetImpl</code> object
-     * as a <code>double</code> value.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>0</code>
+     * of the current row of this {@code CachedRowSetImpl} object
+     * as a {@code double} value.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code 0}
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
-     * BIGINT, REAL, <b>FLOAT</b>, <b>DOUBLE</b>, DECIMAL, NUMERIC, BIT, CHAR,
-     * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
-     * designates the recommended return types.
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+     *         BIGINT, REAL,} <b>{@code FLOAT, DOUBLE}</b>, {@code DECIMAL,
+     *         NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the recommended return types.
      * @see #getDouble(int)
      */
     public double getDouble(String columnName) throws SQLException {
@@ -1637,22 +1643,22 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>java.math.BigDecimal</code> object.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
+     * of the current row as a {@code java.math.BigDecimal} object.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
      * @param scale the number of digits to the right of the decimal point
-     * @return a java.math.BugDecimal object with <code><i>scale</i></code>
-     * number of digits to the right of the decimal point.
+     * @return a java.math.BugDecimal object with <i>{@code scale}</i>
+     *         number of digits to the right of the decimal point.
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
-     * BIGINT, REAL, FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT CHAR,
-     * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
-     * designates the recommended return type that this method is used to
-     * retrieve.
-     * @deprecated Use the <code>getBigDecimal(String columnName)</code>
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+     *         BIGINT, REAL, FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
+     *         {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the recommended return type
+     *         that this method is used to retrieve.
+     * @deprecated Use the {@code getBigDecimal(String columnName)}
      *             method instead
      */
     @Deprecated
@@ -1662,19 +1668,19 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>byte</code> array.
+     * of the current row as a {@code byte} array.
      * The bytes represent the raw values returned by the driver.
      *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value as a <code>byte</code> array in the Java programming
-     * language; if the value is SQL <code>NULL</code>, the result is <code>null</code>
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value as a {@code byte} array in the Java programming
+     *         language; if the value is SQL {@code NULL}, the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code><b>BINARY</b>, <b>VARBINARY</b>
-     * </code> or <code>LONGVARBINARY</code> values
-     * The bold SQL type designates the recommended return type.
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL <b>{@code BINARY, VARBINARY}</b>
+     *         or {@code LONGVARBINARY} values.
+     *         The bold SQL type designates the recommended return type.
      * @see #getBytes(int)
      */
     public byte[] getBytes(String columnName) throws SQLException {
@@ -1683,17 +1689,17 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>java.sql.Date</code> object.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * of the current row as a {@code java.sql.Date} object.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>DATE</code> or
-     *            <code>TIMESTAMP</code> value
+     *            column does not store an SQL {@code DATE} or
+     *            {@code TIMESTAMP} value
      */
     public java.sql.Date getDate(String columnName) throws SQLException {
         throw new UnsupportedOperationException();
@@ -1701,12 +1707,12 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>java.sql.Time</code> object.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * of the current row as a {@code java.sql.Time} object.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if the given column name does not match one of
      *            this rowset's column names or the cursor is not on one of
      *            this rowset's rows or its insert row
@@ -1717,12 +1723,12 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>java.sql.Timestamp</code> object.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * of the current row as a {@code java.sql.Timestamp} object.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if the given column name does not match one of
      *            this rowset's column names or the cursor is not on one of
      *            this rowset's rows or its insert row
@@ -1733,32 +1739,32 @@
 
     /**
      * Retrieves the value of the designated column in the current row of this
-     * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
+     * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
      * object.
      *
      * A column value can be retrieved as a stream of ASCII characters
      * and then read in chunks from the stream. This method is particularly
-     * suitable for retrieving large <code>LONGVARCHAR</code> values. The
-     * <code>SyncProvider</code> will rely on the JDBC driver to do any necessary
+     * suitable for retrieving large {@code LONGVARCHAR} values. The
+     * {@code SyncProvider} will rely on the JDBC driver to do any necessary
      * conversion from the database format into ASCII format.
      *
      * <P><B>Note:</B> All the data in the returned stream must
      * be read prior to getting the value of any other column. The
-     * next call to a <code>getXXX</code> method implicitly closes the stream.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
+     * next call to a {@code getXXX} method implicitly closes the stream.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
      * @return a Java input stream that delivers the database column value
      *         as a stream of one-byte ASCII characters.  If the value is SQL
-     *         <code>NULL</code>, the result is <code>null</code>.
+     *         {@code NULL}, the result is {@code null}.
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>CHAR, VARCHAR</code>, <code><b>LONGVARCHAR</b></code>
-     * <code>BINARY, VARBINARY</code> or <code>LONGVARBINARY</code> value. The
-     * bold SQL type designates the recommended return types that this method is
-     * used to retrieve.
+     *         a column in this rowset
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code CHAR, VARCHAR}, <b>{@code LONGVARCHAR}</b>,
+     *         {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value. The
+     *         bold SQL type designates the recommended return types
+     *         that this method is used to retrieve.
      * @see #getAsciiStream(int)
      */
     public java.io.InputStream getAsciiStream(String columnName) throws SQLException {
@@ -1769,23 +1775,23 @@
     /**
      * A column value can be retrieved as a stream of Unicode characters
      * and then read in chunks from the stream.  This method is particularly
-     * suitable for retrieving large <code>LONGVARCHAR</code> values.
+     * suitable for retrieving large {@code LONGVARCHAR} values.
      * The JDBC driver will do any necessary conversion from the database
      * format into Unicode.
      *
      * <P><B>Note:</B> All the data in the returned stream must
      * be read prior to getting the value of any other column. The
-     * next call to a <code>getXXX</code> method implicitly closes the stream.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
+     * next call to a {@code getXXX} method implicitly closes the stream.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
      * @return a Java input stream that delivers the database column value
      *         as a stream of two-byte Unicode characters.  If the value is
-     *         SQL <code>NULL</code>, the result is <code>null</code>.
+     *         SQL {@code NULL}, the result is {@code null}.
      * @throws SQLException if the given column name does not match one of
      *            this rowset's column names or the cursor is not on one of
      *            this rowset's rows or its insert row
-     * @deprecated use the method <code>getCharacterStream</code> instead
+     * @deprecated use the method {@code getCharacterStream} instead
      */
     @Deprecated
     public java.io.InputStream getUnicodeStream(String columnName) throws SQLException {
@@ -1794,30 +1800,30 @@
 
     /**
      * Retrieves the value of the designated column in the current row of this
-     * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
+     * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
      * object.
      * <P>
      * A column value can be retrieved as a stream of uninterpreted bytes
      * and then read in chunks from the stream.  This method is particularly
-     * suitable for retrieving large <code>LONGVARBINARY</code> values.
+     * suitable for retrieving large {@code LONGVARBINARY} values.
      *
      * <P><B>Note:</B> All the data in the returned stream must be
      * read prior to getting the value of any other column. The next
      * call to a get method implicitly closes the stream. Also, a
-     * stream may return <code>0</code> for <code>CachedRowSetImpl.available()</code>
+     * stream may return {@code 0} for {@code CachedRowSetImpl.available()}
      * whether there is data available or not.
      *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
      * @return a Java input stream that delivers the database column value
      *         as a stream of uninterpreted bytes.  If the value is SQL
-     *         <code>NULL</code>, the result is <code>null</code>.
+     *         {@code NULL}, the result is {@code null}.
      * @throws SQLException if (1) the given column name is unknown,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>BINARY, VARBINARY</code> or <code><b>LONGVARBINARY</b></code>
-     * The bold type indicates the SQL type that this method is recommened
-     * to retrieve.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code BINARY, VARBINARY} or <b>{@code LONGVARBINARY}</b>
+     *         The bold type indicates the SQL type that this method is recommened
+     *         to retrieve.
      * @see #getBinaryStream(int)
      *
      */
@@ -1831,17 +1837,17 @@
     //=====================================================================
 
     /**
-     * The first warning reported by calls on this <code>CachedRowSetImpl</code>
-     * object is returned. Subsequent <code>CachedRowSetImpl</code> warnings will
-     * be chained to this <code>SQLWarning</code>.
+     * The first warning reported by calls on this {@code CachedRowSetImpl}
+     * object is returned. Subsequent {@code CachedRowSetImpl} warnings will
+     * be chained to this {@code SQLWarning}.
      *
      * <P>The warning chain is automatically cleared each time a new
      * row is read.
      *
      * <P><B>Note:</B> This warning chain only covers warnings caused
-     * by <code>ResultSet</code> methods.  Any warning caused by statement
+     * by {@code ResultSet} methods.  Any warning caused by statement
      * methods (such as reading OUT parameters) will be chained on the
-     * <code>Statement</code> object.
+     * {@code Statement} object.
      *
      * @return the first SQLWarning or null
      */
@@ -1850,10 +1856,10 @@
     }
 
     /**
-     * Clears all the warnings reporeted for the <code>CachedRowSetImpl</code>
-     * object. After a call to this method, the <code>getWarnings</code> method
-     * returns <code>null</code> until a new warning is reported for this
-     * <code>CachedRowSetImpl</code> object.
+     * Clears all the warnings reporeted for the {@code CachedRowSetImpl}
+     * object. After a call to this method, the {@code getWarnings} method
+     * returns {@code null} until a new warning is reported for this
+     * {@code CachedRowSetImpl} object.
      */
     public void clearWarnings() {
        throw new UnsupportedOperationException();
@@ -1861,25 +1867,25 @@
 
     /**
      * Retrieves the name of the SQL cursor used by this
-     * <code>CachedRowSetImpl</code> object.
+     * {@code CachedRowSetImpl} object.
      *
      * <P>In SQL, a result table is retrieved through a cursor that is
-     * named. The current row of a <code>ResultSet</code> can be updated or deleted
+     * named. The current row of a {@code ResultSet} can be updated or deleted
      * using a positioned update/delete statement that references the
      * cursor name. To ensure that the cursor has the proper isolation
-     * level to support an update operation, the cursor's <code>SELECT</code>
-     * statement should be of the form <code>select for update</code>.
-     * If the <code>for update</code> clause
+     * level to support an update operation, the cursor's {@code SELECT}
+     * statement should be of the form {@code select for update}.
+     * If the {@code for update} clause
      * is omitted, positioned updates may fail.
      *
      * <P>JDBC supports this SQL feature by providing the name of the
-     * SQL cursor used by a <code>ResultSet</code> object. The current row
+     * SQL cursor used by a {@code ResultSet} object. The current row
      * of a result set is also the current row of this SQL cursor.
      *
      * <P><B>Note:</B> If positioned updates are not supported, an
-     * <code>SQLException</code> is thrown.
-     *
-     * @return the SQL cursor name for this <code>CachedRowSetImpl</code> object's
+     * {@code SQLException} is thrown.
+     *
+     * @return the SQL cursor name for this {@code CachedRowSetImpl} object's
      *         cursor
      * @throws SQLException if an error occurs
      */
@@ -1888,12 +1894,12 @@
     }
 
     /**
-     * Retrieves a <code>ResultSetMetaData</code> object instance that
-     * contains information about the <code>CachedRowSet</code> object.
+     * Retrieves a {@code ResultSetMetaData} object instance that
+     * contains information about the {@code CachedRowSet} object.
      * However, applications should cast the returned object to a
-     * <code>RowSetMetaData</code> interface implementation. In the
+     * {@code RowSetMetaData} interface implementation. In the
      * reference implementation, this cast can be done on the
-     * <code>RowSetMetaDataImpl</code> class.
+     * {@code RowSetMetaDataImpl} class.
      * <P>
      * For example:
      * <pre>
@@ -1907,10 +1913,10 @@
      * crs.setMetaData(metaData);
      * </pre>
      *
-     * @return the <code>ResultSetMetaData</code> object that describes this
-     *         <code>CachedRowSetImpl</code> object's columns
+     * @return the {@code ResultSetMetaData} object that describes this
+     *         {@code CachedRowSetImpl} object's columns
      * @throws SQLException if an error occurs in generating the RowSet
-     * meta data; or if the <code>CachedRowSetImpl</code> is empty.
+     * meta data; or if the {@code CachedRowSetImpl} is empty.
      * @see javax.sql.RowSetMetaData
      */
     public ResultSetMetaData getMetaData() throws SQLException {
@@ -1920,10 +1926,10 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as an
-     * <code>Object</code> value.
+     * of this {@code CachedRowSetImpl} object as an
+     * {@code Object} value.
      * <P>
-     * The type of the <code>Object</code> will be the default
+     * The type of the {@code Object} will be the default
      * Java object type corresponding to the column's SQL type,
      * following the mapping for built-in types specified in the JDBC 3.0
      * specification.
@@ -1931,23 +1937,23 @@
      * This method may also be used to read datatabase-specific
      * abstract data types.
      * <P>
-     * This implementation of the method <code>getObject</code> extends its
+     * This implementation of the method {@code getObject} extends its
      * behavior so that it gets the attributes of an SQL structured type
-     * as an array of <code>Object</code> values.  This method also custom
+     * as an array of {@code Object} values.  This method also custom
      * maps SQL user-defined types to classes in the Java programming language.
      * When the specified column contains
      * a structured or distinct value, the behavior of this method is as
-     * if it were a call to the method <code>getObject(columnIndex,
-     * this.getStatement().getConnection().getTypeMap())</code>.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * if it were a call to the method {@code getObject(columnIndex,
+     * this.getStatement().getConnection().getTypeMap())}.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return a <code>java.lang.Object</code> holding the column value;
-     *         if the value is SQL <code>NULL</code>, the result is <code>null</code>
+     * @return a {@code java.lang.Object} holding the column value;
+     *         if the value is SQL {@code NULL}, the result is {@code null}
      * @throws SQLException if the given column index is out of bounds,
      *            the cursor is not on a valid row, or there is a problem getting
-     *            the <code>Class</code> object for a custom mapping
+     *            the {@code Class} object for a custom mapping
      * @see #getObject(String)
      */
     public Object getObject(int columnIndex) throws SQLException {
@@ -1956,10 +1962,10 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as an
-     * <code>Object</code> value.
+     * of this {@code CachedRowSetImpl} object as an
+     * {@code Object} value.
      * <P>
-     * The type of the <code>Object</code> will be the default
+     * The type of the {@code Object} will be the default
      * Java object type corresponding to the column's SQL type,
      * following the mapping for built-in types specified in the JDBC 3.0
      * specification.
@@ -1967,23 +1973,23 @@
      * This method may also be used to read datatabase-specific
      * abstract data types.
      * <P>
-     * This implementation of the method <code>getObject</code> extends its
+     * This implementation of the method {@code getObject} extends its
      * behavior so that it gets the attributes of an SQL structured type
-     * as an array of <code>Object</code> values.  This method also custom
+     * as an array of {@code Object} values.  This method also custom
      * maps SQL user-defined types to classes
      * in the Java programming language. When the specified column contains
      * a structured or distinct value, the behavior of this method is as
-     * if it were a call to the method <code>getObject(columnIndex,
-     * this.getStatement().getConnection().getTypeMap())</code>.
-     *
-     * @param columnName a <code>String</code> object that must match the
+     * if it were a call to the method {@code getObject(columnIndex,
+     * this.getStatement().getConnection().getTypeMap())}.
+     *
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @return a <code>java.lang.Object</code> holding the column value;
-     *         if the value is SQL <code>NULL</code>, the result is <code>null</code>
+     * @return a {@code java.lang.Object} holding the column value;
+     *         if the value is SQL {@code NULL}, the result is {@code null}
      * @throws SQLException if (1) the given column name does not match one of
      *            this rowset's column names, (2) the cursor is not
      *            on a valid row, or (3) there is a problem getting
-     *            the <code>Class</code> object for a custom mapping
+     *            the {@code Class} object for a custom mapping
      * @see #getObject(int)
      */
     public Object getObject(String columnName) throws SQLException {
@@ -1993,10 +1999,10 @@
     //----------------------------------------------------------------
 
     /**
-     * Maps the given column name for one of this <code>CachedRowSetImpl</code>
+     * Maps the given column name for one of this {@code CachedRowSetImpl}
      * object's columns to its column number.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @return the column index of the given column name
      * @throws SQLException if the given column name does not match one
@@ -2014,25 +2020,25 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>java.io.Reader</code> object.
+     * of the current row as a {@code java.io.Reader} object.
      *
      * <P><B>Note:</B> All the data in the returned stream must
      * be read prior to getting the value of any other column. The
-     * next call to a <code>getXXX</code> method implicitly closes the stream.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * next call to a {@code getXXX} method implicitly closes the stream.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
      * @return a Java character stream that delivers the database column value
      * as a stream of two-byte unicode characters in a
-     * <code>java.io.Reader</code> object.  If the value is
-     * SQL <code>NULL</code>, the result is <code>null</code>.
+     * {@code java.io.Reader} object.  If the value is
+     * SQL {@code NULL}, the result is {@code null}.
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>CHAR, VARCHAR, <b>LONGVARCHAR</b>, BINARY, VARBINARY</code> or
-     * <code>LONGVARBINARY</code> value.
-     * The bold SQL type designates the recommended return type.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code CHAR, VARCHAR,} <b>{@code LONGVARCHAR}</b>,
+     *         {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value.
+     *         The bold SQL type designates the recommended return type.
      * @see #getCharacterStream(String)
      */
     public java.io.Reader getCharacterStream(int columnIndex) throws SQLException{
@@ -2041,23 +2047,24 @@
 
     /**
      * Retrieves the value stored in the designated column
-     * of the current row as a <code>java.io.Reader</code> object.
+     * of the current row as a {@code java.io.Reader} object.
      *
      * <P><B>Note:</B> All the data in the returned stream must
      * be read prior to getting the value of any other column. The
-     * next call to a <code>getXXX</code> method implicitly closes the stream.
-     *
-     * @param columnName a <code>String</code> object giving the SQL name of
-     *        a column in this <code>CachedRowSetImpl</code> object
+     * next call to a {@code getXXX} method implicitly closes the stream.
+     *
+     * @param columnName a {@code String} object giving the SQL name of
+     *        a column in this {@code CachedRowSetImpl} object
      * @return a Java input stream that delivers the database column value
      *         as a stream of two-byte Unicode characters.  If the value is
-     *         SQL <code>NULL</code>, the result is <code>null</code>.
+     *         SQL {@code NULL}, the result is {@code null}.
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code>CHAR, VARCHAR, <b>LONGVARCHAR</b>,
-     * BINARY, VARYBINARY</code> or <code>LONGVARBINARY</code> value.
-     * The bold SQL type designates the recommended return type.
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code CHAR, VARCHAR,}
+     *         <b>{@code LONGVARCHAR}</b>,
+     *         {@code BINARY, VARYBINARY} or {@code LONGVARBINARY} value.
+     *         The bold SQL type designates the recommended return type.
      */
     public java.io.Reader getCharacterStream(String columnName) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2065,21 +2072,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>java.math.BigDecimal</code> object.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code java.math.BigDecimal} object.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @return a <code>java.math.BigDecimal</code> value with full precision;
-     *         if the value is SQL <code>NULL</code>, the result is <code>null</code>
+     * @return a {@code java.math.BigDecimal} value with full precision;
+     *         if the value is SQL {@code NULL}, the result is {@code null}
      * @throws SQLException if (1) the given column index is out of bounds,
-     * (2) the cursor is not on one of this rowset's rows or its
-     * insert row, or (3) the designated column does not store an
-     * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
-     * FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT, CHAR, VARCHAR</code>
-     * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
-     * recommended return types that this method is used to retrieve.
+     *         (2) the cursor is not on one of this rowset's rows or its
+     *         insert row, or (3) the designated column does not store an
+     *         SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
+     *         FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
+     *         {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the
+     *         recommended return types that this method is used to retrieve.
      * @see #getBigDecimal(String)
      */
     public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
@@ -2088,21 +2096,21 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>java.math.BigDecimal</code> object.
-     *
-     * @param columnName a <code>String</code> object that must match the
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code java.math.BigDecimal} object.
+     *
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @return a <code>java.math.BigDecimal</code> value with full precision;
-     *         if the value is SQL <code>NULL</code>, the result is <code>null</code>
+     * @return a {@code java.math.BigDecimal} value with full precision;
+     *         if the value is SQL {@code NULL}, the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
-     * a column in this rowset, (2) the cursor is not on one of
-     * this rowset's rows or its insert row, or (3) the designated
-     * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
-     * BIGINT, REAL, FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT CHAR,
-     * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
-     * designates the recommended return type that this method is used to
-     * retrieve
+     *         a column in this rowset, (2) the cursor is not on one of
+     *         this rowset's rows or its insert row, or (3) the designated
+     *         column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+     *         BIGINT, REAL, FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
+     *         {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+     *         The bold SQL type designates the recommended return type
+     *         that this method is used to retrieve.
      * @see #getBigDecimal(int)
      */
     public BigDecimal getBigDecimal(String columnName) throws SQLException {
@@ -2114,7 +2122,7 @@
     //---------------------------------------------------------------------
 
     /**
-     * Returns the number of rows in this <code>CachedRowSetImpl</code> object.
+     * Returns the number of rows in this {@code CachedRowSetImpl} object.
      *
      * @return number of rows in the rowset
      */
@@ -2124,10 +2132,10 @@
 
     /**
      * Indicates whether the cursor is before the first row in this
-     * <code>CachedRowSetImpl</code> object.
-     *
-     * @return <code>true</code> if the cursor is before the first row;
-     *         <code>false</code> otherwise or if the rowset contains no rows
+     * {@code CachedRowSetImpl} object.
+     *
+     * @return {@code true} if the cursor is before the first row;
+     *         {@code false} otherwise or if the rowset contains no rows
      * @throws SQLException if an error occurs
      */
     public boolean isBeforeFirst() throws SQLException {
@@ -2136,10 +2144,10 @@
 
     /**
      * Indicates whether the cursor is after the last row in this
-     * <code>CachedRowSetImpl</code> object.
-     *
-     * @return <code>true</code> if the cursor is after the last row;
-     *         <code>false</code> otherwise or if the rowset contains no rows
+     * {@code CachedRowSetImpl} object.
+     *
+     * @return {@code true} if the cursor is after the last row;
+     *         {@code false} otherwise or if the rowset contains no rows
      * @throws SQLException if an error occurs
      */
     public boolean isAfterLast() throws SQLException {
@@ -2148,10 +2156,10 @@
 
     /**
      * Indicates whether the cursor is on the first row in this
-     * <code>CachedRowSetImpl</code> object.
-     *
-     * @return <code>true</code> if the cursor is on the first row;
-     *         <code>false</code> otherwise or if the rowset contains no rows
+     * {@code CachedRowSetImpl} object.
+     *
+     * @return {@code true} if the cursor is on the first row;
+     *         {@code false} otherwise or if the rowset contains no rows
      * @throws SQLException if an error occurs
      */
     public boolean isFirst() throws SQLException {
@@ -2160,14 +2168,14 @@
 
     /**
      * Indicates whether the cursor is on the last row in this
-     * <code>CachedRowSetImpl</code> object.
+     * {@code CachedRowSetImpl} object.
      * <P>
-     * Note: Calling the method <code>isLast</code> may be expensive
+     * Note: Calling the method {@code isLast} may be expensive
      * because the JDBC driver might need to fetch ahead one row in order
      * to determine whether the current row is the last row in this rowset.
      *
-     * @return <code>true</code> if the cursor is on the last row;
-     *         <code>false</code> otherwise or if this rowset contains no rows
+     * @return {@code true} if the cursor is on the last row;
+     *         {@code false} otherwise or if this rowset contains no rows
      * @throws SQLException if an error occurs
      */
     public boolean isLast() throws SQLException {
@@ -2175,19 +2183,19 @@
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the front of
+     * Moves this {@code CachedRowSetImpl} object's cursor to the front of
      * the rowset, just before the first row. This method has no effect if
      * this rowset contains no rows.
      *
      * @throws SQLException if an error occurs or the type of this rowset
-     *            is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+     *            is {@code ResultSet.TYPE_FORWARD_ONLY}
      */
     public void beforeFirst() throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the end of
+     * Moves this {@code CachedRowSetImpl} object's cursor to the end of
      * the rowset, just after the last row. This method has no effect if
      * this rowset contains no rows.
      *
@@ -2198,34 +2206,34 @@
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the first row
-     * and returns <code>true</code> if the operation was successful.  This
+     * Moves this {@code CachedRowSetImpl} object's cursor to the first row
+     * and returns {@code true} if the operation was successful.  This
      * method also notifies registered listeners that the cursor has moved.
      *
-     * @return <code>true</code> if the cursor is on a valid row;
-     *         <code>false</code> otherwise or if there are no rows in this
-     *         <code>CachedRowSetImpl</code> object
+     * @return {@code true} if the cursor is on a valid row;
+     *         {@code false} otherwise or if there are no rows in this
+     *         {@code CachedRowSetImpl} object
      * @throws SQLException if the type of this rowset
-     *            is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+     *            is {@code ResultSet.TYPE_FORWARD_ONLY}
      */
     public boolean first() throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the first
-     * row and returns <code>true</code> if the operation is successful.
+     * Moves this {@code CachedRowSetImpl} object's cursor to the first
+     * row and returns {@code true} if the operation is successful.
      * <P>
-     * This method is called internally by the methods <code>first</code>,
-     * <code>isFirst</code>, and <code>absolute</code>.
-     * It in turn calls the method <code>internalNext</code> in order to
+     * This method is called internally by the methods {@code first},
+     * {@code isFirst}, and {@code absolute}.
+     * It in turn calls the method {@code internalNext} in order to
      * handle the case where the first row is a deleted row that is not visible.
      * <p>
      * This is a implementation only method and is not required as a standard
-     * implementation of the <code>CachedRowSet</code> interface.
-     *
-     * @return <code>true</code> if the cursor moved to the first row;
-     *         <code>false</code> otherwise
+     * implementation of the {@code CachedRowSet} interface.
+     *
+     * @return {@code true} if the cursor moved to the first row;
+     *         {@code false} otherwise
      * @throws SQLException if an error occurs
      */
     protected boolean internalFirst() throws SQLException {
@@ -2233,35 +2241,35 @@
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the last row
-     * and returns <code>true</code> if the operation was successful.  This
+     * Moves this {@code CachedRowSetImpl} object's cursor to the last row
+     * and returns {@code true} if the operation was successful.  This
      * method also notifies registered listeners that the cursor has moved.
      *
-     * @return <code>true</code> if the cursor is on a valid row;
-     *         <code>false</code> otherwise or if there are no rows in this
-     *         <code>CachedRowSetImpl</code> object
+     * @return {@code true} if the cursor is on a valid row;
+     *         {@code false} otherwise or if there are no rows in this
+     *         {@code CachedRowSetImpl} object
      * @throws SQLException if the type of this rowset
-     *            is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+     *            is {@code ResultSet.TYPE_FORWARD_ONLY}
      */
     public boolean last() throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the last
-     * row and returns <code>true</code> if the operation is successful.
+     * Moves this {@code CachedRowSetImpl} object's cursor to the last
+     * row and returns {@code true} if the operation is successful.
      * <P>
-     * This method is called internally by the method <code>last</code>
+     * This method is called internally by the method {@code last}
      * when rows have been deleted and the deletions are not visible.
-     * The method <code>internalLast</code> handles the case where the
+     * The method {@code internalLast} handles the case where the
      * last row is a deleted row that is not visible by in turn calling
-     * the method <code>internalPrevious</code>.
+     * the method {@code internalPrevious}.
      * <p>
      * This is a implementation only method and is not required as a standard
-     * implementation of the <code>CachedRowSet</code> interface.
-     *
-     * @return <code>true</code> if the cursor moved to the last row;
-     *         <code>false</code> otherwise
+     * implementation of the {@code CachedRowSet} interface.
+     *
+     * @return {@code true} if the cursor moved to the last row;
+     *         {@code false} otherwise
      * @throws SQLException if an error occurs
      */
     protected boolean internalLast() throws SQLException {
@@ -2269,12 +2277,12 @@
     }
 
     /**
-     * Returns the number of the current row in this <code>CachedRowSetImpl</code>
+     * Returns the number of the current row in this {@code CachedRowSetImpl}
      * object. The first row is number 1, the second number 2, and so on.
      *
-     * @return the number of the current row;  <code>0</code> if there is no
+     * @return the number of the current row;  {@code 0} if there is no
      *         current row
-     * @throws SQLException if an error occurs; or if the <code>CacheRowSetImpl</code>
+     * @throws SQLException if an error occurs; or if the {@code CacheRowSetImpl}
      *         is empty
      */
     public int getRow() throws SQLException {
@@ -2282,51 +2290,51 @@
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the row number
+     * Moves this {@code CachedRowSetImpl} object's cursor to the row number
      * specified.
      *
      * <p>If the number is positive, the cursor moves to an absolute row with
      * respect to the beginning of the rowset.  The first row is row 1, the second
      * is row 2, and so on.  For example, the following command, in which
-     * <code>crs</code> is a <code>CachedRowSetImpl</code> object, moves the cursor
+     * {@code crs} is a {@code CachedRowSetImpl} object, moves the cursor
      * to the fourth row, starting from the beginning of the rowset.
-     * <PRE><code>
+     * <PRE>{@code
      *
      *    crs.absolute(4);
      *
-     * </code> </PRE>
+     * }</PRE>
      * <P>
      * If the number is negative, the cursor moves to an absolute row position
      * with respect to the end of the rowset.  For example, calling
-     * <code>absolute(-1)</code> positions the cursor on the last row,
-     * <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
-     * If the <code>CachedRowSetImpl</code> object <code>crs</code> has five rows,
+     * {@code absolute(-1)} positions the cursor on the last row,
+     * {@code absolute(-2)} moves it on the next-to-last row, and so on.
+     * If the {@code CachedRowSetImpl} object {@code crs} has five rows,
      * the following command moves the cursor to the fourth-to-last row, which
      * in the case of a  rowset with five rows, is also the second row, counting
      * from the beginning.
-     * <PRE><code>
+     * <PRE>{@code
      *
      *    crs.absolute(-4);
      *
-     * </code> </PRE>
+     * }</PRE>
      *
      * If the number specified is larger than the number of rows, the cursor
      * will move to the position after the last row. If the number specified
      * would move the cursor one or more rows before the first row, the cursor
      * moves to the position before the first row.
      * <P>
-     * Note: Calling <code>absolute(1)</code> is the same as calling the
-     * method <code>first()</code>.  Calling <code>absolute(-1)</code> is the
-     * same as calling <code>last()</code>.
+     * Note: Calling {@code absolute(1)} is the same as calling the
+     * method {@code first()}.  Calling {@code absolute(-1)} is the
+     * same as calling {@code last()}.
      *
      * @param row a positive number to indicate the row, starting row numbering from
-     *        the first row, which is <code>1</code>; a negative number to indicate
+     *        the first row, which is {@code 1}; a negative number to indicate
      *        the row, starting row numbering from the last row, which is
-     *        <code>-1</code>; it must not be <code>0</code>
-     * @return <code>true</code> if the cursor is on the rowset; <code>false</code>
+     *        {@code -1}; it must not be {@code 0}
+     * @return {@code true} if the cursor is on the rowset; {@code false}
      *         otherwise
-     * @throws SQLException if the given cursor position is <code>0</code> or the
-     *            type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+     * @throws SQLException if the given cursor position is {@code 0} or the
+     *            type of this rowset is {@code ResultSet.TYPE_FORWARD_ONLY}
      */
     public boolean absolute( int row ) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2340,80 +2348,80 @@
      * If the number is positive, the cursor moves the specified number of
      * rows toward the end of the rowset, starting at the current row.
      * For example, the following command, in which
-     * <code>crs</code> is a <code>CachedRowSetImpl</code> object with 100 rows,
+     * {@code crs} is a {@code CachedRowSetImpl} object with 100 rows,
      * moves the cursor forward four rows from the current row.  If the
      * current row is 50, the cursor would move to row 54.
-     * <PRE><code>
+     * <PRE>{@code
      *
      *    crs.relative(4);
      *
-     * </code> </PRE>
+     * }</PRE>
      * <P>
      * If the number is negative, the cursor moves back toward the beginning
      * the specified number of rows, starting at the current row.
      * For example, calling the method
-     * <code>absolute(-1)</code> positions the cursor on the last row,
-     * <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
-     * If the <code>CachedRowSetImpl</code> object <code>crs</code> has five rows,
+     * {@code absolute(-1)} positions the cursor on the last row,
+     * {@code absolute(-2)} moves it on the next-to-last row, and so on.
+     * If the {@code CachedRowSetImpl} object {@code crs} has five rows,
      * the following command moves the cursor to the fourth-to-last row, which
      * in the case of a  rowset with five rows, is also the second row
      * from the beginning.
-     * <PRE><code>
+     * <PRE>{@code
      *
      *    crs.absolute(-4);
      *
-     * </code> </PRE>
+     * }</PRE>
      *
      * If the number specified is larger than the number of rows, the cursor
      * will move to the position after the last row. If the number specified
      * would move the cursor one or more rows before the first row, the cursor
      * moves to the position before the first row. In both cases, this method
-     * throws an <code>SQLException</code>.
+     * throws an {@code SQLException}.
      * <P>
-     * Note: Calling <code>absolute(1)</code> is the same as calling the
-     * method <code>first()</code>.  Calling <code>absolute(-1)</code> is the
-     * same as calling <code>last()</code>.  Calling <code>relative(0)</code>
+     * Note: Calling {@code absolute(1)} is the same as calling the
+     * method {@code first()}.  Calling {@code absolute(-1)} is the
+     * same as calling {@code last()}.  Calling {@code relative(0)}
      * is valid, but it does not change the cursor position.
      *
-     * @param rows an <code>int</code> indicating the number of rows to move
+     * @param rows an {@code int} indicating the number of rows to move
      *             the cursor, starting at the current row; a positive number
      *             moves the cursor forward; a negative number moves the cursor
      *             backward; must not move the cursor past the valid
      *             rows
-     * @return <code>true</code> if the cursor is on a row in this
-     *         <code>CachedRowSetImpl</code> object; <code>false</code>
+     * @return {@code true} if the cursor is on a row in this
+     *         {@code CachedRowSetImpl} object; {@code false}
      *         otherwise
      * @throws SQLException if there are no rows in this rowset, the cursor is
      *         positioned either before the first row or after the last row, or
-     *         the rowset is type <code>ResultSet.TYPE_FORWARD_ONLY</code>
+     *         the rowset is type {@code ResultSet.TYPE_FORWARD_ONLY}
      */
     public boolean relative(int rows) throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Moves this <code>CachedRowSetImpl</code> object's cursor to the
-     * previous row and returns <code>true</code> if the cursor is on
-     * a valid row or <code>false</code> if it is not.
+     * Moves this {@code CachedRowSetImpl} object's cursor to the
+     * previous row and returns {@code true} if the cursor is on
+     * a valid row or {@code false} if it is not.
      * This method also notifies all listeners registered with this
-     * <code>CachedRowSetImpl</code> object that its cursor has moved.
+     * {@code CachedRowSetImpl} object that its cursor has moved.
      * <P>
-     * Note: calling the method <code>previous()</code> is not the same
-     * as calling the method <code>relative(-1)</code>.  This is true
-     * because it is possible to call <code>previous()</code> from the insert
+     * Note: calling the method {@code previous()} is not the same
+     * as calling the method {@code relative(-1)}.  This is true
+     * because it is possible to call {@code previous()} from the insert
      * row, from after the last row, or from the current row, whereas
-     * <code>relative</code> may only be called from the current row.
+     * {@code relative} may only be called from the current row.
      * <P>
-     * The method <code>previous</code> may used in a <code>while</code>
+     * The method {@code previous} may used in a {@code while}
      * loop to iterate through a rowset starting after the last row
-     * and moving toward the beginning. The loop ends when <code>previous</code>
-     * returns <code>false</code>, meaning that there are no more rows.
+     * and moving toward the beginning. The loop ends when {@code previous}
+     * returns {@code false}, meaning that there are no more rows.
      * For example, the following code fragment retrieves all the data in
-     * the <code>CachedRowSetImpl</code> object <code>crs</code>, which has
+     * the {@code CachedRowSetImpl} object {@code crs}, which has
      * three columns.  Note that the cursor must initially be positioned
      * after the last row so that the first call to the method
-     * <code>previous</code> places the cursor on the last line.
-     * <PRE> <code>
+     * {@code previous} places the cursor on the last line.
+     * <PRE>{@code
      *
      *     crs.afterLast();
      *     while (previous()) {
@@ -2423,33 +2431,33 @@
      *         System.out.println(name + "   " + age + "   " + ssn);
      *     }
      *
-     * </code> </PRE>
-     * This method throws an <code>SQLException</code> if the cursor is not
+     * }</PRE>
+     * This method throws an {@code SQLException} if the cursor is not
      * on a row in the rowset, before the first row, or after the last row.
      *
-     * @return <code>true</code> if the cursor is on a valid row;
-     *         <code>false</code> if it is before the first row or after the
+     * @return {@code true} if the cursor is on a valid row;
+     *         {@code false} if it is before the first row or after the
      *         last row
      * @throws SQLException if the cursor is not on a valid position or the
-     *           type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+     *           type of this rowset is {@code ResultSet.TYPE_FORWARD_ONLY}
      */
     public boolean previous() throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Moves the cursor to the previous row in this <code>CachedRowSetImpl</code>
+     * Moves the cursor to the previous row in this {@code CachedRowSetImpl}
      * object, skipping past deleted rows that are not visible; returns
-     * <code>true</code> if the cursor is on a row in this rowset and
-     * <code>false</code> when the cursor goes before the first row.
+     * {@code true} if the cursor is on a row in this rowset and
+     * {@code false} when the cursor goes before the first row.
      * <P>
-     * This method is called internally by the method <code>previous</code>.
+     * This method is called internally by the method {@code previous}.
      * <P>
      * This is a implementation only method and is not required as a standard
-     * implementation of the <code>CachedRowSet</code> interface.
-     *
-     * @return <code>true</code> if the cursor is on a row in this rowset;
-     *         <code>false</code> when the cursor reaches the position before
+     * implementation of the {@code CachedRowSet} interface.
+     *
+     * @return {@code true} if the cursor is on a row in this rowset;
+     *         {@code false} when the cursor reaches the position before
      *         the first row
      * @throws SQLException if an error occurs
      */
@@ -2463,14 +2471,14 @@
     //---------------------------------------------------------------------
 
     /**
-     * Indicates whether the current row of this <code>CachedRowSetImpl</code>
+     * Indicates whether the current row of this {@code CachedRowSetImpl}
      * object has been updated.  The value returned
-     * depends on whether this rowset can detect updates: <code>false</code>
+     * depends on whether this rowset can detect updates: {@code false}
      * will always be returned if it does not detect updates.
      *
-     * @return <code>true</code> if the row has been visibly updated
+     * @return {@code true} if the row has been visibly updated
      *         by the owner or another and updates are detected;
-     *         <code>false</code> otherwise
+     *         {@code false} otherwise
      * @throws SQLException if the cursor is on the insert row or not
      *            not on a valid row
      *
@@ -2482,13 +2490,13 @@
 
     /**
      * Indicates whether the designated column of the current row of
-     * this <code>CachedRowSetImpl</code> object has been updated. The
+     * this {@code CachedRowSetImpl} object has been updated. The
      * value returned depends on whether this rowset can detcted updates:
-     * <code>false</code> will always be returned if it does not detect updates.
+     * {@code false} will always be returned if it does not detect updates.
      *
      * @param idx the index identifier of the column that may be have been updated.
-     * @return <code>true</code> is the designated column has been updated
-     * and the rowset detects updates; <code>false</code> if the rowset has not
+     * @return {@code true} is the designated column has been updated
+     * and the rowset detects updates; {@code false} if the rowset has not
      * been updated or the rowset does not detect updates
      * @throws SQLException if the cursor is on the insert row or not
      *          on a valid row
@@ -2500,14 +2508,14 @@
 
     /**
      * Indicates whether the designated column of the current row of
-     * this <code>CachedRowSetImpl</code> object has been updated. The
+     * this {@code CachedRowSetImpl} object has been updated. The
      * value returned depends on whether this rowset can detcted updates:
-     * <code>false</code> will always be returned if it does not detect updates.
-     *
-     * @param columnName the <code>String</code> column name column that may be have
+     * {@code false} will always be returned if it does not detect updates.
+     *
+     * @param columnName the {@code String} column name column that may be have
      * been updated.
-     * @return <code>true</code> is the designated column has been updated
-     * and the rowset detects updates; <code>false</code> if the rowset has not
+     * @return {@code true} is the designated column has been updated
+     * and the rowset detects updates; {@code false} if the rowset has not
      * been updated or the rowset does not detect updates
      * @throws SQLException if the cursor is on the insert row or not
      *          on a valid row
@@ -2521,8 +2529,8 @@
      * Indicates whether the current row has been inserted.  The value returned
      * depends on whether or not the rowset can detect visible inserts.
      *
-     * @return <code>true</code> if a row has been inserted and inserts are detected;
-     *         <code>false</code> otherwise
+     * @return {@code true} if a row has been inserted and inserts are detected;
+     *         {@code false} otherwise
      * @throws SQLException if the cursor is on the insert row or not
      *            not on a valid row
      *
@@ -2536,12 +2544,12 @@
      * Indicates whether the current row has been deleted.  A deleted row
      * may leave a visible "hole" in a rowset.  This method can be used to
      * detect such holes if the rowset can detect deletions. This method
-     * will always return <code>false</code> if this rowset cannot detect
+     * will always return {@code false} if this rowset cannot detect
      * deletions.
      *
-     * @return <code>true</code> if (1)the current row is blank, indicating that
+     * @return {@code true} if (1)the current row is blank, indicating that
      *         the row has been deleted, and (2)deletions are detected;
-     *         <code>false</code> otherwise
+     *         {@code false} otherwise
      * @throws SQLException if the cursor is on a valid row in this rowset
      * @see DatabaseMetaData#deletesAreDetected
      */
@@ -2551,8 +2559,8 @@
 
     /**
      * Sets the designated nullable column in the current row or the
-     * insert row of this <code>CachedRowSetImpl</code> object with
-     * <code>null</code> value.
+     * insert row of this {@code CachedRowSetImpl} object with
+     * {@code null} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset; however, another method must be called to complete
@@ -2565,15 +2573,15 @@
      * <P>
      * In order to propagate updates in this rowset to the underlying
      * data source, an application must call the method {@link #acceptChanges}
-     * after it calls either <code>updateRow</code> or <code>insertRow</code>.
-     *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * after it calls either {@code updateRow} or {@code insertRow}.
+     *
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateNull(int columnIndex) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2581,8 +2589,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>boolean</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code boolean} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -2593,14 +2601,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBoolean(int columnIndex, boolean x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2608,8 +2616,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>byte</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code byte} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -2620,14 +2628,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateByte(int columnIndex, byte x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2635,8 +2643,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>short</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code short} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -2647,14 +2655,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateShort(int columnIndex, short x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2662,8 +2670,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>int</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code int} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -2674,14 +2682,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateInt(int columnIndex, int x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2689,8 +2697,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>long</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code long} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -2701,14 +2709,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateLong(int columnIndex, long x) throws SQLException {
        throw new UnsupportedOperationException();
@@ -2717,8 +2725,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>float</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code float} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -2729,14 +2737,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateFloat(int columnIndex, float x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2744,8 +2752,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -2756,14 +2764,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateDouble(int columnIndex, double x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2771,8 +2779,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.math.BigDecimal</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.math.BigDecimal} object.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -2783,14 +2791,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2798,8 +2806,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>String</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code String} object.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -2810,17 +2818,17 @@
      * as inserted. Both of these methods must be called before the
      * cursor moves to another row.
      * <P>
-     * The method <code>acceptChanges</code> must be called if the
+     * The method {@code acceptChanges} must be called if the
      * updated values are to be written back to the underlying database.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateString(int columnIndex, String x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2828,8 +2836,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>byte</code> array.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code byte} array.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -2840,14 +2848,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBytes(int columnIndex, byte x[]) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2855,8 +2863,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Date</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Date} object.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -2867,15 +2875,15 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, (3) the type of the designated column is not
-     *            an SQL <code>DATE</code> or <code>TIMESTAMP</code>, or
-     *            (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            an SQL {@code DATE} or {@code TIMESTAMP}, or
+     *            (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateDate(int columnIndex, java.sql.Date x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2883,8 +2891,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Time</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Time} object.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -2895,15 +2903,15 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, (3) the type of the designated column is not
-     *            an SQL <code>TIME</code> or <code>TIMESTAMP</code>, or
-     *            (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            an SQL {@code TIME} or {@code TIMESTAMP}, or
+     *            (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateTime(int columnIndex, java.sql.Time x) throws SQLException {
        throw new UnsupportedOperationException();
@@ -2911,8 +2919,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Timestamp</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Timestamp} object.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -2923,16 +2931,16 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, (3) the type of the designated column is not
-     *            an SQL <code>DATE</code>, <code>TIME</code>, or
-     *            <code>TIMESTAMP</code>, or (4) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            an SQL {@code DATE}, {@code TIME}, or
+     *            {@code TIMESTAMP}, or (4) this rowset is
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2940,7 +2948,7 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
+     * row of this {@code CachedRowSetImpl} object with the given
      * ASCII stream value.
      * <P>
      * This method updates a column value in either the current row or
@@ -2952,8 +2960,8 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @param length the number of one-byte ASCII characters in the stream
@@ -2965,8 +2973,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.io.InputStream</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.io.InputStream} object.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -2977,17 +2985,17 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param x the new column value; must be a <code>java.io.InputStream</code>
-     *          containing <code>BINARY</code>, <code>VARBINARY</code>, or
-     *          <code>LONGVARBINARY</code> data
+     * @param x the new column value; must be a {@code java.io.InputStream}
+     *          containing {@code BINARY}, {@code VARBINARY}, or
+     *          {@code LONGVARBINARY} data
      * @param length the length of the stream in bytes
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, (3) the data in the stream is not binary, or
-     *            (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBinaryStream(int columnIndex, java.io.InputStream x,int length) throws SQLException {
         throw new UnsupportedOperationException();
@@ -2995,8 +3003,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.io.Reader</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.io.Reader} object.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3007,19 +3015,19 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param x the new column value; must be a <code>java.io.Reader</code>
-     *          containing <code>BINARY</code>, <code>VARBINARY</code>,
-     *          <code>LONGVARBINARY</code>, <code>CHAR</code>, <code>VARCHAR</code>,
-     *          or <code>LONGVARCHAR</code> data
+     * @param x the new column value; must be a {@code java.io.Reader}
+     *          containing {@code BINARY}, {@code VARBINARY},
+     *          {@code LONGVARBINARY}, {@code CHAR}, {@code VARCHAR},
+     *          or {@code LONGVARCHAR} data
      * @param length the length of the stream in characters
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, (3) the data in the stream is not a binary or
      *            character type, or (4) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3027,11 +3035,11 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Object</code> value.  The <code>scale</code> parameter indicates
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Object} value.  The {@code scale} parameter indicates
      * the number of digits to the right of the decimal point and is ignored
      * if the new column value is not a type that will be mapped to an SQL
-     * <code>DECIMAL</code> or <code>NUMERIC</code> value.
+     * {@code DECIMAL} or {@code NUMERIC} value.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3042,16 +3050,16 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @param scale the number of digits to the right of the decimal point (for
-     *              <code>DECIMAL</code> and <code>NUMERIC</code> types only)
+     *              {@code DECIMAL} and {@code NUMERIC} types only)
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateObject(int columnIndex, Object x, int scale) throws SQLException {
        throw new UnsupportedOperationException();
@@ -3059,8 +3067,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Object</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Object} value.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3071,14 +3079,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
      * @param x the new column value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateObject(int columnIndex, Object x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3087,8 +3095,8 @@
 
     /**
      * Sets the designated nullable column in the current row or the
-     * insert row of this <code>CachedRowSetImpl</code> object with
-     * <code>null</code> value.
+     * insert row of this {@code CachedRowSetImpl} object with
+     * {@code null} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -3098,12 +3106,12 @@
      * must be called, which will insert the new row into both this rowset
      * and the database.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateNull(String columnName) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3111,8 +3119,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>boolean</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code boolean} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -3123,13 +3131,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBoolean(String columnName, boolean x) throws SQLException {
        throw new UnsupportedOperationException();
@@ -3137,8 +3145,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>byte</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code byte} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -3149,13 +3157,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateByte(String columnName, byte x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3163,8 +3171,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>short</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code short} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -3175,13 +3183,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateShort(String columnName, short x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3189,8 +3197,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>int</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code int} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -3201,13 +3209,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateInt(String columnName, int x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3215,8 +3223,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>long</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code long} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -3227,13 +3235,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateLong(String columnName, long x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3241,8 +3249,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>float</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code float} value.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -3253,13 +3261,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateFloat(String columnName, float x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3267,8 +3275,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3279,13 +3287,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateDouble(String columnName, double x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3293,8 +3301,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.math.BigDecimal</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.math.BigDecimal} object.
      * <P>
      * This method updates a column value in the current row or the insert
      * row of this rowset, but it does not update the database.
@@ -3305,13 +3313,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3319,8 +3327,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>String</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code String} object.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3331,13 +3339,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateString(String columnName, String x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3345,8 +3353,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>byte</code> array.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code byte} array.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3357,13 +3365,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBytes(String columnName, byte x[]) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3371,8 +3379,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Date</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Date} object.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3383,15 +3391,15 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, (3) the type
-     *            of the designated column is not an SQL <code>DATE</code> or
-     *            <code>TIMESTAMP</code>, or (4) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            of the designated column is not an SQL {@code DATE} or
+     *            {@code TIMESTAMP}, or (4) this rowset is
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateDate(String columnName, java.sql.Date x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3399,8 +3407,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Time</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Time} object.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3411,15 +3419,15 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, (3) the type
-     *            of the designated column is not an SQL <code>TIME</code> or
-     *            <code>TIMESTAMP</code>, or (4) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            of the designated column is not an SQL {@code TIME} or
+     *            {@code TIMESTAMP}, or (4) this rowset is
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateTime(String columnName, java.sql.Time x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3427,8 +3435,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Timestamp</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Timestamp} object.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3439,7 +3447,7 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if the given column index is out of bounds or
@@ -3448,9 +3456,9 @@
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, (3) the type
-     *            of the designated column is not an SQL <code>DATE</code>,
-     *            <code>TIME</code>, or <code>TIMESTAMP</code>, or (4) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            of the designated column is not an SQL {@code DATE},
+     *            {@code TIME}, or {@code TIMESTAMP}, or (4) this
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3458,7 +3466,7 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
+     * row of this {@code CachedRowSetImpl} object with the given
      * ASCII stream value.
      * <P>
      * This method updates a column value in either the current row or
@@ -3470,7 +3478,7 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @param length the number of one-byte ASCII characters in the stream
@@ -3483,8 +3491,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.io.InputStream</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.io.InputStream} object.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3495,17 +3503,17 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param x the new column value; must be a <code>java.io.InputStream</code>
-     *          containing <code>BINARY</code>, <code>VARBINARY</code>, or
-     *          <code>LONGVARBINARY</code> data
+     * @param x the new column value; must be a {@code java.io.InputStream}
+     *          containing {@code BINARY}, {@code VARBINARY}, or
+     *          {@code LONGVARBINARY} data
      * @param length the length of the stream in bytes
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, (3) the data
      *            in the stream is not binary, or (4) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3513,8 +3521,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.io.Reader</code> object.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.io.Reader} object.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3525,18 +3533,18 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param reader the new column value; must be a
-     * <code>java.io.Reader</code> containing <code>BINARY</code>,
-     * <code>VARBINARY</code>, <code>LONGVARBINARY</code>, <code>CHAR</code>,
-     * <code>VARCHAR</code>, or <code>LONGVARCHAR</code> data
+     * {@code java.io.Reader} containing {@code BINARY},
+     * {@code VARBINARY}, {@code LONGVARBINARY}, {@code CHAR},
+     * {@code VARCHAR}, or {@code LONGVARCHAR} data
      * @param length the length of the stream in characters
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, (3) the data
      *            in the stream is not a binary or character type, or (4) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateCharacterStream(String columnName,
     java.io.Reader reader,
@@ -3546,11 +3554,11 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Object</code> value.  The <code>scale</code> parameter
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Object} value.  The {@code scale} parameter
      * indicates the number of digits to the right of the decimal point
      * and is ignored if the new column value is not a type that will be
-     *  mapped to an SQL <code>DECIMAL</code> or <code>NUMERIC</code> value.
+     *  mapped to an SQL {@code DECIMAL} or {@code NUMERIC} value.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3561,15 +3569,15 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @param scale the number of digits to the right of the decimal point (for
-     *              <code>DECIMAL</code> and <code>NUMERIC</code> types only)
+     *              {@code DECIMAL} and {@code NUMERIC} types only)
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateObject(String columnName, Object x, int scale) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3577,8 +3585,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>Object</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code Object} value.
      * <P>
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -3589,20 +3597,20 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
      * @param x the new column value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateObject(String columnName, Object x) throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Inserts the contents of this <code>CachedRowSetImpl</code> object's insert
+     * Inserts the contents of this {@code CachedRowSetImpl} object's insert
      * row into this rowset immediately following the current row.
      * If the current row is the
      * position after the last row or before the first row, the new row will
@@ -3614,14 +3622,14 @@
      * @throws SQLException if (1) the cursor is not on the insert row,
      *            (2) one or more of the non-nullable columns in the insert
      *            row has not been given a value, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void insertRow() throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Marks the current row of this <code>CachedRowSetImpl</code> object as
+     * Marks the current row of this {@code CachedRowSetImpl} object as
      * updated and notifies listeners registered with this rowset that the
      * row has changed.
      * <P>
@@ -3631,26 +3639,26 @@
      * and the updates made before the cursor moved will be lost.
      *
      * @throws SQLException if the cursor is on the insert row or this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateRow() throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Deletes the current row from this <code>CachedRowSetImpl</code> object and
+     * Deletes the current row from this {@code CachedRowSetImpl} object and
      * notifies listeners registered with this rowset that a row has changed.
      * This method cannot be called when the cursor is on the insert row.
      * <P>
      * This method marks the current row as deleted, but it does not delete
      * the row from the underlying data source.  The method
-     * <code>acceptChanges</code> must be called to delete the row in
+     * {@code acceptChanges} must be called to delete the row in
      * the data source.
      *
      * @throws SQLException if (1) this method is called when the cursor
      *            is on the insert row, before the first row, or after the
      *            last row or (2) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void deleteRow() throws SQLException {
         throw new UnsupportedOperationException();
@@ -3659,7 +3667,7 @@
     /**
      * Sets the current row with its original value and marks the row as
      * not updated, thus undoing any changes made to the row since the
-     * last call to the methods <code>updateRow</code> or <code>deleteRow</code>.
+     * last call to the methods {@code updateRow} or {@code deleteRow}.
      * This method should be called only when the cursor is on a row in
      * this rowset.
      *
@@ -3672,11 +3680,11 @@
 
     /**
      * Rolls back any updates made to the current row of this
-     * <code>CachedRowSetImpl</code> object and notifies listeners that
+     * {@code CachedRowSetImpl} object and notifies listeners that
      * a row has changed.  To have an effect, this method
-     * must be called after an <code>updateXXX</code> method has been
-     * called and before the method <code>updateRow</code> has been called.
-     * If no updates have been made or the method <code>updateRow</code>
+     * must be called after an {@code updateXXX} method has been
+     * called and before the method {@code updateRow} has been called.
+     * If no updates have been made or the method {@code updateRow}
      * has already been called, this method has no effect.
      *
      * @throws SQLException if the cursor is on the insert row, before the
@@ -3687,39 +3695,39 @@
     }
 
     /**
-     * Moves the cursor for this <code>CachedRowSetImpl</code> object
+     * Moves the cursor for this {@code CachedRowSetImpl} object
      * to the insert row.  The current row in the rowset is remembered
      * while the cursor is on the insert row.
      * <P>
      * The insert row is a special row associated with an updatable
      * rowset.  It is essentially a buffer where a new row may
-     * be constructed by calling the appropriate <code>updateXXX</code>
+     * be constructed by calling the appropriate {@code updateXXX}
      * methods to assign a value to each column in the row.  A complete
      * row must be constructed; that is, every column that is not nullable
      * must be assigned a value.  In order for the new row to become part
-     * of this rowset, the method <code>insertRow</code> must be called
+     * of this rowset, the method {@code insertRow} must be called
      * before the cursor is moved back to the rowset.
      * <P>
      * Only certain methods may be invoked while the cursor is on the insert
      * row; many methods throw an exception if they are called while the
-     * cursor is there.  In addition to the <code>updateXXX</code>
-     * and <code>insertRow</code> methods, only the <code>getXXX</code> methods
-     * may be called when the cursor is on the insert row.  A <code>getXXX</code>
-     * method should be called on a column only after an <code>updateXXX</code>
+     * cursor is there.  In addition to the {@code updateXXX}
+     * and {@code insertRow} methods, only the {@code getXXX} methods
+     * may be called when the cursor is on the insert row.  A {@code getXXX}
+     * method should be called on a column only after an {@code updateXXX}
      * method has been called on that column; otherwise, the value returned is
      * undetermined.
      *
-     * @throws SQLException if this <code>CachedRowSetImpl</code> object is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     * @throws SQLException if this {@code CachedRowSetImpl} object is
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void moveToInsertRow() throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Moves the cursor for this <code>CachedRowSetImpl</code> object to
+     * Moves the cursor for this {@code CachedRowSetImpl} object to
      * the current row.  The current row is the row the cursor was on
-     * when the method <code>moveToInsertRow</code> was called.
+     * when the method {@code moveToInsertRow} was called.
      * <P>
      * Calling this method has no effect unless it is called while the
      * cursor is on the insert row.
@@ -3731,9 +3739,9 @@
     }
 
     /**
-     * Returns <code>null</code>.
-     *
-     * @return <code>null</code>
+     * Returns {@code null}.
+     *
+     * @return {@code null}
      * @throws SQLException if an error occurs
      */
     public Statement getStatement() throws SQLException {
@@ -3742,18 +3750,18 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as an <code>Object</code> in
+     * {@code CachedRowSetImpl} object as an {@code Object} in
      * the Java programming language, using the given
-     * <code>java.util.Map</code> object to custom map the value if
+     * {@code java.util.Map} object to custom map the value if
      * appropriate.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param map a <code>java.util.Map</code> object showing the mapping
+     * @param map a {@code java.util.Map} object showing the mapping
      *            from SQL type names to classes in the Java programming
      *            language
-     * @return an <code>Object</code> representing the SQL value
+     * @return an {@code Object} representing the SQL value
      * @throws SQLException if the given column index is out of bounds or
      *            the cursor is not on one of this rowset's rows or its
      *            insert row
@@ -3767,17 +3775,17 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as a <code>Ref</code> object
+     * {@code CachedRowSetImpl} object as a {@code Ref} object
      * in the Java programming language.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @return a <code>Ref</code> object representing an SQL<code> REF</code> value
+     * @return a {@code Ref} object representing an SQL{@code  REF} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) the designated column does not store an
-     *            SQL <code>REF</code> value
+     *            SQL {@code REF} value
      * @see #getRef(String)
      */
     public Ref getRef(int columnIndex) throws SQLException {
@@ -3786,17 +3794,17 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as a <code>Blob</code> object
+     * {@code CachedRowSetImpl} object as a {@code Blob} object
      * in the Java programming language.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
+     * @return a {@code Blob} object representing an SQL {@code BLOB} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) the designated column does not store an
-     *            SQL <code>BLOB</code> value
+     *            SQL {@code BLOB} value
      * @see #getBlob(String)
      */
     public Blob getBlob(int columnIndex) throws SQLException {
@@ -3805,17 +3813,17 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as a <code>Clob</code> object
+     * {@code CachedRowSetImpl} object as a {@code Clob} object
      * in the Java programming language.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @return a <code>Clob</code> object representing an SQL <code>CLOB</code> value
+     * @return a {@code Clob} object representing an SQL {@code CLOB} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) the designated column does not store an
-     *            SQL <code>CLOB</code> value
+     *            SQL {@code CLOB} value
      * @see #getClob(String)
      */
     public Clob getClob(int columnIndex) throws SQLException {
@@ -3824,18 +3832,18 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as an <code>Array</code> object
+     * {@code CachedRowSetImpl} object as an {@code Array} object
      * in the Java programming language.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @return an <code>Array</code> object representing an SQL
-     *         <code>ARRAY</code> value
+     * @return an {@code Array} object representing an SQL
+     *         {@code ARRAY} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) the designated column does not store an
-     *            SQL <code>ARRAY</code> value
+     *            SQL {@code ARRAY} value
      * @see #getArray(String)
      */
     public Array getArray(int columnIndex) throws SQLException {
@@ -3844,17 +3852,17 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as an <code>Object</code> in
+     * {@code CachedRowSetImpl} object as an {@code Object} in
      * the Java programming language, using the given
-     * <code>java.util.Map</code> object to custom map the value if
+     * {@code java.util.Map} object to custom map the value if
      * appropriate.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param map a <code>java.util.Map</code> object showing the mapping
+     * @param map a {@code java.util.Map} object showing the mapping
      *        from SQL type names to classes in the Java programming
      *        language
-     * @return an <code>Object</code> representing the SQL value
+     * @return an {@code Object} representing the SQL value
      * @throws SQLException if the given column name is not the name of
      *         a column in this rowset or the cursor is not on one of
      *         this rowset's rows or its insert row
@@ -3867,16 +3875,16 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as a <code>Ref</code> object
+     * {@code CachedRowSetImpl} object as a {@code Ref} object
      * in the Java programming language.
      *
-     * @param colName a <code>String</code> object that must match the
+     * @param colName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @return a <code>Ref</code> object representing an SQL<code> REF</code> value
+     * @return a {@code Ref} object representing an SQL{@code  REF} value
      * @throws SQLException  if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the column value
-     *            is not an SQL <code>REF</code> value
+     *            is not an SQL {@code REF} value
      * @see #getRef(int)
      */
     public Ref getRef(String colName) throws SQLException {
@@ -3885,16 +3893,16 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as a <code>Blob</code> object
+     * {@code CachedRowSetImpl} object as a {@code Blob} object
      * in the Java programming language.
      *
-     * @param colName a <code>String</code> object that must match the
+     * @param colName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
+     * @return a {@code Blob} object representing an SQL {@code BLOB} value
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>BLOB</code> value
+     *            column does not store an SQL {@code BLOB} value
      * @see #getBlob(int)
      */
     public Blob getBlob(String colName) throws SQLException {
@@ -3903,17 +3911,17 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as a <code>Clob</code> object
+     * {@code CachedRowSetImpl} object as a {@code Clob} object
      * in the Java programming language.
      *
-     * @param colName a <code>String</code> object that must match the
+     * @param colName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @return a <code>Clob</code> object representing an SQL
-     *         <code>CLOB</code> value
+     * @return a {@code Clob} object representing an SQL
+     *         {@code CLOB} value
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>CLOB</code> value
+     *            column does not store an SQL {@code CLOB} value
      * @see #getClob(int)
      */
     public Clob getClob(String colName) throws SQLException {
@@ -3922,17 +3930,17 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as an <code>Array</code> object
+     * {@code CachedRowSetImpl} object as an {@code Array} object
      * in the Java programming langugage.
      *
-     * @param colName a <code>String</code> object that must match the
+     * @param colName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @return an <code>Array</code> object representing an SQL
-     *         <code>ARRAY</code> value
+     * @return an {@code Array} object representing an SQL
+     *         {@code ARRAY} value
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>ARRAY</code> value
+     *            column does not store an SQL {@code ARRAY} value
      * @see #getArray(int)
      */
     public Array getArray(String colName) throws SQLException {
@@ -3941,22 +3949,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Date</code>
-     * object, using the given <code>Calendar</code> object to construct an
+     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Date}
+     * object, using the given {@code Calendar} object to construct an
      * appropriate millisecond value for the date.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @param cal the <code>java.util.Calendar</code> object to use in
+     * @param cal the {@code java.util.Calendar} object to use in
      *            constructing the date
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>DATE</code> or
-     *            <code>TIMESTAMP</code> value
+     *            column does not store an SQL {@code DATE} or
+     *            {@code TIMESTAMP} value
      */
     public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3964,21 +3972,21 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Date</code>
-     * object, using the given <code>Calendar</code> object to construct an
+     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Date}
+     * object, using the given {@code Calendar} object to construct an
      * appropriate millisecond value for the date.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param cal the <code>java.util.Calendar</code> object to use in
+     * @param cal the {@code java.util.Calendar} object to use in
      *            constructing the date
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>DATE</code> or
-     *            <code>TIMESTAMP</code> value
+     *            column does not store an SQL {@code DATE} or
+     *            {@code TIMESTAMP} value
      */
     public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException {
         throw new UnsupportedOperationException();
@@ -3986,22 +3994,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Time</code>
-     * object, using the given <code>Calendar</code> object to construct an
+     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Time}
+     * object, using the given {@code Calendar} object to construct an
      * appropriate millisecond value for the date.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @param cal the <code>java.util.Calendar</code> object to use in
+     * @param cal the {@code java.util.Calendar} object to use in
      *            constructing the date
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>TIME</code> or
-     *            <code>TIMESTAMP</code> value
+     *            column does not store an SQL {@code TIME} or
+     *            {@code TIMESTAMP} value
      */
     public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4009,21 +4017,21 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Time</code>
-     * object, using the given <code>Calendar</code> object to construct an
+     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Time}
+     * object, using the given {@code Calendar} object to construct an
      * appropriate millisecond value for the date.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param cal the <code>java.util.Calendar</code> object to use in
+     * @param cal the {@code java.util.Calendar} object to use in
      *            constructing the date
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>TIME</code> or
-     *            <code>TIMESTAMP</code> value
+     *            column does not store an SQL {@code TIME} or
+     *            {@code TIMESTAMP} value
      */
     public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4031,22 +4039,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Timestamp</code>
-     * object, using the given <code>Calendar</code> object to construct an
+     * of this {@code CachedRowSetImpl} object as a {@code java.sql.Timestamp}
+     * object, using the given {@code Calendar} object to construct an
      * appropriate millisecond value for the date.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in the rowset
-     * @param cal the <code>java.util.Calendar</code> object to use in
+     * @param cal the {@code java.util.Calendar} object to use in
      *            constructing the date
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>TIME</code> or
-     *            <code>TIMESTAMP</code> value
+     *            column does not store an SQL {@code TIME} or
+     *            {@code TIMESTAMP} value
      */
     public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4054,22 +4062,22 @@
 
     /**
      * Retrieves the value of the designated column in the current row
-     * of this <code>CachedRowSetImpl</code> object as a
-     * <code>java.sql.Timestamp</code> object, using the given
-     * <code>Calendar</code> object to construct an appropriate
+     * of this {@code CachedRowSetImpl} object as a
+     * {@code java.sql.Timestamp} object, using the given
+     * {@code Calendar} object to construct an appropriate
      * millisecond value for the date.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param cal the <code>java.util.Calendar</code> object to use in
+     * @param cal the {@code java.util.Calendar} object to use in
      *            constructing the date
-     * @return the column value; if the value is SQL <code>NULL</code>,
-     *         the result is <code>null</code>
+     * @return the column value; if the value is SQL {@code NULL},
+     *         the result is {@code null}
      * @throws SQLException if (1) the given column name is not the name of
      *            a column in this rowset, (2) the cursor is not on one of
      *            this rowset's rows or its insert row, or (3) the designated
-     *            column does not store an SQL <code>DATE</code>,
-     *            <code>TIME</code>, or <code>TIMESTAMP</code> value
+     *            column does not store an SQL {@code DATE},
+     *            {@code TIME}, or {@code TIMESTAMP} value
      */
     public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4080,13 +4088,13 @@
      */
 
     /**
-     * Retrieves the <code>Connection</code> object passed to this
-     * <code>CachedRowSetImpl</code> object.  This connection may be
+     * Retrieves the {@code Connection} object passed to this
+     * {@code CachedRowSetImpl} object.  This connection may be
      * used to populate this rowset with data or to write data back
      * to its underlying data source.
      *
-     * @return the <code>Connection</code> object passed to this rowset;
-     *         may be <code>null</code> if there is no connection
+     * @return the {@code Connection} object passed to this rowset;
+     *         may be {@code null} if there is no connection
      * @throws SQLException if an error occurs
      */
     public Connection getConnection() throws SQLException{
@@ -4094,10 +4102,10 @@
     }
 
     /**
-     * Sets the metadata for this <code>CachedRowSetImpl</code> object
-     * with the given <code>RowSetMetaData</code> object.
-     *
-     * @param md a <code>RowSetMetaData</code> object instance containing
+     * Sets the metadata for this {@code CachedRowSetImpl} object
+     * with the given {@code RowSetMetaData} object.
+     *
+     * @param md a {@code RowSetMetaData} object instance containing
      *            metadata about the columsn in the rowset
      * @throws SQLException if invalid meta data is supplied to the
      *            rowset
@@ -4108,17 +4116,17 @@
 
     /**
      * Returns a result set containing the original value of the rowset. The
-     * original value is the state of the <code>CachedRowSetImpl</code> after the
+     * original value is the state of the {@code CachedRowSetImpl} after the
      * last population or synchronization (whichever occurred most recently) with
      * the data source.
      * <p>
      * The cursor is positioned before the first row in the result set.
-     * Only rows contained in the result set returned by <code>getOriginal()</code>
+     * Only rows contained in the result set returned by {@code getOriginal()}
      * are said to have an original value.
      *
      * @return the original result set of the rowset
      * @throws SQLException if an error occurs produce the
-     *           <code>ResultSet</code> object
+     *           {@code ResultSet} object
      */
     public ResultSet getOriginal() throws SQLException {
        throw new UnsupportedOperationException();
@@ -4127,7 +4135,7 @@
     /**
      * Returns a result set containing the original value of the current
      * row only.
-     * The original value is the state of the <code>CachedRowSetImpl</code> after
+     * The original value is the state of the {@code CachedRowSetImpl} after
      * the last population or synchronization (whichever occurred most recently)
      * with the data source.
      *
@@ -4153,7 +4161,7 @@
     /**
      * Marks all rows in this rowset as being original rows. Any updates
      * made to the rows become the original values for the rowset.
-     * Calls to the method <code>setOriginal</code> connot be reversed.
+     * Calls to the method {@code setOriginal} connot be reversed.
      *
      * @throws SQLException if an error occurs
      */
@@ -4165,8 +4173,8 @@
      * Returns an identifier for the object (table) that was used to create this
      * rowset.
      *
-     * @return a <code>String</code> object that identifies the table from
-     *         which this <code>CachedRowSetImpl</code> object was derived
+     * @return a {@code String} object that identifies the table from
+     *         which this {@code CachedRowSetImpl} object was derived
      * @throws SQLException if an error occurs
      */
     public String getTableName() throws SQLException {
@@ -4177,8 +4185,8 @@
      * Sets the identifier for the table from which this rowset was derived
      * to the given table name.
      *
-     * @param tabName a <code>String</code> object that identifies the
-     *          table from which this <code>CachedRowSetImpl</code> object
+     * @param tabName a {@code String} object that identifies the
+     *          table from which this {@code CachedRowSetImpl} object
      *          was derived
      * @throws SQLException if an error occurs
      */
@@ -4188,7 +4196,7 @@
 
     /**
      * Returns the columns that make a key to uniquely identify a
-     * row in this <code>CachedRowSetImpl</code> object.
+     * row in this {@code CachedRowSetImpl} object.
      *
      * @return an array of column numbers that constitutes a primary
      *           key for this rowset. This array should be empty
@@ -4203,16 +4211,16 @@
 
 
     /**
-     * Sets this <code>CachedRowSetImpl</code> object's
-     * <code>keyCols</code> field with the given array of column
+     * Sets this {@code CachedRowSetImpl} object's
+     * {@code keyCols} field with the given array of column
      * numbers, which forms a key for uniquely identifying a row
      * in this rowset.
      *
-     * @param keys an array of <code>int</code> indicating the
+     * @param keys an array of {@code int} indicating the
      *        columns that form a primary key for this
-     *        <code>CachedRowSetImpl</code> object; every
+     *        {@code CachedRowSetImpl} object; every
      *        element in the array must be greater than
-     *        <code>0</code> and less than or equal to the number
+     *        {@code 0} and less than or equal to the number
      *        of columns in this rowset
      * @throws SQLException if any of the numbers in the
      *            given array is not valid for this rowset
@@ -4224,8 +4232,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -4236,14 +4244,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param ref the new column <code>java.sql.Ref</code> value
+     * @param ref the new column {@code java.sql.Ref} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *        (2) the cursor is not on one of this rowset's rows or its
      *        insert row, or (3) this rowset is
-     *        <code>ResultSet.CONCUR_READ_ONLY</code>
+     *        {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateRef(int columnIndex, java.sql.Ref ref) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4251,8 +4259,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -4263,13 +4271,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param ref the new column <code>java.sql.Ref</code> value
+     * @param ref the new column {@code java.sql.Ref} value
      * @throws SQLException if (1) the given column name does not match the
      *        name of a column in this rowset, (2) the cursor is not on
      *        one of this rowset's rows or its insert row, or (3) this
-     *        rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *        rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateRef(String columnName, java.sql.Ref ref) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4277,8 +4285,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -4289,14 +4297,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param c the new column <code>Clob value
+     * @param c the new column {@code Clob} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *        (2) the cursor is not on one of this rowset's rows or its
      *        insert row, or (3) this rowset is
-     *        <code>ResultSet.CONCUR_READ_ONLY</code>
+     *        {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateClob(int columnIndex, Clob c) throws SQLException {
        throw new UnsupportedOperationException();
@@ -4304,8 +4312,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>double</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code double} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -4316,13 +4324,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param c the new column <code>Clob</code>value
+     * @param c the new column {@code Clob}value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateClob(String columnName, Clob c) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4330,8 +4338,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.sql.Blob</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.sql.Blob} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -4342,14 +4350,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param b the new column <code>Blob</code> value
+     * @param b the new column {@code Blob} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBlob(int columnIndex, Blob b) throws SQLException {
        throw new UnsupportedOperationException();
@@ -4357,8 +4365,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.sql.Blob </code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.sql.Blob } value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -4369,13 +4377,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param b the new column <code>Blob</code> value
+     * @param b the new column {@code Blob} value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateBlob(String columnName, Blob b) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4383,8 +4391,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.sql.Array</code> values.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.sql.Array} values.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -4395,14 +4403,14 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnIndex the first column is <code>1</code>, the second
-     *        is <code>2</code>, and so on; must be <code>1</code> or larger
+     * @param columnIndex the first column is {@code 1}, the second
+     *        is {@code 2}, and so on; must be {@code 1} or larger
      *        and equal to or less than the number of columns in this rowset
-     * @param a the new column <code>Array</code> value
+     * @param a the new column {@code Array} value
      * @throws SQLException if (1) the given column index is out of bounds,
      *            (2) the cursor is not on one of this rowset's rows or its
      *            insert row, or (3) this rowset is
-     *            <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateArray(int columnIndex, Array a) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4410,8 +4418,8 @@
 
     /**
      * Sets the designated column in either the current row or the insert
-     * row of this <code>CachedRowSetImpl</code> object with the given
-     * <code>java.sql.Array</code> value.
+     * row of this {@code CachedRowSetImpl} object with the given
+     * {@code java.sql.Array} value.
      *
      * This method updates a column value in either the current row or
      * the insert row of this rowset, but it does not update the
@@ -4422,13 +4430,13 @@
      * and the database. Both of these methods must be called before the
      * cursor moves to another row.
      *
-     * @param columnName a <code>String</code> object that must match the
+     * @param columnName a {@code String} object that must match the
      *        SQL name of a column in this rowset, ignoring case
-     * @param a the new column <code>Array</code> value
+     * @param a the new column {@code Array} value
      * @throws SQLException if (1) the given column name does not match the
      *            name of a column in this rowset, (2) the cursor is not on
      *            one of this rowset's rows or its insert row, or (3) this
-     *            rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+     *            rowset is {@code ResultSet.CONCUR_READ_ONLY}
      */
     public void updateArray(String columnName, Array a) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4437,7 +4445,7 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as a <code>java.net.URL</code> object
+     * {@code CachedRowSetImpl} object as a {@code java.net.URL} object
      * in the Java programming language.
      *
      * @return a java.net.URL object containing the resource reference described by
@@ -4445,7 +4453,7 @@
      * @throws SQLException if (1) the given column index is out of bounds,
      * (2) the cursor is not on one of this rowset's rows or its
      * insert row, or (3) the designated column does not store an
-     * SQL <code>DATALINK</code> value.
+     * SQL {@code DATALINK} value.
      * @see #getURL(String)
      */
     public java.net.URL getURL(int columnIndex) throws SQLException {
@@ -4454,7 +4462,7 @@
 
     /**
      * Retrieves the value of the designated column in this
-     * <code>CachedRowSetImpl</code> object as a <code>java.net.URL</code> object
+     * {@code CachedRowSetImpl} object as a {@code java.net.URL} object
      * in the Java programming language.
      *
      * @return a java.net.URL object containing the resource reference described by
@@ -4463,7 +4471,7 @@
      * in this rowset, or
      * (2) the cursor is not on one of this rowset's rows or its
      * insert row, or (3) the designated column does not store an
-     * SQL <code>DATALINK</code> value.
+     * SQL {@code DATALINK} value.
      * @see #getURL(int)
      */
     public java.net.URL getURL(String columnName) throws SQLException {
@@ -4472,20 +4480,20 @@
     }
 
     /**
-     * The first warning reported by calls on this <code>CachedRowSetImpl</code>
-     * object is returned. Subsequent <code>CachedRowSetImpl</code> warnings will
-     * be chained to this <code>SQLWarning</code>. All <code>RowSetWarnings</code>
+     * The first warning reported by calls on this {@code CachedRowSetImpl}
+     * object is returned. Subsequent {@code CachedRowSetImpl} warnings will
+     * be chained to this {@code SQLWarning}. All {@code RowSetWarnings}
      * warnings are generated in the disconnected environment and remain a
-     * seperate warning chain to that provided by the <code>getWarnings</code>
+     * seperate warning chain to that provided by the {@code getWarnings}
      * method.
      *
      * <P>The warning chain is automatically cleared each time a new
      * row is read.
      *
      * <P><B>Note:</B> This warning chain only covers warnings caused
-     * by <code>CachedRowSet</code> (and their child interface)
-     * methods. All <code>SQLWarnings</code> can be obtained using the
-     * <code>getWarnings</code> method which tracks warnings generated
+     * by {@code CachedRowSet} (and their child interface)
+     * methods. All {@code SQLWarnings} can be obtained using the
+     * {@code getWarnings} method which tracks warnings generated
      * by the underlying JDBC driver.
      * @return the first SQLWarning or null
      *
@@ -4495,7 +4503,7 @@
     }
 
      /**
-     * Commits all changes performed by the <code>acceptChanges()</code>
+     * Commits all changes performed by the {@code acceptChanges()}
      * methods
      *
      * @see java.sql.Connection#commit
@@ -4505,7 +4513,7 @@
     }
 
     /**
-     * Rolls back all changes performed by the <code>acceptChanges()</code>
+     * Rolls back all changes performed by the {@code acceptChanges()}
      * methods
      *
      * @see java.sql.Connection#rollback
@@ -4515,8 +4523,8 @@
     }
 
     /**
-     * Rolls back all changes performed by the <code>acceptChanges()</code>
-     * to the last <code>Savepoint</code> transaction marker.
+     * Rolls back all changes performed by the {@code acceptChanges()}
+     * to the last {@code Savepoint} transaction marker.
      *
      * @see java.sql.Connection#rollback(Savepoint)
      */
@@ -4526,7 +4534,7 @@
 
     /**
      * Unsets the designated parameter to the given int array.
-     * This was set using <code>setMatchColumn</code>
+     * This was set using {@code setMatchColumn}
      * as the column which will form the basis of the join.
      * <P>
      * The parameter value unset by this method should be same
@@ -4536,7 +4544,7 @@
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
      *  parameter index is out of bounds or if the columnIdx is
-     *  not the same as set using <code>setMatchColumn(int [])</code>
+     *  not the same as set using {@code setMatchColumn(int [])}
      */
     public void unsetMatchColumn(int[] columnIdxes) throws SQLException {
          throw new UnsupportedOperationException();
@@ -4544,7 +4552,7 @@
 
    /**
      * Unsets the designated parameter to the given String array.
-     * This was set using <code>setMatchColumn</code>
+     * This was set using {@code setMatchColumn}
      * as the column which will form the basis of the join.
      * <P>
      * The parameter value unset by this method should be same
@@ -4554,18 +4562,18 @@
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
      *  parameter index is out of bounds or if the columnName is
-     *  not the same as set using <code>setMatchColumn(String [])</code>
+     *  not the same as set using {@code setMatchColumn(String [])}
      */
     public void unsetMatchColumn(String[] columnIdxes) throws SQLException {
        throw new UnsupportedOperationException();
     }
 
     /**
-     * Retrieves the column name as <code>String</code> array
-     * that was set using <code>setMatchColumn(String [])</code>
+     * Retrieves the column name as {@code String} array
+     * that was set using {@code setMatchColumn(String [])}
      * for this rowset.
      *
-     * @return a <code>String</code> array object that contains the column names
+     * @return a {@code String} array object that contains the column names
      *         for the rowset which has this the match columns
      *
      * @throws SQLException if an error occurs or column name is not set
@@ -4575,10 +4583,10 @@
     }
 
     /**
-     * Retrieves the column id as <code>int</code> array that was set using
-     * <code>setMatchColumn(int [])</code> for this rowset.
-     *
-     * @return a <code>int</code> array object that contains the column ids
+     * Retrieves the column id as {@code int} array that was set using
+     * {@code setMatchColumn(int [])} for this rowset.
+     *
+     * @return a {@code int} array object that contains the column ids
      *         for the rowset which has this as the match columns.
      *
      * @throws SQLException if an error occurs or column index is not set
@@ -4590,17 +4598,17 @@
     /**
      * Sets the designated parameter to the given int array.
      * This forms the basis of the join for the
-     * <code>JoinRowSet</code> as the column which will form the basis of the
+     * {@code JoinRowSet} as the column which will form the basis of the
      * join.
      * <P>
      * The parameter value set by this method is stored internally and
      * will be supplied as the appropriate parameter in this rowset's
-     * command when the method <code>getMatchColumnIndexes</code> is called.
+     * command when the method {@code getMatchColumnIndexes} is called.
      *
      * @param columnIdxes the indexes into this rowset
      *        object's internal representation of parameter values; the
      *        first parameter is 0, the second is 1, and so on; must be
-     *        <code>0</code> or greater
+     *        {@code 0} or greater
      * @throws SQLException if an error occurs or the
      *                         parameter index is out of bounds
      */
@@ -4611,12 +4619,12 @@
     /**
      * Sets the designated parameter to the given String array.
      *  This forms the basis of the join for the
-     * <code>JoinRowSet</code> as the column which will form the basis of the
+     * {@code JoinRowSet} as the column which will form the basis of the
      * join.
      * <P>
      * The parameter value set by this method is stored internally and
      * will be supplied as the appropriate parameter in this rowset's
-     * command when the method <code>getMatchColumn</code> is called.
+     * command when the method {@code getMatchColumn} is called.
      *
      * @param columnNames the name of the column into this rowset
      *        object's internal representation of parameter values
@@ -4629,19 +4637,19 @@
 
 
     /**
-     * Sets the designated parameter to the given <code>int</code>
+     * Sets the designated parameter to the given {@code int}
      * object.  This forms the basis of the join for the
-     * <code>JoinRowSet</code> as the column which will form the basis of the
+     * {@code JoinRowSet} as the column which will form the basis of the
      * join.
      * <P>
      * The parameter value set by this method is stored internally and
      * will be supplied as the appropriate parameter in this rowset's
-     * command when the method <code>getMatchColumn</code> is called.
+     * command when the method {@code getMatchColumn} is called.
      *
      * @param columnIdx the index into this rowset
      *        object's internal representation of parameter values; the
      *        first parameter is 0, the second is 1, and so on; must be
-     *        <code>0</code> or greater
+     *        {@code 0} or greater
      * @throws SQLException if an error occurs or the
      *                         parameter index is out of bounds
      */
@@ -4650,14 +4658,14 @@
     }
 
     /**
-     * Sets the designated parameter to the given <code>String</code>
+     * Sets the designated parameter to the given {@code String}
      * object.  This forms the basis of the join for the
-     * <code>JoinRowSet</code> as the column which will form the basis of the
+     * {@code JoinRowSet} as the column which will form the basis of the
      * join.
      * <P>
      * The parameter value set by this method is stored internally and
      * will be supplied as the appropriate parameter in this rowset's
-     * command when the method <code>getMatchColumn</code> is called.
+     * command when the method {@code getMatchColumn} is called.
      *
      * @param columnName the name of the column into this rowset
      *        object's internal representation of parameter values
@@ -4669,8 +4677,8 @@
     }
 
     /**
-     * Unsets the designated parameter to the given <code>int</code>
-     * object.  This was set using <code>setMatchColumn</code>
+     * Unsets the designated parameter to the given {@code int}
+     * object.  This was set using {@code setMatchColumn}
      * as the column which will form the basis of the join.
      * <P>
      * The parameter value unset by this method should be same
@@ -4680,15 +4688,15 @@
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
      *  parameter index is out of bounds or if the columnIdx is
-     *  not the same as set using <code>setMatchColumn(int)</code>
+     *  not the same as set using {@code setMatchColumn(int)}
      */
     public void unsetMatchColumn(int columnIdx) throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Unsets the designated parameter to the given <code>String</code>
-     * object.  This was set using <code>setMatchColumn</code>
+     * Unsets the designated parameter to the given {@code String}
+     * object.  This was set using {@code setMatchColumn}
      * as the column which will form the basis of the join.
      * <P>
      * The parameter value unset by this method should be same
@@ -4698,7 +4706,7 @@
      *        object's internal representation of parameter values
      * @throws SQLException if an error occurs or the
      *  parameter index is out of bounds or if the columnName is
-     *  not the same as set using <code>setMatchColumn(String)</code>
+     *  not the same as set using {@code setMatchColumn(String)}
      */
     public void unsetMatchColumn(String columnName) throws SQLException {
         throw new UnsupportedOperationException();
@@ -4706,48 +4714,48 @@
 
     /**
      * Notifies registered listeners that a RowSet object in the given RowSetEvent
-     * object has populated a number of additional rows. The <code>numRows</code> parameter
-     * ensures that this event will only be fired every <code>numRow</code>.
+     * object has populated a number of additional rows. The {@code numRows} parameter
+     * ensures that this event will only be fired every {@code numRow}.
      * <p>
      * The source of the event can be retrieved with the method event.getSource.
      *
-     * @param event a <code>RowSetEvent</code> object that contains the
-     *     <code>RowSet</code> object that is the source of the events
+     * @param event a {@code RowSetEvent} object that contains the
+     *     {@code RowSet} object that is the source of the events
      * @param numRows when populating, the number of rows interval on which the
-     *     <code>CachedRowSet</code> populated should fire; the default value
-     *     is zero; cannot be less than <code>fetchSize</code> or zero
+     *     {@code CachedRowSet} populated should fire; the default value
+     *     is zero; cannot be less than {@code fetchSize} or zero
      */
     public void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Populates this <code>CachedRowSet</code> object with data from
-     * the given <code>ResultSet</code> object. While related to the <code>populate(ResultSet)</code>
+     * Populates this {@code CachedRowSet} object with data from
+     * the given {@code ResultSet} object. While related to the {@code populate(ResultSet)}
      * method, an additional parameter is provided to allow starting position within
-     * the <code>ResultSet</code> from where to populate the CachedRowSet
+     * the {@code ResultSet} from where to populate the CachedRowSet
      * instance.
      *
-     * This method is an alternative to the method <code>execute</code>
-     * for filling the rowset with data.  The method <code>populate</code>
+     * This method is an alternative to the method {@code execute}
+     * for filling the rowset with data.  The method {@code populate}
      * does not require that the properties needed by the method
-     * <code>execute</code>, such as the <code>command</code> property,
-     * be set. This is true because the method <code>populate</code>
-     * is given the <code>ResultSet</code> object from
+     * {@code execute}, such as the {@code command} property,
+     * be set. This is true because the method {@code populate}
+     * is given the {@code ResultSet} object from
      * which to get data and thus does not need to use the properties
      * required for setting up a connection and executing this
-     * <code>CachedRowSetImpl</code> object's command.
+     * {@code CachedRowSetImpl} object's command.
      * <P>
      * After populating this rowset with data, the method
-     * <code>populate</code> sets the rowset's metadata and
-     * then sends a <code>RowSetChangedEvent</code> object
+     * {@code populate} sets the rowset's metadata and
+     * then sends a {@code RowSetChangedEvent} object
      * to all registered listeners prior to returning.
      *
-     * @param data the <code>ResultSet</code> object containing the data
-     *             to be read into this <code>CachedRowSetImpl</code> object
+     * @param data the {@code ResultSet} object containing the data
+     *             to be read into this {@code CachedRowSetImpl} object
      * @param start the integer specifing the position in the
-     *        <code>ResultSet</code> object to popultate the
-     *        <code>CachedRowSetImpl</code> object.
+     *        {@code ResultSet} object to popultate the
+     *        {@code CachedRowSetImpl} object.
      * @throws SQLException if an error occurs; or the max row setting is
      *          violated while populating the RowSet.Also id the start position
      *          is negative.
@@ -4759,7 +4767,7 @@
      }
 
     /**
-     * The nextPage gets the next page, that is a <code>CachedRowSetImpl</code> object
+     * The nextPage gets the next page, that is a {@code CachedRowSetImpl} object
      * containing the number of rows specified by page size.
      * @return boolean value true indicating whether there are more pages to come and
      *         false indicating that this is the last page.
@@ -4796,7 +4804,7 @@
      * @return boolean value true if it retrieves the previous page, flase if it
      *         is on the first page.
      * @throws SQLException if it is called before populate is called or ResultSet
-     *         is of type <code>ResultSet.TYPE_FORWARD_ONLY</code> or if an error
+     *         is of type {@code ResultSet.TYPE_FORWARD_ONLY} or if an error
      *         occurs.
      */
     public boolean previousPage() throws SQLException {
@@ -4807,7 +4815,7 @@
        * Updates the designated column with a character stream value, which will
        * have the specified number of bytes. The driver does the necessary conversion
        * from Java character format to the national character set in the database.
-       * It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
+       * It is intended for use when updating NCHAR, NVARCHAR and LONGNVARCHAR columns.
        * The updater methods are used to update column values in the current row or
        * the insert row. The updater methods do not update the underlying database;
        * instead the updateRow or insertRow methods are called to update the database.
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java	Wed Jul 05 20:37:47 2017 +0200
@@ -36,24 +36,24 @@
 import javax.sql.rowset.spi.*;
 
 /**
- * An implementation of the <code>XmlWriter</code> interface, which writes a
- * <code>WebRowSet</code> object to an output stream as an XML document.
+ * An implementation of the {@code XmlWriter}  interface, which writes a
+ * {@code WebRowSet}  object to an output stream as an XML document.
  */
 
 public class WebRowSetXmlWriter implements XmlWriter, Serializable {
 
     /**
-     * The <code>java.io.Writer</code> object to which this <code>WebRowSetXmlWriter</code>
-     * object will write when its <code>writeXML</code> method is called. The value
-     * for this field is set with the <code>java.io.Writer</code> object given
-     * as the second argument to the <code>writeXML</code> method.
+     * The {@code java.io.Writer}  object to which this {@code WebRowSetXmlWriter}
+     * object will write when its {@code writeXML}  method is called. The value
+     * for this field is set with the {@code java.io.Writer}  object given
+     * as the second argument to the {@code writeXML}  method.
      */
     private transient java.io.Writer writer;
 
     /**
-     * The <code>java.util.Stack</code> object that this <code>WebRowSetXmlWriter</code>
+     * The {@code java.util.Stack}  object that this {@code WebRowSetXmlWriter}
      * object will use for storing the tags to be used for writing the calling
-     * <code>WebRowSet</code> object as an XML document.
+     * {@code WebRowSet}  object as an XML document.
      */
     private java.util.Stack<String> stack;
 
@@ -69,24 +69,24 @@
     }
 
     /**
-     * Writes the given <code>WebRowSet</code> object as an XML document
-     * using the given <code>java.io.Writer</code> object. The XML document
-     * will include the <code>WebRowSet</code> object's data, metadata, and
+     * Writes the given {@code WebRowSet}  object as an XML document
+     * using the given {@code java.io.Writer}  object. The XML document
+     * will include the {@code WebRowSet}  object's data, metadata, and
      * properties.  If a data value has been updated, that information is also
      * included.
      * <P>
-     * This method is called by the <code>XmlWriter</code> object that is
-     * referenced in the calling <code>WebRowSet</code> object's
-     * <code>xmlWriter</code> field.  The <code>XmlWriter.writeXML</code>
+     * This method is called by the {@code XmlWriter}  object that is
+     * referenced in the calling {@code WebRowSet}  object's
+     * {@code xmlWriter}  field.  The {@code XmlWriter.writeXML}
      * method passes to this method the arguments that were supplied to it.
      *
-     * @param caller the <code>WebRowSet</code> object to be written; must
-     *        be a rowset for which this <code>WebRowSetXmlWriter</code> object
+     * @param caller the {@code WebRowSet}  object to be written; must
+     *        be a rowset for which this {@code WebRowSetXmlWriter}  object
      *        is the writer
-     * @param wrt the <code>java.io.Writer</code> object to which
-     *        <code>caller</code> will be written
+     * @param wrt the {@code java.io.Writer}  object to which
+     *        {@code caller}  will be written
      * @exception SQLException if a database access error occurs or
-     *            this <code>WebRowSetXmlWriter</code> object is not the writer
+     *            this {@code WebRowSetXmlWriter}  object is not the writer
      *            for the given rowset
      * @see XmlWriter#writeXML
      */
@@ -100,26 +100,26 @@
     }
 
     /**
-     * Writes the given <code>WebRowSet</code> object as an XML document
-     * using the given <code>java.io.OutputStream</code> object. The XML document
-     * will include the <code>WebRowSet</code> object's data, metadata, and
+     * Writes the given {@code WebRowSet}  object as an XML document
+     * using the given {@code java.io.OutputStream}  object. The XML document
+     * will include the {@code WebRowSet}  object's data, metadata, and
      * properties.  If a data value has been updated, that information is also
      * included.
      * <P>
-     * Using stream is a faster way than using <code>java.io.Writer<code/>
+     * Using stream is a faster way than using {@code java.io.Writer}
      *
-     * This method is called by the <code>XmlWriter</code> object that is
-     * referenced in the calling <code>WebRowSet</code> object's
-     * <code>xmlWriter</code> field.  The <code>XmlWriter.writeXML</code>
+     * This method is called by the {@code XmlWriter}  object that is
+     * referenced in the calling {@code WebRowSet}  object's
+     * {@code xmlWriter}  field.  The {@code XmlWriter.writeXML}
      * method passes to this method the arguments that were supplied to it.
      *
-     * @param caller the <code>WebRowSet</code> object to be written; must
-     *        be a rowset for which this <code>WebRowSetXmlWriter</code> object
+     * @param caller the {@code WebRowSet}  object to be written; must
+     *        be a rowset for which this {@code WebRowSetXmlWriter}  object
      *        is the writer
-     * @param oStream the <code>java.io.OutputStream</code> object to which
-     *        <code>caller</code> will be written
+     * @param oStream the {@code java.io.OutputStream}  object to which
+     *        {@code caller}  will be written
      * @throws SQLException if a database access error occurs or
-     *            this <code>WebRowSetXmlWriter</code> object is not the writer
+     *            this {@code WebRowSetXmlWriter}  object is not the writer
      *            for the given rowset
      * @see XmlWriter#writeXML
      */
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java	Wed Jul 05 20:37:47 2017 +0200
@@ -76,7 +76,7 @@
      * the <code>RowSet</code> object for which this <code>RowSetMetaDataImpl</code>
      * was created. To be valid, a column number must be greater than
      * <code>0</code> and less than or equal to the number of columns in a row.
-     * @throws <code>SQLException</code> with the message "Invalid column index"
+     * @throws SQLException with the message "Invalid column index"
      *        if the given column number is out of the range of valid column
      *        numbers for the <code>RowSet</code> object
      */
--- a/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSigner.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSigner.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,9 +35,11 @@
  *
  * @since 1.5
  * @author Vincent Ryan
+ * @deprecated This package has been deprecated.
  */
 
 @jdk.Exported
+@Deprecated
 public abstract class ContentSigner {
 
     /**
--- a/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSignerParameters.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSignerParameters.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,8 +34,10 @@
  *
  * @since 1.5
  * @author Vincent Ryan
+ * @deprecated This package has been deprecated.
  */
 @jdk.Exported
+@Deprecated
 public interface ContentSignerParameters {
 
     /**
--- a/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/package-info.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/package-info.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,7 +29,10 @@
  * Clients may override the default signing mechanism of the <tt>jarsigner</tt>
  * tool by supplying an alternative implementation of
  * {@link com.sun.jarsigner.ContentSigner}.
+ *
+ * This package has been deprecated.
  */
 
 @jdk.Exported
+@Deprecated
 package com.sun.jarsigner;
--- a/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -75,7 +75,7 @@
  * @author Roland Schemers
  * @author Jan Luehe
  */
-
+@SuppressWarnings("deprecation")
 public class Main {
 
     // for i18n
@@ -396,9 +396,15 @@
             } else if (collator.compare(flags, "-altsigner") ==0) {
                 if (++n == args.length) usageNoArg();
                 altSignerClass = args[n];
+                System.err.println(
+                        rb.getString("This.option.is.deprecated") +
+                                "-altsigner");
             } else if (collator.compare(flags, "-altsignerpath") ==0) {
                 if (++n == args.length) usageNoArg();
                 altSignerClasspath = args[n];
+                System.err.println(
+                        rb.getString("This.option.is.deprecated") +
+                                "-altsignerpath");
             } else if (collator.compare(flags, "-sectionsonly") ==0) {
                 signManifest = false;
             } else if (collator.compare(flags, "-internalsf") ==0) {
@@ -2306,6 +2312,7 @@
      * @param args The command-line arguments to jarsigner.
      * @param zipFile The original source Zip file.
      */
+    @SuppressWarnings("deprecation")
     public Block generateBlock(PrivateKey privateKey,
                                String sigalg,
                                X509Certificate[] certChain,
@@ -2331,6 +2338,7 @@
         /*
          * Construct a new signature block.
          */
+        @SuppressWarnings("deprecation")
         Block(SignatureFile sfg, PrivateKey privateKey, String sigalg,
             X509Certificate[] certChain, boolean externalSF, String tsaUrl,
             X509Certificate tsaCert, String tSAPolicyID, String tSADigestAlg,
@@ -2451,6 +2459,7 @@
 /*
  * This object encapsulates the parameters used to perform content signing.
  */
+@SuppressWarnings("deprecation")
 class JarSignerParameters implements ContentSignerParameters {
 
     private String[] args;
--- a/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java	Wed Jul 05 20:37:47 2017 +0200
@@ -44,6 +44,7 @@
         {"signerClass.is.not.a.signing.mechanism", "{0} is not a signing mechanism"},
         {"jarsigner.error.", "jarsigner error: "},
         {"Illegal.option.", "Illegal option: "},
+        {"This.option.is.deprecated", "This option is deprecated: "},
         {".keystore.must.be.NONE.if.storetype.is.{0}",
                 "-keystore must be NONE if -storetype is {0}"},
         {".keypass.can.not.be.specified.if.storetype.is.{0}",
@@ -91,9 +92,11 @@
         {".tsadigestalg.algorithm.of.digest.data.in.timestamping.request",
                 "[-tsadigestalg <algorithm>] algorithm of digest data in timestamping request"},
         {".altsigner.class.class.name.of.an.alternative.signing.mechanism",
-                "[-altsigner <class>]        class name of an alternative signing mechanism"},
+                "[-altsigner <class>]        class name of an alternative signing mechanism\n" +
+                "                            (This option has been deprecated.)"},
         {".altsignerpath.pathlist.location.of.an.alternative.signing.mechanism",
-                "[-altsignerpath <pathlist>] location of an alternative signing mechanism"},
+                "[-altsignerpath <pathlist>] location of an alternative signing mechanism\n" +
+                "                            (This option has been deprecated.)"},
         {".internalsf.include.the.SF.file.inside.the.signature.block",
                 "[-internalsf]               include the .SF file inside the signature block"},
         {".sectionsonly.don.t.compute.hash.of.entire.manifest",
--- a/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -45,7 +45,7 @@
  *
  * @author Vincent Ryan
  */
-
+@SuppressWarnings("deprecation")
 public final class TimestampedSigner extends ContentSigner {
 
     /*
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java	Wed Jul 05 20:37:47 2017 +0200
@@ -37,7 +37,6 @@
     /**
      * Replaces the default connector.
      *
-     * @return the default {@link LaunchingConnector}
      * @throws java.lang.IllegalArgumentException if the given
      * connector is not a member of the list returned by
      * {@link #launchingConnectors}
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/HostIdentifier.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/HostIdentifier.java	Wed Jul 05 20:37:47 2017 +0200
@@ -81,16 +81,15 @@
  * valid HostIdentifier strings:
  *
  * <ul>
- *   <li><p>&lt null &gt - transformed into "//localhost"</p></li>
- *   <li><p>localhost - transformed into "//localhost"</p></li>
- *   <li><p>hostname - transformed into "//hostname"</p></li>
- *   <li><p>hostname:port - transformed into "//hostname:port"</p></li>
- *   <li><p>proto:hostname - transformed into "proto://hostname"</p></li>
- *   <li><p>proto:hostname:port - transformed into
- *          "proto://hostname:port"</p></li>
- *   <li><p>proto://hostname:port</p></li>
+ *   <li>{@code <null>} - transformed into "//localhost"</li>
+ *   <li>localhost - transformed into "//localhost"</li>
+ *   <li>hostname - transformed into "//hostname"</li>
+ *   <li>hostname:port - transformed into "//hostname:port"</li>
+ *   <li>proto:hostname - transformed into "proto://hostname"</li>
+ *   <li>proto:hostname:port - transformed into
+ *          "proto://hostname:port"</li>
+ *   <li>proto://hostname:port</li>
  * </ul>
- * </p>
  *
  * @see URI
  * @see VmIdentifier
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/MonitoredVm.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/MonitoredVm.java	Wed Jul 05 20:37:47 2017 +0200
@@ -74,9 +74,10 @@
      *
      * @param patternString a string containing a pattern as described in
      *                      {@link java.util.regex.Pattern}.
-     * @return List<Monitor> - a List of {@link Monitor} objects that can be used to
+     * @return {@code List<Monitor>} - a List of {@link Monitor}
+     *                objects that can be used to
      *                monitor the instrumentation objects whose names match
-     *                the given pattern. If no instrumentation objects have`
+     *                the given pattern. If no instrumentation objects have
      *                names matching the given pattern, then an empty List
      *                is returned.
      * @throws MonitorException Thrown if an error occurs while communicating
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/VmIdentifier.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/VmIdentifier.java	Wed Jul 05 20:37:47 2017 +0200
@@ -39,86 +39,85 @@
  *      [<I>protocol</I>:][<I>//</I>]<I><B>lvmid</B></I>[<I>@hostname</I>][<I>:port</I>][<I>/servername</I>]
  * </pre>
  * The only required component of this string is the Local Virtual Machine
- * Identifier, or <tt>lvmid</tt>, which uniquely identifies the target
+ * Identifier, or {@code lvmid}, which uniquely identifies the target
  * Java Virtual Machine on a host. The optional components of the VmIdentifier
  * include:
  * <ul>
- *   <li><p><tt>protocol</tt> - The communications protocol. A VmIdentifier
- *          omitting the protocol must be resolved against a HostIdentifier
- *          using {@link HostIdentifier#resolve}.
- *       </p></li>
- *   <li><p><tt>hostname</tt> - A hostname or IP address indicating the target
- *          host. A VmIdentifier omitting the protocol must be resolved
- *          against a HostIdentifier using {@link HostIdentifier#resolve}.
- *       </p></li>
- *   <li><p><tt>port</tt> - The port for the communications protocol.
- *          Treatment of the <tt>port</tt> parameter is implementation
- *          (protocol) specific. A VmIdentifier omitting the protocol should
- *          be resolved against a HostIdentifier using
- *          {@link HostIdentifier#resolve}.
- *       </p></li>
- *   <li><p><tt>servername</tt> - The treatment of the Path, Query, and
- *          Fragment components of the VmIdentifier are implementation
- *          (protocol) dependent. A VmIdentifier omitting the protocol should
- *          be resolved against a HostIdentifier using
- *          {@link HostIdentifier#resolve}.
- *       </p></li>
+ *   <li>{@code protocol} - The communications protocol. A VmIdentifier
+ *       omitting the protocol must be resolved against a HostIdentifier
+ *       using {@link HostIdentifier#resolve}.
+ *       </li>
+ *   <li>{@code hostname} - A hostname or IP address indicating the target
+ *       host. A VmIdentifier omitting the protocol must be resolved
+ *       against a HostIdentifier using {@link HostIdentifier#resolve}.
+ *       </li>
+ *   <li>{@code port} - The port for the communications protocol.
+ *       Treatment of the {@code port} parameter is implementation
+ *       (protocol) specific. A VmIdentifier omitting the protocol should
+ *       be resolved against a HostIdentifier using
+ *       {@link HostIdentifier#resolve}.
+ *       </li>
+ *   <li>{@code servername} - The treatment of the Path, Query, and
+ *       Fragment components of the VmIdentifier are implementation
+ *       (protocol) dependent. A VmIdentifier omitting the protocol should
+ *       be resolved against a HostIdentifier using
+ *       {@link HostIdentifier#resolve}.
+ *       </li>
  * </ul>
  * <p>
  * All VmIdentifier instances are constructed as absolute, hierarchical URIs.
  * The constructors will accept relative (and even some malformed,
  * though convenient) URI strings. Such strings are transformed into
  * legitimate, absolute URI strings.
- * </p>
  * <p>
  * With the exception of <em>file:</em> based VmIdentifier strings, all
- * VmIdentifier strings must include a <tt>lvmid</tt>. Attempting to construct
- * a non-file based VmIdentifier that doesn't include a <tt>lvmid</tt>
- * component will result in a <tt>MonitorException</tt>.
- * </p>
+ * VmIdentifier strings must include a {@code lvmid}. Attempting to construct
+ * a non-file based VmIdentifier that doesn't include a {@code lvmid}
+ * component will result in a {@code MonitorException}.
  * <p>
  * Here are some examples of VmIdentifier strings.
  * <ul>
- *    <li><p>Relative URIs</p></li>
+ *    <li>Relative URIs
  *      <ul>
- *         <li><p><em>1234</em> - Specifies the Java Virtual Machine
- *                identified by lvmid <em>1234</em> on an unnamed host.
- *                This string is transformed into the absolute form
- *                <em>//1234</em>, which must be resolved against a
- *                HostIdentifier.
- *         </p></li>
- *         <li><p><em>1234@hostname</em> - Specifies the Java Virtual
- *                Machine identified by lvmid <em>1234</em> on host
- *                <em>hostname</em> with an unnamed protocol.
- *                This string is transformed into the absolute form
- *                <em>//1234@hostname</em>, which must be resolved against
- *                a HostIdentifier.
- *         </p></li>
- *         <li><p><em>1234@hostname:2099</em> - Specifies the Java Virtual
- *                Machine identified by lvmid <em>1234</em> on host
- *                <em>hostname</em> with an unnamed protocol, but with
- *                port <em>2099</em>. This string is transformed into
- *                the absolute form <em>//1234@hostname:2099</em>, which
- *                must be resolved against a HostIdentifier.
- *         </p></li>
+ *         <li><em>1234</em> - Specifies the Java Virtual Machine
+ *             identified by lvmid <em>1234</em> on an unnamed host.
+ *             This string is transformed into the absolute form
+ *             <em>//1234</em>, which must be resolved against a
+ *             HostIdentifier.
+ *         </li>
+ *         <li><em>1234@hostname</em> - Specifies the Java Virtual
+ *             Machine identified by lvmid <em>1234</em> on host
+ *             <em>hostname</em> with an unnamed protocol.
+ *             This string is transformed into the absolute form
+ *             <em>//1234@hostname</em>, which must be resolved against
+ *             a HostIdentifier.
+ *         </li>
+ *         <li><em>1234@hostname:2099</em> - Specifies the Java Virtual
+ *             Machine identified by lvmid <em>1234</em> on host
+ *             <em>hostname</em> with an unnamed protocol, but with
+ *             port <em>2099</em>. This string is transformed into
+ *             the absolute form <em>//1234@hostname:2099</em>, which
+ *             must be resolved against a HostIdentifier.
+ *         </li>
  *      </ul>
- *    <li><p>Absolute URIs</p></li>
+ *    </li>
+ *    <li>Absolute URIs
  *      <ul>
- *         <li><p><em>rmi://1234@hostname:2099/remoteobjectname</em> -
- *                Specifies the Java Virtual Machine identified by lvmid
- *                <em>1234</em> on host <em>hostname</em> accessed
- *                using the <em>rmi:</em> protocol through the rmi remote
- *                object named <em>remoteobjectname</em> as registered with
- *                the <em>rmiserver</em> on port <em>2099</em> on host
- *                <em>hostname</em>.
- *         </p></li>
- *         <li><p><em>file:/path/file</em> - Identifies a Java Virtual Machine
- *                through accessing a special file based protocol to use as
- *                the communications mechanism.
- *         </p></li>
+ *         <li><em>rmi://1234@hostname:2099/remoteobjectname</em> -
+ *             Specifies the Java Virtual Machine identified by lvmid
+ *             <em>1234</em> on host <em>hostname</em> accessed
+ *             using the <em>rmi:</em> protocol through the rmi remote
+ *             object named <em>remoteobjectname</em> as registered with
+ *             the <em>rmiserver</em> on port <em>2099</em> on host
+ *             <em>hostname</em>.
+ *         </li>
+ *         <li><em>file:/path/file</em> - Identifies a Java Virtual Machine
+ *             through accessing a special file based protocol to use as
+ *             the communications mechanism.
+ *         </li>
  *      </ul>
+ *    </li>
  * </ul>
- * </p>
  *
  * @see URI
  * @see HostIdentifier
@@ -236,16 +235,14 @@
      * missing components will have result in the HostIdentifier assigning
      * assumed defaults that allow the VmIdentifier to be resolved according
      * to those defaults.
-     * </p>
      * <p>
-     * For example, a VmIdentifier that specifies only a <tt>lvmid</tt>
+     * For example, a VmIdentifier that specifies only a {@code lvmid}
      * will result in a HostIdentifier for <em>localhost</em> utilizing
      * the default local protocol, <em>local:</em>. A VmIdentifier that
-     * specifies both a <tt>vmid</tt> and a <tt>hostname</tt> will result
+     * specifies both a {@code vmid} and a {@code hostname} will result
      * in a HostIdentifier for the specified host with the default remote
      * protocol, <em>rmi:</em>, using the protocol defaults for the
-     * <tt>port</tt> and <tt>servername</tt> components.
-     * </p>
+     * {@code port} and {@code servername} components.
      *
      * @return HostIdentifier - the host identifier for the host containing
      *                          the Java Virtual Machine represented by this
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/AbstractPerfDataBuffer.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/AbstractPerfDataBuffer.java	Wed Jul 05 20:37:47 2017 +0200
@@ -108,7 +108,8 @@
      *
      * @param patternString  a string containing a pattern as described in
      *                       {@link java.util.regex.Pattern}.
-     * @return List<Monitor> - a List of {@link Monitor} objects that can be used to
+     * @return {@code List<Monitor>} - a List of {@link Monitor}
+     *                objects that can be used to
      *                monitor the instrumentation objects whose names match
      *                the given pattern. If no instrumentation objects have`
      *                names matching the given pattern, then an empty List
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java	Wed Jul 05 20:37:47 2017 +0200
@@ -266,7 +266,8 @@
      *
      * @param patternString a string containing a pattern as described in
      *                      {@link java.util.regex.Pattern}.
-     * @return List<Monitor> - a List of {@link Monitor} objects that can be used to
+     * @return {@code List<Monitor>} - a List of {@link Monitor}
+     *                objects that can be used to
      *                monitor the instrumentation objects whose names match
      *                the given pattern. If no instrumentation objects have`
      *                names matching the given pattern, then an empty List
--- a/jdk/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java	Wed Jul 05 20:37:47 2017 +0200
@@ -580,7 +580,7 @@
      * Serializes only the domain name string, for compactness and to avoid
      * any implementation dependency.
      *
-     * @serialdata      The domain name string.
+     * @serialData      The domain name string.
      */
     private void writeObject(java.io.ObjectOutputStream s)
             throws java.io.IOException {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 7130985
+ * @summary Four helper classes missing in Sun JDK
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @run main CorbaExceptionsCompileTest
+ */
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.rmi.RemoteException;
+import org.omg.CORBA.ORBPackage.InvalidName;
+import org.omg.CORBA.TypeCodePackage.BadKind;
+import org.omg.CORBA.TypeCodePackage.Bounds;
+
+import jdk.testlibrary.FileUtils;
+import jdk.testlibrary.JDKToolLauncher;
+
+public class CorbaExceptionsCompileTest implements CorbaExceptionsTest {
+
+    public CorbaExceptionsCompileTest() {
+        super();
+    }
+
+    public void testExceptionInvalidName()
+        throws java.rmi.RemoteException, InvalidName {}
+
+    public void testExceptionBounds()
+        throws java.rmi.RemoteException, Bounds {}
+
+    public void testExceptionBadKind()
+        throws java.rmi.RemoteException, BadKind {}
+
+    public void testExceptionCorba_Bounds()
+        throws java.rmi.RemoteException, org.omg.CORBA.Bounds {}
+
+    public static void main(String[] args) throws Exception {
+        final File f = new File(
+            CorbaExceptionsCompileTest.class.getProtectionDomain()
+                .getCodeSource().getLocation().getPath());
+        System.out.println(f.getCanonicalPath());
+        ProcessBuilder pb = new ProcessBuilder("ls", "-l");
+        pb.directory(f);
+        Process p = pb.start();
+        p.waitFor();
+        if (p.exitValue() == 0) {
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(p.getInputStream()))) {
+                StringBuilder builder = new StringBuilder();
+                String line = null;
+                while ( (line = br.readLine()) != null) {
+                    builder.append(line + "\n");
+                }
+                String result = builder.toString();
+                System.out.println(result);
+            }
+        }
+
+        Path outDir = Paths.get("CorbaExceptionsCompileTest-compiled");
+        outDir = Files.createDirectory(outDir).toAbsolutePath();
+        JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("rmic");
+        launcher.addToolArg("-classpath").addToolArg(f.getCanonicalPath())
+            .addToolArg("-d").addToolArg(outDir.toString())
+            .addToolArg("-iiop").addToolArg("CorbaExceptionsCompileTest");
+
+        pb = new ProcessBuilder(launcher.getCommand());
+        pb.directory(f);
+        System.out.println("Working Directory: " + pb.directory());
+        System.out.println("CorbaExceptionsCompileTest.class exists: "
+            + new File(f, "CorbaExceptionsCompileTest.class").exists());
+
+        p = pb.start();
+        p.waitFor();
+        if (p.exitValue() != 0) {
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(p.getInputStream()))) {
+                StringBuilder builder = new StringBuilder();
+                String line = null;
+                while ( (line = br.readLine()) != null) {
+                    builder.append(line + "\n");
+                }
+                String result = builder.toString();
+                System.out.println(result);
+                throw new RuntimeException(launcher.getCommand() +
+                    " -iiop CorbaExceptionsCompileTest failed with status: "
+                    + p.exitValue());
+            }
+        }
+
+        if (Files.exists(outDir))
+            FileUtils.deleteFileTreeWithRetry(outDir);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/corba/7130985/CorbaExceptionsTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.rmi.Remote;
+import org.omg.CORBA.ORBPackage.InvalidName;
+import org.omg.CORBA.TypeCodePackage.BadKind;
+import org.omg.CORBA.TypeCodePackage.Bounds;
+
+public interface CorbaExceptionsTest extends Remote {
+     public void testExceptionInvalidName() throws java.rmi.RemoteException, InvalidName;
+     public void testExceptionBounds() throws java.rmi.RemoteException, Bounds;
+     public void testExceptionBadKind() throws java.rmi.RemoteException, BadKind;
+     public void testExceptionCorba_Bounds() throws java.rmi.RemoteException, org.omg.CORBA.Bounds;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/io/FilePermission/FilePermissionCollection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for FilePermissionCollection subclass
+ */
+
+import java.io.FilePermission;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+
+public class FilePermissionCollection {
+
+    public static void main(String[] args) throws Exception {
+
+        int testFail = 0;
+
+        FilePermission perm = new FilePermission("/tmp/foo", "read");
+        PermissionCollection perms = perm.newPermissionCollection();
+
+        // test 1
+        System.out.println
+            ("test 1: add throws IllegalArgExc for wrong perm type");
+        try {
+            perms.add(new SecurityPermission("createAccessControlContext"));
+            System.err.println("Expected IllegalArgumentException");
+            testFail++;
+        } catch (IllegalArgumentException iae) {}
+
+        // test 2
+        System.out.println("test 2: implies returns false for wrong perm type");
+        if (perms.implies(new SecurityPermission("getPolicy"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 3
+        System.out.println("test 3: implies returns true for match on " +
+                           "name and action");
+        perms.add(new FilePermission("/tmp/foo", "read"));
+        if (!perms.implies(new FilePermission("/tmp/foo", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 4
+        System.out.println("test 4: implies returns false for match on " +
+                           "name but not action");
+        if (perms.implies(new FilePermission("/tmp/foo", "write"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 5
+        System.out.println("test 5: implies returns true for match on " +
+                           "name and subset of actions");
+        perms.add(new FilePermission("/tmp/bar", "read, write"));
+        if (!perms.implies(new FilePermission("/tmp/bar", "write"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 6
+        System.out.println("test 6: implies returns true for aggregate " +
+                           "match on name and action");
+        perms.add(new FilePermission("/tmp/baz", "read"));
+        perms.add(new FilePermission("/tmp/baz", "write"));
+        if (!perms.implies(new FilePermission("/tmp/baz", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+        if (!perms.implies(new FilePermission("/tmp/baz", "write,read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 7
+        System.out.println("test 7: implies returns true for wildcard " +
+                           "and match on action");
+        perms.add(new FilePermission("/usr/tmp/*", "read"));
+        if (!perms.implies(new FilePermission("/usr/tmp/foo", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 8
+        System.out.println
+            ("test 8: implies returns false for non-match on wildcard");
+        if (perms.implies(new FilePermission("/usr/tmp/bar/foo", "read"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 9
+        System.out.println
+            ("test 9: implies returns true for deep wildcard match");
+        perms.add(new FilePermission("/usr/tmp/-", "read"));
+        if (!perms.implies(new FilePermission("/usr/tmp/bar/foo", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 10
+        System.out.println("test 10: implies returns true for relative match");
+        perms.add(new FilePermission(".", "read"));
+        if (!perms.implies(new FilePermission(System.getProperty("user.dir"),
+                                              "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 11
+        System.out.println("test 11: implies returns true for all " +
+                           "wildcard and match on action");
+        perms.add(new FilePermission("<<ALL FILES>>", "read"));
+        if (!perms.implies(new FilePermission("/tmp/foobar", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 12
+        System.out.println("test 12: implies returns false for wildcard " +
+                           "and non-match on action");
+        if (perms.implies(new FilePermission("/tmp/foobar", "write"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 13
+        System.out.println("test 13: elements returns correct number of perms");
+        int numPerms = 0;
+        Enumeration<Permission> e = perms.elements();
+        while (e.hasMoreElements()) {
+            numPerms++;
+            System.out.println(e.nextElement());
+        }
+        // the two "/tmp/baz" entries were combined into one
+        if (numPerms != 7) {
+            System.err.println("Expected 7, got " + numPerms);
+            testFail++;
+        }
+
+        if (testFail > 0) {
+            throw new Exception(testFail + " test(s) failed");
+        }
+    }
+}
--- a/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java	Wed Jul 05 20:37:47 2017 +0200
@@ -48,20 +48,21 @@
         UnixCommands.ensureCommandsAvailable("cat");
 
         Process p = runtime.exec(UnixCommands.cat() + " /dev/zero");
-        long initMemory = usedMemory();
-        boolean growing = false;
+        long prev = usedMemory();
+        int growing = 0;
         for (int i = 1; i < 10; i++) {
             Thread.sleep(100);
             long used = usedMemory();
-            if (used != initMemory) {
-                System.out.printf("consuming memory: i: %d, initial: %d, used: %d, delta: %d%n",
-                        i, initMemory, used, used - initMemory);
+            if (used != prev) {
+                System.out.printf("consuming memory: i: %d, prev: %d, used: %d, delta: %d%n",
+                        i, prev, used, used - prev);
             }
-            if (used > initMemory + THRESHOLD)
-                growing = true;
+            if (used > prev + THRESHOLD)
+                growing += 1;
+            prev = used;
         }
-        if (growing)
-            throw new Exception("Process consumes memory.");
+        if (growing > 2)
+            throw new Exception("Process consumes memory: growing " + growing);
 
     }
 }
--- a/jdk/test/java/lang/invoke/8022701/InvokeSeveralWays.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/java/lang/invoke/8022701/InvokeSeveralWays.java	Wed Jul 05 20:37:47 2017 +0200
@@ -38,12 +38,19 @@
             failures++;
         } catch (InvocationTargetException e) {
             Throwable c = e.getCause();
-            if (expected.isInstance(c))
-               System.out.println("EXPECTED: " + expected.getName() + ", "+ c);
-            else {
-               failures++;
-               System.out.println("FAIL: Unexpected wrapped exception " + c);
-               e.printStackTrace(System.out);
+            if (BootstrapMethodError.class.isInstance(c)) {
+                c = c.getCause();
+                if (expected.isInstance(c))
+                    System.out.println("EXPECTED: " + expected.getName() + ", "+ c);
+                else {
+                    failures++;
+                    System.out.println("FAIL: Unexpected wrapped exception " + c);
+                    e.printStackTrace(System.out);
+                }
+            } else {
+                failures++;
+                System.out.println("FAIL: Exception from MethodHandle invocation not wrapped in BootstrapMethodError " + c);
+                e.printStackTrace(System.out);
             }
         } catch (Throwable e) {
             failures++;
@@ -74,14 +81,19 @@
             Invoker.invoke();
             System.out.println("FAIL: No exception throw, probably failed to load modified bytecodes for MethodSupplier");
             failures++;
-        } catch (Throwable e) {
-            if (expected.isInstance(e))
-               System.out.println("EXPECTED: " + expected.getName() + ", "+ e);
+        } catch (BootstrapMethodError e) {
+            Throwable c = e.getCause();
+            if (expected.isInstance(c))
+                System.out.println("EXPECTED: " + expected.getName() + ", "+ c);
             else {
+                failures++;
+                System.out.println("FAIL: Unexpected exception has been caught " + c);
+                e.printStackTrace(System.out);
+            }
+        } catch (Throwable e) {
             failures++;
-            System.out.println("FAIL: Unexpected exception has been caught " + e);
+            System.out.println("FAIL: Exception from MethodHandle invocation not wrapped in BootstrapMethodError " + e);
             e.printStackTrace(System.out);
-            }
         }
         System.out.println();
         try {
--- a/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
 /*
  * @test LFGarbageCollectedTest
  * @bug 8046703
+ * @ignore 8078602
  * @summary Test verifies that lambda forms are garbage collected
  * @author kshefov
  * @library /lib/testlibrary/jsr292 /lib/testlibrary
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/SocketPermission/SocketPermissionCollection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for PermissionCollection subclasses
+ */
+
+import java.net.SocketPermission;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+
+public class SocketPermissionCollection {
+
+    public static void main(String[] args) throws Exception {
+
+        int testFail = 0;
+
+        SocketPermission perm = new SocketPermission("www.example.com",
+                                                     "connect");
+        PermissionCollection perms = perm.newPermissionCollection();
+
+        // test 1
+        System.out.println
+            ("test 1: add throws IllegalArgExc for wrong perm type");
+        try {
+            perms.add(new SecurityPermission("createAccessControlContext"));
+            System.err.println("Expected IllegalArgumentException");
+            testFail++;
+        } catch (IllegalArgumentException iae) {}
+
+        // test 2
+        System.out.println("test 2: implies returns false for wrong perm type");
+        if (perms.implies(new SecurityPermission("getPolicy"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 3
+        System.out.println
+            ("test 3: implies returns true for match on name and action");
+        perms.add(new SocketPermission("www.example.com", "connect"));
+        if (!perms.implies(new SocketPermission("www.example.com", "connect"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 4
+        System.out.println
+            ("test 4: implies returns false for match on name but not action");
+        if (perms.implies(new SocketPermission("www.example.com", "accept"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 5
+        System.out.println("test 5: implies returns true for match on " +
+                           "name and subset of actions");
+        perms.add(new SocketPermission("www.example.org", "accept, connect"));
+        if (!perms.implies(new SocketPermission("www.example.org", "connect"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 6
+        System.out.println("test 6: implies returns true for aggregate " +
+                           "match on name and action");
+        perms.add(new SocketPermission("www.example.us", "accept"));
+        perms.add(new SocketPermission("www.example.us", "connect"));
+        if (!perms.implies(new SocketPermission("www.example.us", "accept"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+        if (!perms.implies(new SocketPermission("www.example.us",
+                                                "connect,accept"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 7
+        System.out.println("test 7: implies returns true for wildcard " +
+                           "and match on action");
+        perms.add(new SocketPermission("*.example.edu", "resolve"));
+        if (!perms.implies(new SocketPermission("foo.example.edu", "resolve"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 8
+        System.out.println("test 8: implies returns false for non-match " +
+                           "on wildcard");
+        if (perms.implies(new SocketPermission("foo.example.edu", "connect"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 9
+        System.out.println("test 9: implies returns true for matching " +
+                           "port range and action");
+        perms.add(new SocketPermission("204.160.241.0:1024-65535", "connect"));
+        if (!perms.implies(new SocketPermission("204.160.241.0:1025", "connect"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 13
+        System.out.println("test 13: elements returns correct number of perms");
+        int numPerms = 0;
+        Enumeration<Permission> e = perms.elements();
+        while (e.hasMoreElements()) {
+            numPerms++;
+            System.out.println(e.nextElement());
+        }
+        // the two "/tmp/baz" entries were combined into one
+        if (numPerms != 5) {
+            System.err.println("Expected 5, got " + numPerms);
+            testFail++;
+        }
+
+        if (testFail > 0) {
+            throw new Exception(testFail + " test(s) failed");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/BasicPermission/BasicPermissionCollection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for BasicPermissionCollection subclass
+ */
+
+import java.security.BasicPermission;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+
+public class BasicPermissionCollection {
+
+    public static void main(String[] args) throws Exception {
+
+        int testFail = 0;
+
+        TestPermission perm = new TestPermission("foo");
+        PermissionCollection perms = perm.newPermissionCollection();
+
+        // test 1
+        System.out.println("test 1: add throws IllegalArgumentExc");
+        try {
+            perms.add(new SecurityPermission("createAccessControlContext"));
+            System.err.println("Expected IllegalArgumentException");
+            testFail++;
+        } catch (IllegalArgumentException iae) {}
+
+        // test 2
+        System.out.println("test 2: implies returns false for wrong class");
+        if (perms.implies(new SecurityPermission("getPolicy"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 3
+        System.out.println("test 3: implies returns true for match on name");
+        perms.add(new TestPermission("foo"));
+        if (!perms.implies(new TestPermission("foo"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 4
+        System.out.println("test 4: implies returns true for wildcard match");
+        perms.add(new TestPermission("bar.*"));
+        if (!perms.implies(new TestPermission("bar.foo"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 5
+        System.out.println
+            ("test 5: implies returns false for invalid wildcard");
+        perms.add(new TestPermission("baz*"));
+        if (perms.implies(new TestPermission("baz.foo"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 6
+        System.out.println
+            ("test 6: implies returns true for deep wildcard match");
+        if (!perms.implies(new TestPermission("bar.foo.baz"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 7
+        System.out.println
+            ("test 7: implies returns true for all wildcard match");
+        perms.add(new TestPermission("*"));
+        if (!perms.implies(new TestPermission("yes"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 8
+        System.out.println("test 8: elements returns correct number of perms");
+        int numPerms = 0;
+        Enumeration<Permission> e = perms.elements();
+        while (e.hasMoreElements()) {
+            numPerms++;
+            System.out.println(e.nextElement());
+        }
+        if (numPerms != 4) {
+            System.err.println("Expected 4, got " + numPerms);
+            testFail++;
+        }
+
+        if (testFail > 0) {
+            throw new Exception(testFail + " test(s) failed");
+        }
+    }
+
+    private static class TestPermission extends BasicPermission {
+        TestPermission(String name) {
+            super(name);
+        }
+    }
+}
--- a/jdk/test/java/security/PermissionCollection/Concurrent.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/java/security/PermissionCollection/Concurrent.java	Wed Jul 05 20:37:47 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -104,13 +104,11 @@
                     System.out.println(perm[perm.length-1] + " implies " + result);
                 }
 
-                synchronized (pc) {
-                    Enumeration en = pc.elements();
-                    while (en.hasMoreElements()) {
-                        Object obj = en.nextElement();
-                        if (debug) {
-                            System.out.println(obj);
-                        }
+                Enumeration en = pc.elements();
+                while (en.hasMoreElements()) {
+                    Object obj = en.nextElement();
+                    if (debug) {
+                        System.out.println(obj);
                     }
                 }
             }
@@ -151,13 +149,11 @@
                     }
                 }
 
-                synchronized (pc) {
-                    Enumeration en = pc.elements();
-                    while (en.hasMoreElements()) {
-                        Object obj = en.nextElement();
-                        if (debug) {
-                            System.out.println(obj);
-                        }
+                Enumeration en = pc.elements();
+                while (en.hasMoreElements()) {
+                    Object obj = en.nextElement();
+                    if (debug) {
+                        System.out.println(obj);
                     }
                 }
             }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Format/DateFormat/LocaleDateFormats.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8080774
+ * @run testng/othervm -Djava.locale.providers=JRE,CLDR LocaleDateFormats
+ * @summary This file contains tests for JRE locales date formats
+ */
+
+import java.text.DateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class LocaleDateFormats {
+
+    @Test(dataProvider = "dateFormats")
+    public void testDateFormat(Locale loc, int style, int year, int month, int date, String expectedString) {
+        Calendar cal = Calendar.getInstance(loc);
+        cal.set(year, month-1, date);
+        // Create date formatter based on requested style and test locale
+        DateFormat df = DateFormat.getDateInstance(style, loc);
+        // Test the date format
+        assertEquals(df.format(cal.getTime()), expectedString);
+    }
+
+    @DataProvider(name = "dateFormats" )
+    private Object[][] dateFormats() {
+        return new Object[][] {
+            //8080774
+            //Locale, Format type, year, month, date, expected result
+            {localeEnSG, DateFormat.SHORT, 2015, 5, 6, "6/5/15"},
+            {localeEnSG, DateFormat.MEDIUM, 2015, 5, 6, "6 May, 2015"},
+            {localeEnSG, DateFormat.LONG, 2015, 5, 6, "6 May, 2015"},
+            {localeEnSG, DateFormat.FULL, 2015, 5, 6, "Wednesday, 6 May, 2015"}
+        };
+    }
+    // en_SG Locale instance
+    private static final Locale localeEnSG = new Locale("en", "SG");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Arrays/SortingIntBenchmarkTestJMH.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,708 @@
+/*
+ * Copyright 2015 Goldman Sachs.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@State(Scope.Thread)
+@BenchmarkMode(Mode.Throughput)
+@OutputTimeUnit(TimeUnit.SECONDS)
+public class SortingIntBenchmarkTestJMH {
+    private static final int QUICKSORT_THRESHOLD = 286;
+    private static final int MAX_RUN_COUNT = 67;
+    private static final int INSERTION_SORT_THRESHOLD = 47;
+    public static final int MAX_VALUE = 1_000_000;
+
+    @Param({"pairFlipZeroPairFlip", "pairFlipOneHundredPairFlip"
+            , "zeroHi", "hiZeroLow", "hiFlatLow", "identical",
+            "randomDups", "randomNoDups", "sortedReversedSorted", "pairFlip", "endLessThan"})
+
+    public String listType;
+
+    private int[] array;
+    private static final int LIST_SIZE = 10_000_000;
+    public static final int NUMBER_OF_ITERATIONS = 10;
+
+    @Setup
+    public void setUp() {
+        Random random = new Random(123456789012345L);
+        this.array = new int[LIST_SIZE];
+        int threeQuarters = (int) (LIST_SIZE * 0.75);
+        if ("zeroHi".equals(this.listType)) {
+            for (int i = 0; i < threeQuarters; i++) {
+                this.array[i] = 0;
+            }
+            int k = 1;
+            for (int i = threeQuarters; i < LIST_SIZE; i++) {
+                this.array[i] = k;
+                k++;
+            }
+        }
+        else if ("hiFlatLow".equals(this.listType)) {
+            int oneThird = LIST_SIZE / 3;
+            for (int i = 0; i < oneThird; i++) {
+                this.array[i] = i;
+            }
+            int twoThirds = oneThird * 2;
+            int constant = oneThird - 1;
+            for (int i = oneThird; i < twoThirds; i++) {
+                this.array[i] = constant;
+            }
+            for (int i = twoThirds; i < LIST_SIZE; i++) {
+                this.array[i] = constant - i + twoThirds;
+            }
+        }
+        else if ("hiZeroLow".equals(this.listType)) {
+            int oneThird = LIST_SIZE / 3;
+            for (int i = 0; i < oneThird; i++) {
+                this.array[i] = i;
+            }
+            int twoThirds = oneThird * 2;
+            for (int i = oneThird; i < twoThirds; i++) {
+                this.array[i] = 0;
+            }
+            for (int i = twoThirds; i < LIST_SIZE; i++) {
+                this.array[i] = oneThird - i + twoThirds;
+            }
+        }
+        else if ("identical".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE; i++) {
+                this.array[i] = 0;
+            }
+        }
+        else if ("randomDups".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE; i++) {
+                this.array[i] = random.nextInt(1000);
+            }
+        }
+        else if ("randomNoDups".equals(this.listType)) {
+            Set<Integer> set = new HashSet();
+            while (set.size() < LIST_SIZE + 1) {
+                set.add(random.nextInt());
+            }
+            List<Integer> list = new ArrayList<>(LIST_SIZE);
+            list.addAll(set);
+            for (int i = 0; i < LIST_SIZE; i++) {
+                this.array[i] = list.get(i);
+            }
+        }
+        else if ("sortedReversedSorted".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE / 2; i++) {
+                this.array[i] = i;
+            }
+            int num = 0;
+            for (int i = LIST_SIZE / 2; i < LIST_SIZE; i++) {
+                this.array[i] = LIST_SIZE - num;
+                num++;
+            }
+        }
+        else if ("pairFlip".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE; i++) {
+                this.array[i] = i;
+            }
+            for (int i = 0; i < LIST_SIZE; i += 2) {
+                int temp = this.array[i];
+                this.array[i] = this.array[i + 1];
+                this.array[i + 1] = temp;
+            }
+        }
+        else if ("endLessThan".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE - 1; i++) {
+                this.array[i] = 3;
+            }
+            this.array[LIST_SIZE - 1] = 1;
+        }
+        else if ("pairFlipZeroPairFlip".equals(this.listType)) {
+            //pairflip
+            for (int i = 0; i < 64; i++) {
+                this.array[i] = i;
+            }
+            for (int i = 0; i < 64; i += 2) {
+                int temp = this.array[i];
+                this.array[i] = this.array[i + 1];
+                this.array[i + 1] = temp;
+            }
+            //zero
+            for (int i = 64; i < this.array.length - 64; i++) {
+                this.array[i] = 0;
+            }
+            //pairflip
+            for (int i = this.array.length - 64; i < this.array.length; i++) {
+                this.array[i] = i;
+            }
+            for (int i = this.array.length - 64; i < this.array.length; i += 2) {
+                int temp = this.array[i];
+                this.array[i] = this.array[i + 1];
+                this.array[i + 1] = temp;
+            }
+        }
+        else if ("pairFlipOneHundredPairFlip".equals(this.listType)) {
+            //10, 5
+            for (int i = 0; i < 64; i++) {
+                if (i % 2 == 0) {
+                    this.array[i] = 10;
+                }
+                else {
+                    this.array[i] = 5;
+                }
+            }
+
+            //100
+            for (int i = 64; i < this.array.length - 64; i++) {
+                this.array[i] = 100;
+            }
+
+            //10, 5
+            for (int i = this.array.length - 64; i < this.array.length; i++) {
+                if (i % 2 == 0) {
+                    this.array[i] = 10;
+                }
+                else {
+                    this.array[i] = 5;
+                }
+            }
+        }
+    }
+
+    @Warmup(iterations = 20)
+    @Measurement(iterations = 10)
+    @Benchmark
+    public void sortNewWay() {
+        for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
+            SortingIntTestJMH.sort(this.array, 0, this.array.length - 1, null, 0, 0);
+        }
+    }
+
+    @Warmup(iterations = 20)
+    @Measurement(iterations = 10)
+    @Benchmark
+    public void sortCurrentWay() {
+        for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
+            Arrays.sort(this.array);
+        }
+    }
+
+    static void sort(int[] a, int left, int right,
+                     int[] work, int workBase, int workLen) {
+        // Use Quicksort on small arrays
+        if (right - left < QUICKSORT_THRESHOLD) {
+            SortingIntTestJMH.sort(a, left, right, true);
+            return;
+        }
+
+         /*
+         * Index run[i] is the start of i-th run
+         * (ascending or descending sequence).
+         */
+        int[] run = new int[MAX_RUN_COUNT + 1];
+        int count = 0;
+        run[0] = left;
+
+        // Check if the array is nearly sorted
+        for (int k = left; k < right; run[count] = k) {
+            while (k < right && a[k] == a[k + 1])
+                k++;
+            if (k == right) break;
+            if (a[k] < a[k + 1]) { // ascending
+                while (++k <= right && a[k - 1] <= a[k]) ;
+            }
+            else if (a[k] > a[k + 1]) { // descending
+                while (++k <= right && a[k - 1] >= a[k]) ;
+                for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
+                    int t = a[lo];
+                    a[lo] = a[hi];
+                    a[hi] = t;
+                }
+            }
+            if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+                count--;
+            }
+            /*
+             * The array is not highly structured,
+             * use Quicksort instead of merge sort.
+             */
+            if (++count == MAX_RUN_COUNT) {
+                sort(a, left, right, true);
+                return;
+            }
+        }
+
+        // Check special cases
+        // Implementation note: variable "right" is increased by 1.
+        if (run[count] == right++) {
+            run[++count] = right;
+        }
+        if (count <= 1) { // The array is already sorted
+            return;
+        }
+
+        // Determine alternation base for merge
+        byte odd = 0;
+        for (int n = 1; (n <<= 1) < count; odd ^= 1) {
+        }
+
+        // Use or create temporary array b for merging
+        int[] b;                 // temp array; alternates with a
+        int ao, bo;                 // array offsets from 'left'
+        int blen = right - left; // space needed for b
+        if (work == null || workLen < blen || workBase + blen > work.length) {
+            work = new int[blen];
+            workBase = 0;
+        }
+        if (odd == 0) {
+            System.arraycopy(a, left, work, workBase, blen);
+            b = a;
+            bo = 0;
+            a = work;
+            ao = workBase - left;
+        }
+        else {
+            b = work;
+            ao = 0;
+            bo = workBase - left;
+        }
+
+        // Merging
+        for (int last; count > 1; count = last) {
+            for (int k = (last = 0) + 2; k <= count; k += 2) {
+                int hi = run[k], mi = run[k - 1];
+                for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
+                    if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) {
+                        b[i + bo] = a[p++ + ao];
+                    }
+                    else {
+                        b[i + bo] = a[q++ + ao];
+                    }
+                }
+                run[++last] = hi;
+            }
+            if ((count & 1) != 0) {
+                for (int i = right, lo = run[count - 1]; --i >= lo;
+                     b[i + bo] = a[i + ao]
+                        ) {
+                }
+                run[++last] = right;
+            }
+            int[] t = a;
+            a = b;
+            b = t;
+            int o = ao;
+            ao = bo;
+            bo = o;
+        }
+    }
+
+    private static void sort(int[] a, int left, int right, boolean leftmost) {
+        int length = right - left + 1;
+
+        // Use insertion sort on tiny arrays
+        if (length < INSERTION_SORT_THRESHOLD) {
+            if (leftmost) {
+                /*
+                 * Traditional (without sentinel) insertion sort,
+                 * optimized for server VM, is used in case of
+                 * the leftmost part.
+                 */
+                for (int i = left, j = i; i < right; j = ++i) {
+                    int ai = a[i + 1];
+                    while (ai < a[j]) {
+                        a[j + 1] = a[j];
+                        if (j-- == left) {
+                            break;
+                        }
+                    }
+                    a[j + 1] = ai;
+                }
+            }
+            else {
+                /*
+                 * Skip the longest ascending sequence.
+                 */
+                do {
+                    if (left >= right) {
+                        return;
+                    }
+                }
+                while (a[++left] >= a[left - 1]);
+
+                /*
+                 * Every element from adjoining part plays the role
+                 * of sentinel, therefore this allows us to avoid the
+                 * left range check on each iteration. Moreover, we use
+                 * the more optimized algorithm, so called pair insertion
+                 * sort, which is faster (in the context of Quicksort)
+                 * than traditional implementation of insertion sort.
+                 */
+                for (int k = left; ++left <= right; k = ++left) {
+                    int a1 = a[k], a2 = a[left];
+
+                    if (a1 < a2) {
+                        a2 = a1;
+                        a1 = a[left];
+                    }
+                    while (a1 < a[--k]) {
+                        a[k + 2] = a[k];
+                    }
+                    a[++k + 1] = a1;
+
+                    while (a2 < a[--k]) {
+                        a[k + 1] = a[k];
+                    }
+                    a[k + 1] = a2;
+                }
+                int last = a[right];
+
+                while (last < a[--right]) {
+                    a[right + 1] = a[right];
+                }
+                a[right + 1] = last;
+            }
+            return;
+        }
+
+        // Inexpensive approximation of length / 7
+        int seventh = (length >> 3) + (length >> 6) + 1;
+
+        /*
+         * Sort five evenly spaced elements around (and including) the
+         * center element in the range. These elements will be used for
+         * pivot selection as described below. The choice for spacing
+         * these elements was empirically determined to work well on
+         * a wide variety of inputs.
+         */
+        int e3 = (left + right) >>> 1; // The midpoint
+        int e2 = e3 - seventh;
+        int e1 = e2 - seventh;
+        int e4 = e3 + seventh;
+        int e5 = e4 + seventh;
+
+        // Sort these elements using insertion sort
+        if (a[e2] < a[e1]) {
+            int t = a[e2];
+            a[e2] = a[e1];
+            a[e1] = t;
+        }
+
+        if (a[e3] < a[e2]) {
+            int t = a[e3];
+            a[e3] = a[e2];
+            a[e2] = t;
+            if (t < a[e1]) {
+                a[e2] = a[e1];
+                a[e1] = t;
+            }
+        }
+        if (a[e4] < a[e3]) {
+            int t = a[e4];
+            a[e4] = a[e3];
+            a[e3] = t;
+            if (t < a[e2]) {
+                a[e3] = a[e2];
+                a[e2] = t;
+                if (t < a[e1]) {
+                    a[e2] = a[e1];
+                    a[e1] = t;
+                }
+            }
+        }
+        if (a[e5] < a[e4]) {
+            int t = a[e5];
+            a[e5] = a[e4];
+            a[e4] = t;
+            if (t < a[e3]) {
+                a[e4] = a[e3];
+                a[e3] = t;
+                if (t < a[e2]) {
+                    a[e3] = a[e2];
+                    a[e2] = t;
+                    if (t < a[e1]) {
+                        a[e2] = a[e1];
+                        a[e1] = t;
+                    }
+                }
+            }
+        }
+
+        // Pointers
+        int less = left;  // The index of the first element of center part
+        int great = right; // The index before the first element of right part
+
+        if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
+            /*
+             * Use the second and fourth of the five sorted elements as pivots.
+             * These values are inexpensive approximations of the first and
+             * second terciles of the array. Note that pivot1 <= pivot2.
+             */
+            int pivot1 = a[e2];
+            int pivot2 = a[e4];
+
+            /*
+             * The first and the last elements to be sorted are moved to the
+             * locations formerly occupied by the pivots. When partitioning
+             * is complete, the pivots are swapped back into their final
+             * positions, and excluded from subsequent sorting.
+             */
+            a[e2] = a[left];
+            a[e4] = a[right];
+
+            /*
+             * Skip elements, which are less or greater than pivot values.
+             */
+            while (a[++less] < pivot1) {
+            }
+            while (a[--great] > pivot2) {
+            }
+
+            /*
+             * Partitioning:
+             *
+             *   left part           center part                   right part
+             * +--------------------------------------------------------------+
+             * |  < pivot1  |  pivot1 <= && <= pivot2  |    ?    |  > pivot2  |
+             * +--------------------------------------------------------------+
+             *               ^                          ^       ^
+             *               |                          |       |
+             *              less                        k     great
+             *
+             * Invariants:
+             *
+             *              all in (left, less)   < pivot1
+             *    pivot1 <= all in [less, k)      <= pivot2
+             *              all in (great, right) > pivot2
+             *
+             * Pointer k is the first index of ?-part.
+             */
+            outer:
+            for (int k = less - 1; ++k <= great; ) {
+                int ak = a[k];
+                if (ak < pivot1) { // Move a[k] to left part
+                    a[k] = a[less];
+                    /*
+                     * Here and below we use "a[i] = b; i++;" instead
+                     * of "a[i++] = b;" due to performance issue.
+                     */
+                    a[less] = ak;
+                    ++less;
+                }
+                else if (ak > pivot2) { // Move a[k] to right part
+                    while (a[great] > pivot2) {
+                        if (great-- == k) {
+                            break outer;
+                        }
+                    }
+                    if (a[great] < pivot1) { // a[great] <= pivot2
+                        a[k] = a[less];
+                        a[less] = a[great];
+                        ++less;
+                    }
+                    else { // pivot1 <= a[great] <= pivot2
+                        a[k] = a[great];
+                    }
+                    /*
+                     * Here and below we use "a[i] = b; i--;" instead
+                     * of "a[i--] = b;" due to performance issue.
+                     */
+                    a[great] = ak;
+                    --great;
+                }
+            }
+
+            // Swap pivots into their final positions
+            a[left] = a[less - 1];
+            a[less - 1] = pivot1;
+            a[right] = a[great + 1];
+            a[great + 1] = pivot2;
+
+            // Sort left and right parts recursively, excluding known pivots
+            SortingIntTestJMH.sort(a, left, less - 2, leftmost);
+            SortingIntTestJMH.sort(a, great + 2, right, false);
+
+            /*
+             * If center part is too large (comprises > 4/7 of the array),
+             * swap internal pivot values to ends.
+             */
+            if (less < e1 && e5 < great) {
+                /*
+                 * Skip elements, which are equal to pivot values.
+                 */
+                while (a[less] == pivot1) {
+                    ++less;
+                }
+
+                while (a[great] == pivot2) {
+                    --great;
+                }
+
+                /*
+                 * Partitioning:
+                 *
+                 *   left part         center part                  right part
+                 * +----------------------------------------------------------+
+                 * | == pivot1 |  pivot1 < && < pivot2  |    ?    | == pivot2 |
+                 * +----------------------------------------------------------+
+                 *              ^                        ^       ^
+                 *              |                        |       |
+                 *             less                      k     great
+                 *
+                 * Invariants:
+                 *
+                 *              all in (*,  less) == pivot1
+                 *     pivot1 < all in [less,  k)  < pivot2
+                 *              all in (great, *) == pivot2
+                 *
+                 * Pointer k is the first index of ?-part.
+                 */
+                outer:
+                for (int k = less - 1; ++k <= great; ) {
+                    int ak = a[k];
+                    if (ak == pivot1) { // Move a[k] to left part
+                        a[k] = a[less];
+                        a[less] = ak;
+                        ++less;
+                    }
+                    else if (ak == pivot2) { // Move a[k] to right part
+                        while (a[great] == pivot2) {
+                            if (great-- == k) {
+                                break outer;
+                            }
+                        }
+                        if (a[great] == pivot1) { // a[great] < pivot2
+                            a[k] = a[less];
+                            /*
+                             * Even though a[great] equals to pivot1, the
+                             * assignment a[less] = pivot1 may be incorrect,
+                             * if a[great] and pivot1 are floating-point zeros
+                             * of different signs. Therefore in float and
+                             * double sorting methods we have to use more
+                             * accurate assignment a[less] = a[great].
+                             */
+                            a[less] = pivot1;
+                            ++less;
+                        }
+                        else { // pivot1 < a[great] < pivot2
+                            a[k] = a[great];
+                        }
+                        a[great] = ak;
+                        --great;
+                    }
+                }
+            }
+
+            // Sort center part recursively
+            SortingIntTestJMH.sort(a, less, great, false);
+        }
+        else { // Partitioning with one pivot
+            /*
+             * Use the third of the five sorted elements as pivot.
+             * This value is inexpensive approximation of the median.
+             */
+            int pivot = a[e3];
+
+            /*
+             * Partitioning degenerates to the traditional 3-way
+             * (or "Dutch National Flag") schema:
+             *
+             *   left part    center part              right part
+             * +-------------------------------------------------+
+             * |  < pivot  |   == pivot   |     ?    |  > pivot  |
+             * +-------------------------------------------------+
+             *              ^              ^        ^
+             *              |              |        |
+             *             less            k      great
+             *
+             * Invariants:
+             *
+             *   all in (left, less)   < pivot
+             *   all in [less, k)     == pivot
+             *   all in (great, right) > pivot
+             *
+             * Pointer k is the first index of ?-part.
+             */
+            for (int k = less; k <= great; ++k) {
+                if (a[k] == pivot) {
+                    continue;
+                }
+                int ak = a[k];
+                if (ak < pivot) { // Move a[k] to left part
+                    a[k] = a[less];
+                    a[less] = ak;
+                    ++less;
+                }
+                else { // a[k] > pivot - Move a[k] to right part
+                    while (a[great] > pivot) {
+                        --great;
+                    }
+                    if (a[great] < pivot) { // a[great] <= pivot
+                        a[k] = a[less];
+                        a[less] = a[great];
+                        ++less;
+                    }
+                    else { // a[great] == pivot
+                        /*
+                         * Even though a[great] equals to pivot, the
+                         * assignment a[k] = pivot may be incorrect,
+                         * if a[great] and pivot are floating-point
+                         * zeros of different signs. Therefore in float
+                         * and double sorting methods we have to use
+                         * more accurate assignment a[k] = a[great].
+                         */
+                        a[k] = pivot;
+                    }
+                    a[great] = ak;
+                    --great;
+                }
+            }
+
+            /*
+             * Sort left and right parts recursively.
+             * All elements from center part are equal
+             * and, therefore, already sorted.
+             */
+            SortingIntTestJMH.sort(a, left, less - 1, leftmost);
+            SortingIntTestJMH.sort(a, great + 1, right, false);
+        }
+    }
+
+    private static void swap(int[] arr, int i, int j) {
+        int tmp = arr[i];
+        arr[i] = arr[j];
+        arr[j] = tmp;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Arrays/SortingLongBenchmarkTestJMH.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,725 @@
+/*
+ * Copyright 2015 Goldman Sachs.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@State(Scope.Thread)
+@BenchmarkMode(Mode.Throughput)
+@OutputTimeUnit(TimeUnit.SECONDS)
+public class SortingLongBenchmarkTestJMH {
+    private static final int QUICKSORT_THRESHOLD = 286;
+    private static final int MAX_RUN_COUNT = 67;
+    private static final int INSERTION_SORT_THRESHOLD = 47;
+    public static final int MAX_VALUE = 1_000_000;
+
+    @Param({"pairFlipZeroPairFlip", "descendingAscending", "zeroHi", "hiZeroLow", "hiFlatLow", "identical",
+            "randomDups", "randomNoDups", "sortedReversedSorted", "pairFlip", "endLessThan"})
+    public String listType;
+
+    private long[] array;
+    private static final int LIST_SIZE = 10_000_000;
+    public static final int NUMBER_OF_ITERATIONS = 10;
+
+    @Setup
+    public void setUp() {
+        Random random = new Random(123456789012345L);
+        this.array = new long[LIST_SIZE];
+        int threeQuarters = (int) (LIST_SIZE * 0.75);
+        if ("zeroHi".equals(this.listType)) {
+            for (int i = 0; i < threeQuarters; i++) {
+                this.array[i] = 0;
+            }
+            int k = 1;
+            for (int i = threeQuarters; i < LIST_SIZE; i++) {
+                this.array[i] = k;
+                k++;
+            }
+        }
+        else if ("hiFlatLow".equals(this.listType)) {
+            int oneThird = LIST_SIZE / 3;
+            for (int i = 0; i < oneThird; i++) {
+                this.array[i] = i;
+            }
+            int twoThirds = oneThird * 2;
+            int constant = oneThird - 1;
+            for (int i = oneThird; i < twoThirds; i++) {
+                this.array[i] = constant;
+            }
+            for (int i = twoThirds; i < LIST_SIZE; i++) {
+                this.array[i] = constant - i + twoThirds;
+            }
+        }
+        else if ("hiZeroLow".equals(this.listType)) {
+            int oneThird = LIST_SIZE / 3;
+            for (int i = 0; i < oneThird; i++) {
+                this.array[i] = i;
+            }
+            int twoThirds = oneThird * 2;
+            for (int i = oneThird; i < twoThirds; i++) {
+                this.array[i] = 0;
+            }
+            for (int i = twoThirds; i < LIST_SIZE; i++) {
+                this.array[i] = oneThird - i + twoThirds;
+            }
+        }
+        else if ("identical".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE; i++) {
+                this.array[i] = 0;
+            }
+        }
+        else if ("randomDups".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE; i++) {
+                this.array[i] = random.nextInt(1000);
+            }
+        }
+        else if ("randomNoDups".equals(this.listType)) {
+            Set<Integer> set = new HashSet<>();
+            while (set.size() < LIST_SIZE + 1) {
+                set.add(random.nextInt());
+            }
+            List<Integer> list = new ArrayList<>(LIST_SIZE);
+            list.addAll(set);
+            for (int i = 0; i < LIST_SIZE; i++) {
+                this.array[i] = list.get(i);
+            }
+        }
+        else if ("sortedReversedSorted".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE / 2; i++) {
+                this.array[i] = i;
+            }
+            int num = 0;
+            for (int i = LIST_SIZE / 2; i < LIST_SIZE; i++) {
+                this.array[i] = LIST_SIZE - num;
+                num++;
+            }
+        }
+        else if ("pairFlip".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE; i++) {
+                this.array[i] = i;
+            }
+            for (int i = 0; i < LIST_SIZE; i += 2) {
+                long temp = this.array[i];
+                this.array[i] = this.array[i + 1];
+                this.array[i + 1] = temp;
+            }
+        }
+        else if ("endLessThan".equals(this.listType)) {
+            for (int i = 0; i < LIST_SIZE - 1; i++) {
+                this.array[i] = 3;
+            }
+            this.array[LIST_SIZE - 1] = 1;
+        }
+        else if ("pairFlipZeroPairFlip".equals(this.listType)) {
+            //pairflip
+            for (int i = 0; i < 64; i++) {
+                this.array[i] = i;
+            }
+            for (int i = 0; i < 64; i += 2) {
+                long temp = this.array[i];
+                this.array[i] = this.array[i + 1];
+                this.array[i + 1] = temp;
+            }
+            //zero
+            for (int i = 64; i < this.array.length - 64; i++) {
+                this.array[i] = 0;
+            }
+            //pairflip
+            for (int i = this.array.length - 64; i < this.array.length; i++) {
+                this.array[i] = i;
+            }
+            for (int i = this.array.length - 64; i < this.array.length; i += 2) {
+                long temp = this.array[i];
+                this.array[i] = this.array[i + 1];
+                this.array[i + 1] = temp;
+            }
+        }
+        else if ("pairFlipOneHundredPairFlip".equals(this.listType)) {
+            //10, 5
+            for (int i = 0; i < 64; i++) {
+                if (i % 2 == 0) {
+                    this.array[i] = 10;
+                }
+                else {
+                    this.array[i] = 5;
+                }
+            }
+
+            //100
+            for (int i = 64; i < this.array.length - 64; i++) {
+                this.array[i] = 100;
+            }
+
+            //10, 5
+            for (int i = this.array.length - 64; i < this.array.length; i++) {
+                if (i % 2 == 0) {
+                    this.array[i] = 10;
+                }
+                else {
+                    this.array[i] = 5;
+                }
+            }
+        }
+    }
+
+    @Warmup(iterations = 20)
+    @Measurement(iterations = 10)
+    @Benchmark
+    public void sortNewWay() {
+        for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
+            SortingLongTestJMH.sort(this.array, 0, this.array.length - 1, null, 0, 0);
+        }
+    }
+
+    @Warmup(iterations = 20)
+    @Measurement(iterations = 10)
+    @Benchmark
+    public void sortOldWay() {
+        for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
+            Arrays.sort(this.array);
+        }
+    }
+
+    /**
+     * Sorts the specified range of the array using the given
+     * workspace array slice if possible for merging
+     *
+     * @param a the array to be sorted
+     * @param left the index of the first element, inclusive, to be sorted
+     * @param right the index of the last element, inclusive, to be sorted
+     * @param work a workspace array (slice)
+     * @param workBase origin of usable space in work array
+     * @param workLen usable size of work array
+     */
+    static void sort(long[] a, int left, int right,
+                     long[] work, int workBase, int workLen) {
+// Use Quicksort on small arrays
+        if (right - left < QUICKSORT_THRESHOLD) {
+            SortingLongTestJMH.sort(a, left, right, true);
+            return;
+        }
+
+          /*
+         * Index run[i] is the start of i-th run
+         * (ascending or descending sequence).
+         */
+        int[] run = new int[MAX_RUN_COUNT + 1];
+        int count = 0;
+        run[0] = left;
+
+        // Check if the array is nearly sorted
+        for (int k = left; k < right; run[count] = k) {
+            while (k < right && a[k] == a[k + 1])
+                k++;
+            if (k == right) break;
+            if (a[k] < a[k + 1]) { // ascending
+                while (++k <= right && a[k - 1] <= a[k]) ;
+            }
+            else if (a[k] > a[k + 1]) { // descending
+                while (++k <= right && a[k - 1] >= a[k]) ;
+                for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
+                    long t = a[lo];
+                    a[lo] = a[hi];
+                    a[hi] = t;
+                }
+            }
+            if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+                count--;
+            }
+            /*
+             * The array is not highly structured,
+             * use Quicksort instead of merge sort.
+             */
+            if (++count == MAX_RUN_COUNT) {
+                sort(a, left, right, true);
+                return;
+            }
+        }
+
+        // Check special cases
+        // Implementation note: variable "right" is increased by 1.
+        if (run[count] == right++) {
+            run[++count] = right;
+        }
+        if (count <= 1) { // The array is already sorted
+            return;
+        }
+
+        // Determine alternation base for merge
+        byte odd = 0;
+        for (int n = 1; (n <<= 1) < count; odd ^= 1) {
+        }
+
+        // Use or create temporary array b for merging
+        long[] b;                  // temp array; alternates with a
+        int ao, bo;                 // array offsets from 'left'
+        int blen = right - left; // space needed for b
+        if (work == null || workLen < blen || workBase + blen > work.length) {
+            work = new long[blen];
+            workBase = 0;
+        }
+        if (odd == 0) {
+            System.arraycopy(a, left, work, workBase, blen);
+            b = a;
+            bo = 0;
+            a = work;
+            ao = workBase - left;
+        }
+        else {
+            b = work;
+            ao = 0;
+            bo = workBase - left;
+        }
+
+        // Merging
+        for (int last; count > 1; count = last) {
+            for (int k = (last = 0) + 2; k <= count; k += 2) {
+                int hi = run[k], mi = run[k - 1];
+                for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
+                    if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) {
+                        b[i + bo] = a[p++ + ao];
+                    }
+                    else {
+                        b[i + bo] = a[q++ + ao];
+                    }
+                }
+                run[++last] = hi;
+            }
+            if ((count & 1) != 0) {
+                for (int i = right, lo = run[count - 1]; --i >= lo;
+                     b[i + bo] = a[i + ao]
+                        ) {
+                }
+                run[++last] = right;
+            }
+            long[] t = a;
+            a = b;
+            b = t;
+            int o = ao;
+            ao = bo;
+            bo = o;
+        }
+    }
+
+    /**
+     * Sorts the specified range of the array by Dual-Pivot Quicksort.
+     *
+     * @param a the array to be sorted
+     * @param left the index of the first element, inclusive, to be sorted
+     * @param right the index of the last element, inclusive, to be sorted
+     * @param leftmost indicates if this part is the leftmost in the range
+     */
+    private static void sort(long[] a, int left, int right, boolean leftmost) {
+        int length = right - left + 1;
+
+        // Use insertion sort on tiny arrays
+        if (length < INSERTION_SORT_THRESHOLD) {
+            if (leftmost) {
+                /*
+                 * Traditional (without sentinel) insertion sort,
+                 * optimized for server VM, is used in case of
+                 * the leftmost part.
+                 */
+                for (int i = left, j = i; i < right; j = ++i) {
+                    long ai = a[i + 1];
+                    while (ai < a[j]) {
+                        a[j + 1] = a[j];
+                        if (j-- == left) {
+                            break;
+                        }
+                    }
+                    a[j + 1] = ai;
+                }
+            }
+            else {
+                /*
+                 * Skip the longest ascending sequence.
+                 */
+                do {
+                    if (left >= right) {
+                        return;
+                    }
+                }
+                while (a[++left] >= a[left - 1]);
+
+                /*
+                 * Every element from adjoining part plays the role
+                 * of sentinel, therefore this allows us to avoid the
+                 * left range check on each iteration. Moreover, we use
+                 * the more optimized algorithm, so called pair insertion
+                 * sort, which is faster (in the context of Quicksort)
+                 * than traditional implementation of insertion sort.
+                 */
+                for (int k = left; ++left <= right; k = ++left) {
+                    long a1 = a[k], a2 = a[left];
+
+                    if (a1 < a2) {
+                        a2 = a1;
+                        a1 = a[left];
+                    }
+                    while (a1 < a[--k]) {
+                        a[k + 2] = a[k];
+                    }
+                    a[++k + 1] = a1;
+
+                    while (a2 < a[--k]) {
+                        a[k + 1] = a[k];
+                    }
+                    a[k + 1] = a2;
+                }
+                long last = a[right];
+
+                while (last < a[--right]) {
+                    a[right + 1] = a[right];
+                }
+                a[right + 1] = last;
+            }
+            return;
+        }
+
+        // Inexpensive approximation of length / 7
+        int seventh = (length >> 3) + (length >> 6) + 1;
+
+        /*
+         * Sort five evenly spaced elements around (and including) the
+         * center element in the range. These elements will be used for
+         * pivot selection as described below. The choice for spacing
+         * these elements was empirically determined to work well on
+         * a wide variety of inputs.
+         */
+        int e3 = (left + right) >>> 1; // The midpoint
+        int e2 = e3 - seventh;
+        int e1 = e2 - seventh;
+        int e4 = e3 + seventh;
+        int e5 = e4 + seventh;
+
+        // Sort these elements using insertion sort
+        if (a[e2] < a[e1]) {
+            long t = a[e2];
+            a[e2] = a[e1];
+            a[e1] = t;
+        }
+
+        if (a[e3] < a[e2]) {
+            long t = a[e3];
+            a[e3] = a[e2];
+            a[e2] = t;
+            if (t < a[e1]) {
+                a[e2] = a[e1];
+                a[e1] = t;
+            }
+        }
+        if (a[e4] < a[e3]) {
+            long t = a[e4];
+            a[e4] = a[e3];
+            a[e3] = t;
+            if (t < a[e2]) {
+                a[e3] = a[e2];
+                a[e2] = t;
+                if (t < a[e1]) {
+                    a[e2] = a[e1];
+                    a[e1] = t;
+                }
+            }
+        }
+        if (a[e5] < a[e4]) {
+            long t = a[e5];
+            a[e5] = a[e4];
+            a[e4] = t;
+            if (t < a[e3]) {
+                a[e4] = a[e3];
+                a[e3] = t;
+                if (t < a[e2]) {
+                    a[e3] = a[e2];
+                    a[e2] = t;
+                    if (t < a[e1]) {
+                        a[e2] = a[e1];
+                        a[e1] = t;
+                    }
+                }
+            }
+        }
+
+        // Pointers
+        int less = left;  // The index of the first element of center part
+        int great = right; // The index before the first element of right part
+
+        if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
+            /*
+             * Use the second and fourth of the five sorted elements as pivots.
+             * These values are inexpensive approximations of the first and
+             * second terciles of the array. Note that pivot1 <= pivot2.
+             */
+            long pivot1 = a[e2];
+            long pivot2 = a[e4];
+
+            /*
+             * The first and the last elements to be sorted are moved to the
+             * locations formerly occupied by the pivots. When partitioning
+             * is complete, the pivots are swapped back into their final
+             * positions, and excluded from subsequent sorting.
+             */
+            a[e2] = a[left];
+            a[e4] = a[right];
+
+            /*
+             * Skip elements, which are less or greater than pivot values.
+             */
+            while (a[++less] < pivot1) {
+            }
+            while (a[--great] > pivot2) {
+            }
+
+            /*
+             * Partitioning:
+             *
+             *   left part           center part                   right part
+             * +--------------------------------------------------------------+
+             * |  < pivot1  |  pivot1 <= && <= pivot2  |    ?    |  > pivot2  |
+             * +--------------------------------------------------------------+
+             *               ^                          ^       ^
+             *               |                          |       |
+             *              less                        k     great
+             *
+             * Invariants:
+             *
+             *              all in (left, less)   < pivot1
+             *    pivot1 <= all in [less, k)      <= pivot2
+             *              all in (great, right) > pivot2
+             *
+             * Pointer k is the first index of ?-part.
+             */
+            outer:
+            for (int k = less - 1; ++k <= great; ) {
+                long ak = a[k];
+                if (ak < pivot1) { // Move a[k] to left part
+                    a[k] = a[less];
+                    /*
+                     * Here and below we use "a[i] = b; i++;" instead
+                     * of "a[i++] = b;" due to performance issue.
+                     */
+                    a[less] = ak;
+                    ++less;
+                }
+                else if (ak > pivot2) { // Move a[k] to right part
+                    while (a[great] > pivot2) {
+                        if (great-- == k) {
+                            break outer;
+                        }
+                    }
+                    if (a[great] < pivot1) { // a[great] <= pivot2
+                        a[k] = a[less];
+                        a[less] = a[great];
+                        ++less;
+                    }
+                    else { // pivot1 <= a[great] <= pivot2
+                        a[k] = a[great];
+                    }
+                    /*
+                     * Here and below we use "a[i] = b; i--;" instead
+                     * of "a[i--] = b;" due to performance issue.
+                     */
+                    a[great] = ak;
+                    --great;
+                }
+            }
+
+            // Swap pivots into their final positions
+            a[left] = a[less - 1];
+            a[less - 1] = pivot1;
+            a[right] = a[great + 1];
+            a[great + 1] = pivot2;
+
+            // Sort left and right parts recursively, excluding known pivots
+            SortingLongTestJMH.sort(a, left, less - 2, leftmost);
+            SortingLongTestJMH.sort(a, great + 2, right, false);
+
+            /*
+             * If center part is too large (comprises > 4/7 of the array),
+             * swap internal pivot values to ends.
+             */
+            if (less < e1 && e5 < great) {
+                /*
+                 * Skip elements, which are equal to pivot values.
+                 */
+                while (a[less] == pivot1) {
+                    ++less;
+                }
+
+                while (a[great] == pivot2) {
+                    --great;
+                }
+
+                /*
+                 * Partitioning:
+                 *
+                 *   left part         center part                  right part
+                 * +----------------------------------------------------------+
+                 * | == pivot1 |  pivot1 < && < pivot2  |    ?    | == pivot2 |
+                 * +----------------------------------------------------------+
+                 *              ^                        ^       ^
+                 *              |                        |       |
+                 *             less                      k     great
+                 *
+                 * Invariants:
+                 *
+                 *              all in (*,  less) == pivot1
+                 *     pivot1 < all in [less,  k)  < pivot2
+                 *              all in (great, *) == pivot2
+                 *
+                 * Pointer k is the first index of ?-part.
+                 */
+                outer:
+                for (int k = less - 1; ++k <= great; ) {
+                    long ak = a[k];
+                    if (ak == pivot1) { // Move a[k] to left part
+                        a[k] = a[less];
+                        a[less] = ak;
+                        ++less;
+                    }
+                    else if (ak == pivot2) { // Move a[k] to right part
+                        while (a[great] == pivot2) {
+                            if (great-- == k) {
+                                break outer;
+                            }
+                        }
+                        if (a[great] == pivot1) { // a[great] < pivot2
+                            a[k] = a[less];
+                            /*
+                             * Even though a[great] equals to pivot1, the
+                             * assignment a[less] = pivot1 may be incorrect,
+                             * if a[great] and pivot1 are floating-point zeros
+                             * of different signs. Therefore in float and
+                             * double sorting methods we have to use more
+                             * accurate assignment a[less] = a[great].
+                             */
+                            a[less] = pivot1;
+                            ++less;
+                        }
+                        else { // pivot1 < a[great] < pivot2
+                            a[k] = a[great];
+                        }
+                        a[great] = ak;
+                        --great;
+                    }
+                }
+            }
+
+            // Sort center part recursively
+            SortingLongTestJMH.sort(a, less, great, false);
+        }
+        else { // Partitioning with one pivot
+            /*
+             * Use the third of the five sorted elements as pivot.
+             * This value is inexpensive approximation of the median.
+             */
+            long pivot = a[e3];
+
+            /*
+             * Partitioning degenerates to the traditional 3-way
+             * (or "Dutch National Flag") schema:
+             *
+             *   left part    center part              right part
+             * +-------------------------------------------------+
+             * |  < pivot  |   == pivot   |     ?    |  > pivot  |
+             * +-------------------------------------------------+
+             *              ^              ^        ^
+             *              |              |        |
+             *             less            k      great
+             *
+             * Invariants:
+             *
+             *   all in (left, less)   < pivot
+             *   all in [less, k)     == pivot
+             *   all in (great, right) > pivot
+             *
+             * Pointer k is the first index of ?-part.
+             */
+            for (int k = less; k <= great; ++k) {
+                if (a[k] == pivot) {
+                    continue;
+                }
+                long ak = a[k];
+                if (ak < pivot) { // Move a[k] to left part
+                    a[k] = a[less];
+                    a[less] = ak;
+                    ++less;
+                }
+                else { // a[k] > pivot - Move a[k] to right part
+                    while (a[great] > pivot) {
+                        --great;
+                    }
+                    if (a[great] < pivot) { // a[great] <= pivot
+                        a[k] = a[less];
+                        a[less] = a[great];
+                        ++less;
+                    }
+                    else { // a[great] == pivot
+                        /*
+                         * Even though a[great] equals to pivot, the
+                         * assignment a[k] = pivot may be incorrect,
+                         * if a[great] and pivot are floating-point
+                         * zeros of different signs. Therefore in float
+                         * and double sorting methods we have to use
+                         * more accurate assignment a[k] = a[great].
+                         */
+                        a[k] = pivot;
+                    }
+                    a[great] = ak;
+                    --great;
+                }
+            }
+
+            /*
+             * Sort left and right parts recursively.
+             * All elements from center part are equal
+             * and, therefore, already sorted.
+             */
+            SortingLongTestJMH.sort(a, left, less - 1, leftmost);
+            SortingLongTestJMH.sort(a, great + 1, right, false);
+        }
+    }
+
+    private static void swap(long[] arr, int i, int j) {
+        long tmp = arr[i];
+        arr[i] = arr[j];
+        arr[j] = tmp;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Arrays/SortingNearlySortedPrimitive.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2015 Goldman Sachs.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @summary Tests the sorting of a large array of sorted primitive values,
+ *          predominently for cases where the array is nearly sorted. This tests
+ *          code that detects patterns in the array to determine if it is nearly
+ *          sorted and if so employs and optimizes merge sort rather than a
+ *          Dual-Pivot QuickSort.
+ *
+ * @run testng SortingNearlySortedPrimitive
+ */
+
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.function.Supplier;
+
+public class SortingNearlySortedPrimitive {
+    private static final int ARRAY_SIZE = 1_000_000;
+
+    @DataProvider(name = "arrays")
+    public Object[][] createData() {
+        return new Object[][]{
+                {"hiZeroLowTest", (Supplier<int[]>) this::hiZeroLowData},
+                {"endLessThanTest", (Supplier<int[]>) this::endLessThanData},
+                {"highFlatLowTest", (Supplier<int[]>) this::highFlatLowData},
+                {"identicalTest", (Supplier<int[]>) this::identicalData},
+                {"sortedReversedSortedTest", (Supplier<int[]>) this::sortedReversedSortedData},
+                {"pairFlipTest", (Supplier<int[]>) this::pairFlipData},
+                {"zeroHiTest", (Supplier<int[]>) this::zeroHiData},
+        };
+    }
+
+    @Test(dataProvider = "arrays")
+    public void runTests(String testName, Supplier<int[]> dataMethod) throws Exception {
+        int[] intSourceArray = dataMethod.get();
+
+        // Clone source array to ensure it is not modified
+        this.sortAndAssert(intSourceArray.clone());
+        this.sortAndAssert(floatCopyFromInt(intSourceArray));
+        this.sortAndAssert(doubleCopyFromInt(intSourceArray));
+        this.sortAndAssert(longCopyFromInt(intSourceArray));
+        this.sortAndAssert(shortCopyFromInt(intSourceArray));
+        this.sortAndAssert(charCopyFromInt(intSourceArray));
+    }
+
+    private float[] floatCopyFromInt(int[] src) {
+        float[] result = new float[src.length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = src[i];
+        }
+        return result;
+    }
+
+    private double[] doubleCopyFromInt(int[] src) {
+        double[] result = new double[src.length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = src[i];
+        }
+        return result;
+    }
+
+    private long[] longCopyFromInt(int[] src) {
+        long[] result = new long[src.length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = src[i];
+        }
+        return result;
+    }
+
+    private short[] shortCopyFromInt(int[] src) {
+        short[] result = new short[src.length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = (short) src[i];
+        }
+        return result;
+    }
+
+    private char[] charCopyFromInt(int[] src) {
+        char[] result = new char[src.length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = (char) src[i];
+        }
+        return result;
+    }
+
+    private void sortAndAssert(int[] array) {
+        Arrays.sort(array);
+        for (int i = 1; i < ARRAY_SIZE; i++) {
+            if (array[i] < array[i - 1]) {
+                throw new AssertionError("not sorted");
+            }
+        }
+        Assert.assertEquals(ARRAY_SIZE, array.length);
+    }
+
+    private void sortAndAssert(char[] array) {
+        Arrays.sort(array);
+        for (int i = 1; i < ARRAY_SIZE; i++) {
+            if (array[i] < array[i - 1]) {
+                throw new AssertionError("not sorted");
+            }
+        }
+        Assert.assertEquals(ARRAY_SIZE, array.length);
+    }
+
+    private void sortAndAssert(short[] array) {
+        Arrays.sort(array);
+        for (int i = 1; i < ARRAY_SIZE; i++) {
+            if (array[i] < array[i - 1]) {
+                throw new AssertionError("not sorted");
+            }
+        }
+        Assert.assertEquals(ARRAY_SIZE, array.length);
+    }
+
+    private void sortAndAssert(double[] array) {
+        Arrays.sort(array);
+        for (int i = 1; i < ARRAY_SIZE; i++) {
+            if (array[i] < array[i - 1]) {
+                throw new AssertionError("not sorted");
+            }
+        }
+        Assert.assertEquals(ARRAY_SIZE, array.length);
+    }
+
+    private void sortAndAssert(float[] array) {
+        Arrays.sort(array);
+        for (int i = 1; i < ARRAY_SIZE; i++) {
+            if (array[i] < array[i - 1]) {
+                throw new AssertionError("not sorted");
+            }
+        }
+        Assert.assertEquals(ARRAY_SIZE, array.length);
+    }
+
+    private void sortAndAssert(long[] array) {
+        Arrays.sort(array);
+        for (int i = 1; i < ARRAY_SIZE; i++) {
+            if (array[i] < array[i - 1]) {
+                throw new AssertionError("not sorted");
+            }
+        }
+        Assert.assertEquals(ARRAY_SIZE, array.length);
+    }
+
+    private int[] zeroHiData() {
+        int[] array = new int[ARRAY_SIZE];
+
+        int threeQuarters = (int) (ARRAY_SIZE * 0.75);
+        for (int i = 0; i < threeQuarters; i++) {
+            array[i] = 0;
+        }
+        int k = 1;
+        for (int i = threeQuarters; i < ARRAY_SIZE; i++) {
+            array[i] = k;
+            k++;
+        }
+
+        return array;
+    }
+
+    private int[] hiZeroLowData() {
+        int[] array = new int[ARRAY_SIZE];
+
+        int oneThird = ARRAY_SIZE / 3;
+        for (int i = 0; i < oneThird; i++) {
+            array[i] = i;
+        }
+        int twoThirds = oneThird * 2;
+        for (int i = oneThird; i < twoThirds; i++) {
+            array[i] = 0;
+        }
+        for (int i = twoThirds; i < ARRAY_SIZE; i++) {
+            array[i] = oneThird - i + twoThirds;
+        }
+        return array;
+    }
+
+    private int[] highFlatLowData() {
+        int[] array = new int[ARRAY_SIZE];
+
+        int oneThird = ARRAY_SIZE / 3;
+        for (int i = 0; i < oneThird; i++) {
+            array[i] = i;
+        }
+        int twoThirds = oneThird * 2;
+        int constant = oneThird - 1;
+        for (int i = oneThird; i < twoThirds; i++) {
+            array[i] = constant;
+        }
+        for (int i = twoThirds; i < ARRAY_SIZE; i++) {
+            array[i] = constant - i + twoThirds;
+        }
+
+        return array;
+    }
+
+    private int[] identicalData() {
+        int[] array = new int[ARRAY_SIZE];
+        int listNumber = 24;
+
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            array[i] = listNumber;
+        }
+
+        return array;
+    }
+
+    private int[] endLessThanData() {
+        int[] array = new int[ARRAY_SIZE];
+
+        for (int i = 0; i < ARRAY_SIZE - 1; i++) {
+            array[i] = 3;
+        }
+        array[ARRAY_SIZE - 1] = 1;
+
+        return array;
+    }
+
+    private int[] sortedReversedSortedData() {
+        int[] array = new int[ARRAY_SIZE];
+
+        for (int i = 0; i < ARRAY_SIZE / 2; i++) {
+            array[i] = i;
+        }
+        int num = 0;
+        for (int i = ARRAY_SIZE / 2; i < ARRAY_SIZE; i++) {
+            array[i] = ARRAY_SIZE - num;
+            num++;
+        }
+
+        return array;
+    }
+
+    private int[] pairFlipData() {
+        int[] array = new int[ARRAY_SIZE];
+
+        for (int i = 0; i < ARRAY_SIZE; i++) {
+            array[i] = i;
+        }
+        for (int i = 0; i < ARRAY_SIZE; i += 2) {
+            int temp = array[i];
+            array[i] = array[i + 1];
+            array[i + 1] = temp;
+        }
+
+        return array;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/PropertyPermission/PropertyPermissionCollection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for PropertyPermissionCollection subclass
+ */
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+import java.util.PropertyPermission;
+
+public class PropertyPermissionCollection {
+
+    public static void main(String[] args) throws Exception {
+
+        int testFail = 0;
+
+        PropertyPermission perm = new PropertyPermission("user.home", "read");
+        PermissionCollection perms = perm.newPermissionCollection();
+
+        // test 1
+        System.out.println
+            ("test 1: add throws IllegalArgExc for wrong perm type");
+        try {
+            perms.add(new SecurityPermission("createAccessControlContext"));
+            System.err.println("Expected IllegalArgumentException");
+            testFail++;
+        } catch (IllegalArgumentException iae) {}
+
+        // test 2
+        System.out.println("test 2: implies returns false for wrong perm type");
+        if (perms.implies(new SecurityPermission("getPolicy"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 3
+        System.out.println
+            ("test 3: implies returns true for match on name and action");
+        perms.add(new PropertyPermission("user.home", "read"));
+        if (!perms.implies(new PropertyPermission("user.home", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 4
+        System.out.println
+            ("test 4: implies returns false for match on name but not action");
+        if (perms.implies(new PropertyPermission("user.home", "write"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 5
+        System.out.println("test 5: implies returns true for match " +
+                           "on name and subset of actions");
+        perms.add(new PropertyPermission("java.home", "read, write"));
+        if (!perms.implies(new PropertyPermission("java.home", "write"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 6
+        System.out.println("test 6: implies returns true for aggregate " +
+                           "match on name and action");
+        perms.add(new PropertyPermission("user.name", "read"));
+        perms.add(new PropertyPermission("user.name", "write"));
+        if (!perms.implies(new PropertyPermission("user.name", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+        if (!perms.implies(new PropertyPermission("user.name", "write,read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 7
+        System.out.println("test 7: implies returns true for wildcard " +
+                           "and match on action");
+        perms.add(new PropertyPermission("foo.*", "read"));
+        if (!perms.implies(new PropertyPermission("foo.bar", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 8
+        System.out.println("test 8: implies returns true for deep " +
+                           "wildcard and match on action");
+        if (!perms.implies(new PropertyPermission("foo.bar.baz", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 8
+        System.out.println
+            ("test 8: implies returns false for invalid wildcard");
+        perms.add(new PropertyPermission("baz*", "read"));
+        if (perms.implies(new PropertyPermission("baz.foo", "read"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 9
+        System.out.println("test 9: implies returns true for all " +
+                           "wildcard and match on action");
+        perms.add(new PropertyPermission("*", "read"));
+        if (!perms.implies(new PropertyPermission("java.version", "read"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 10
+        System.out.println("test 10: implies returns false for wildcard " +
+                           "and non-match on action");
+        if (perms.implies(new PropertyPermission("java.version", "write"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 11
+        System.out.println("test 11: elements returns correct number of perms");
+        int numPerms = 0;
+        Enumeration<Permission> e = perms.elements();
+        while (e.hasMoreElements()) {
+            numPerms++;
+            System.out.println(e.nextElement());
+        }
+        // the 2 user.name permissions added were combined into one
+        if (numPerms != 6) {
+            System.err.println("Expected 6, got " + numPerms);
+            testFail++;
+        }
+
+        if (testFail > 0) {
+            throw new Exception(testFail + " test(s) failed");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSBufferOverflowUnderflowTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS buffer overflow and underflow status when dealing with
+ *          application data.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSBufferOverflowUnderflowTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSBufferOverflowUnderflowTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSBufferOverflowUnderflowTest
+ */
+
+/**
+ * Testing DTLS incorrect app data packages unwrapping.
+ */
+public class DTLSBufferOverflowUnderflowTest {
+    public static void main(String[] args) {
+        BufferOverflowUnderflowTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSDataExchangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS application data exchange using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSDataExchangeTest
+ */
+
+/**
+ * Testing DTLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class DTLSDataExchangeTest {
+    public static void main(String[] args) {
+        DataExchangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSEnginesClosureTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines closing using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSEnginesClosureTest
+ */
+
+/**
+ * Testing DTLS engines closing using each of the supported cipher suites.
+ */
+public class DTLSEnginesClosureTest {
+    public static void main(String[] args) {
+        EnginesClosureTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSHandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSHandshakeTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites.
+ */
+public class DTLSHandshakeTest {
+    public static void main(String[] args) {
+        HandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSHandshakeWithReplicatedPacketsTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ *          cipher suites with replicated packets check.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSHandshakeWithReplicatedPacketsTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSHandshakeWithReplicatedPacketsTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSHandshakeWithReplicatedPacketsTest
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites with
+ * replicated packets check.
+ */
+public class DTLSHandshakeWithReplicatedPacketsTest extends SSLEngineTestCase {
+
+    private static String testMode;
+
+    public static void main(String[] args) {
+        DTLSHandshakeWithReplicatedPacketsTest test
+                = new DTLSHandshakeWithReplicatedPacketsTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE, true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSIncorrectAppDataTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS incorrect app data packages unwrapping.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSIncorrectAppDataTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSIncorrectAppDataTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSIncorrectAppDataTest
+ */
+
+import java.nio.ByteBuffer;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import java.util.Random;
+import jdk.testlibrary.RandomFactory;
+
+/**
+ * Testing DTLS incorrect app data packages unwrapping. Incorrect application
+ * data packages should be ignored by DTLS SSLEngine.
+ */
+public class DTLSIncorrectAppDataTest extends SSLEngineTestCase {
+
+    private final String MESSAGE = "Hello peer!";
+
+    public static void main(String[] s) {
+        DTLSIncorrectAppDataTest test = new DTLSIncorrectAppDataTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        try {
+            doHandshake(clientEngine, serverEngine, maxPacketSize,
+                    HandshakeMode.INITIAL_HANDSHAKE);
+            checkIncorrectAppDataUnwrap(clientEngine, serverEngine);
+            checkIncorrectAppDataUnwrap(serverEngine, clientEngine);
+        } catch (SSLException ssle) {
+            throw new AssertionError("Error during handshake or sending app data",
+                    ssle);
+        }
+    }
+
+    private void checkIncorrectAppDataUnwrap(SSLEngine sendEngine,
+            SSLEngine recvEngine) throws SSLException {
+        String direction = sendEngine.getUseClientMode() ? "client"
+                : "server";
+        System.out.println("================================================="
+                + "===========");
+        System.out.println("Testing DTLS incorrect app data packages unwrapping"
+                + " by sending data from " + direction);
+        ByteBuffer app = ByteBuffer.wrap(MESSAGE.getBytes());
+        ByteBuffer net = doWrap(sendEngine, direction, 0, app);
+        final Random RNG = RandomFactory.getRandom();
+        int randomPlace = RNG.nextInt(net.remaining());
+        net.array()[randomPlace] += 1;
+        app = ByteBuffer.allocate(recvEngine.getSession()
+                .getApplicationBufferSize());
+        recvEngine.unwrap(net, app);
+        app.flip();
+        int length = app.remaining();
+        System.out.println("Unwrapped " + length + " bytes.");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSMFLNTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ *          cipher suites with different maximum fragment length. Testing of
+ *          MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSMFLNTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class DTLSMFLNTest {
+    public static void main(String[] args) {
+        MFLNTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSNotEnabledRC4Test.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS DTLSNotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class DTLSNotEnabledRC4Test {
+    public static void main(String[] args) throws Exception {
+        NotEnabledRC4Test.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSRehandshakeTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class DTLSRehandshakeTest {
+    public static void main(String[] args) {
+        RehandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeWithCipherChangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking with cipher change. New cipher
+ *          is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      DTLSRehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class DTLSRehandshakeWithCipherChangeTest {
+    public static void main(String[] args) {
+        RehandshakeWithCipherChangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeWithDataExTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking using each of the supported
+ *          cipher suites with application data exchange before and after
+ *          re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSRehandshakeWithDataExTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class DTLSRehandshakeWithDataExTest {
+    public static void main(String[] args) {
+        RehandshakeWithDataExTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSSequenceNumberTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS records sequence number property support in application
+ *          data exchange.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm DTLSSequenceNumberTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=norm_sni DTLSSequenceNumberTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ *      -Dtest.mode=krb DTLSSequenceNumberTest
+ */
+
+import java.nio.ByteBuffer;
+import java.util.TreeMap;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import java.util.Random;
+import jdk.testlibrary.RandomFactory;
+
+/**
+ * Testing DTLS records sequence number property support in application data
+ * exchange.
+ */
+public class DTLSSequenceNumberTest extends SSLEngineTestCase {
+
+    private final String BIG_MESSAGE = "Very very big message. One two three"
+            + " four five six seven eight nine ten eleven twelve thirteen"
+            + " fourteen fifteen sixteen seventeen eighteen nineteen twenty.";
+    private final byte[] BIG_MESSAGE_BYTES = BIG_MESSAGE.getBytes();
+    private final int PIECES_NUMBER = 15;
+
+    public static void main(String[] args) {
+        DTLSSequenceNumberTest test = new DTLSSequenceNumberTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+        checkSeqNumPropertyWithAppDataSend(clientEngine, serverEngine);
+        checkSeqNumPropertyWithAppDataSend(serverEngine, clientEngine);
+    }
+
+    private void checkSeqNumPropertyWithAppDataSend(SSLEngine sendEngine,
+            SSLEngine recvEngine) throws SSLException {
+        String sender, reciever;
+        if (sendEngine.getUseClientMode() && !recvEngine.getUseClientMode()) {
+            sender = "Client";
+            reciever = "Server";
+        } else if (recvEngine.getUseClientMode() && !sendEngine.getUseClientMode()) {
+            sender = "Server";
+            reciever = "Client";
+        } else {
+            throw new Error("Both engines are in the same mode");
+        }
+        System.out.println("================================================="
+                + "===========");
+        System.out.println("Checking DTLS sequence number support"
+                + " by sending data from " + sender + " to " + reciever);
+        ByteBuffer[] sentMessages = new ByteBuffer[PIECES_NUMBER];
+        ByteBuffer[] netBuffers = new ByteBuffer[PIECES_NUMBER];
+        TreeMap<Long, ByteBuffer> recvMap = new TreeMap<>(Long::compareUnsigned);
+        int symbolsInAMessage;
+        int symbolsInTheLastMessage;
+        int[] recievingSequence = new int[PIECES_NUMBER];
+        for (int i = 0; i < PIECES_NUMBER; i++) {
+            recievingSequence[i] = i;
+        }
+        shuffleArray(recievingSequence);
+        if (BIG_MESSAGE.length() % PIECES_NUMBER == 0) {
+            symbolsInAMessage = BIG_MESSAGE.length() / PIECES_NUMBER;
+            symbolsInTheLastMessage = symbolsInAMessage;
+        } else {
+            symbolsInAMessage = BIG_MESSAGE.length() / (PIECES_NUMBER - 1);
+            symbolsInTheLastMessage = BIG_MESSAGE.length() % (PIECES_NUMBER - 1);
+        }
+        for (int i = 0; i < PIECES_NUMBER - 1; i++) {
+            sentMessages[i] = ByteBuffer.wrap(BIG_MESSAGE_BYTES,
+                    i * symbolsInAMessage, symbolsInAMessage);
+        }
+        sentMessages[PIECES_NUMBER - 1] = ByteBuffer.wrap(BIG_MESSAGE_BYTES,
+                (PIECES_NUMBER - 1) * symbolsInAMessage, symbolsInTheLastMessage);
+        long prevSeqNum = 0L;
+        //Wrapping massages in direct order
+        for (int i = 0; i < PIECES_NUMBER; i++) {
+            netBuffers[i] = ByteBuffer.allocate(sendEngine.getSession()
+                    .getPacketBufferSize());
+            SSLEngineResult[] r = new SSLEngineResult[1];
+            netBuffers[i] = doWrap(sendEngine, sender, 0, sentMessages[i], r);
+            long seqNum = r[0].sequenceNumber();
+            if (Long.compareUnsigned(seqNum, prevSeqNum) <= 0) {
+                throw new AssertionError("Sequence number of the wrapped "
+                        + "message is less or equal than that of the"
+                        + " previous one! "
+                        + "Was " + prevSeqNum + ", now " + seqNum + ".");
+            }
+            prevSeqNum = seqNum;
+        }
+        //Unwrapping messages in random order and trying to reconstruct order
+        //from sequence number.
+        for (int i = 0; i < PIECES_NUMBER; i++) {
+            int recvNow = recievingSequence[i];
+            SSLEngineResult[] r = new SSLEngineResult[1];
+            ByteBuffer recvMassage = doUnWrap(recvEngine, reciever,
+                    netBuffers[recvNow], r);
+            long seqNum = r[0].sequenceNumber();
+            recvMap.put(seqNum, recvMassage);
+        }
+        int mapSize = recvMap.size();
+        if (mapSize != PIECES_NUMBER) {
+            throw new AssertionError("The number of received massages "
+                    + mapSize + " is not equal to the number of sent messages "
+                    + PIECES_NUMBER + "!");
+        }
+        byte[] recvBigMsgBytes = new byte[BIG_MESSAGE_BYTES.length];
+        int counter = 0;
+        for (ByteBuffer msg : recvMap.values()) {
+            System.arraycopy(msg.array(), 0, recvBigMsgBytes,
+                    counter * symbolsInAMessage, msg.remaining());
+            counter++;
+        }
+        String recvBigMsg = new String(recvBigMsgBytes);
+        if (!recvBigMsg.equals(BIG_MESSAGE)) {
+            throw new AssertionError("Received big message is not equal to"
+                    + " one that was sent! Received message is: " + recvBigMsg);
+        }
+    }
+
+    private static void shuffleArray(int[] ar) {
+        final Random RNG = RandomFactory.getRandom();
+        for (int i = ar.length - 1; i > 0; i--) {
+            int index = RNG.nextInt(i + 1);
+            int a = ar[index];
+            ar[index] = ar[i];
+            ar[i] = a;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSUnsupportedCiphersTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing that try to enable unsupported ciphers
+ *          causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS DTLSUnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class DTLSUnsupportedCiphersTest {
+    public static void main(String[] args) {
+        UnsupportedCiphersTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/TEST.properties	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,1 @@
+modules=java.base java.security.jgss
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10BufferOverflowUnderflowTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS buffer overflow and underflow status when dealing with
+ *          application data.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10BufferOverflowUnderflowTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10BufferOverflowUnderflowTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10BufferOverflowUnderflowTest
+ */
+
+/**
+ * Testing DTLS incorrect app data packages unwrapping.
+ */
+public class DTLSv10BufferOverflowUnderflowTest {
+    public static void main(String[] args) {
+        BufferOverflowUnderflowTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10DataExchangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS application data exchange using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10DataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10DataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10DataExchangeTest
+ */
+
+/**
+ * Testing DTLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class DTLSv10DataExchangeTest {
+    public static void main(String[] args) {
+        DataExchangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10EnginesClosureTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines closing using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10EnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10EnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10EnginesClosureTest
+ */
+
+/**
+ * Testing DTLS engines closing using each of the supported cipher suites.
+ */
+public class DTLSv10EnginesClosureTest {
+    public static void main(String[] args) {
+        EnginesClosureTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10HandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10HandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10HandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10HandshakeTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites.
+ */
+public class DTLSv10HandshakeTest {
+    public static void main(String[] args) {
+        HandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10HandshakeWithReplicatedPacketsTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ *          cipher suites with replicated packets check.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10HandshakeWithReplicatedPacketsTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10HandshakeWithReplicatedPacketsTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10HandshakeWithReplicatedPacketsTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites with
+ * replicated packets check.
+ */
+public class DTLSv10HandshakeWithReplicatedPacketsTest {
+    public static void main(String[] args) {
+        DTLSHandshakeWithReplicatedPacketsTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10IncorrectAppDataTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS incorrect app data packages unwrapping.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSIncorrectAppDataTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSIncorrectAppDataTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSIncorrectAppDataTest
+ */
+
+/**
+ * Testing DTLS incorrect app data packages unwrapping. Incorrect application
+ * data packages should be ignored by DTLS SSLEngine.
+ */
+public class DTLSv10IncorrectAppDataTest {
+    public static void main(String[] args) {
+        DTLSIncorrectAppDataTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10MFLNTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ *          cipher suites with different maximum fragment length. Testing of
+ *          MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10MFLNTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10MFLNTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10MFLNTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class DTLSv10MFLNTest {
+    public static void main(String[] args) {
+        MFLNTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10NotEnabledRC4Test.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0 DTLSv10NotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class DTLSv10NotEnabledRC4Test {
+    public static void main(String[] args) throws Exception {
+        NotEnabledRC4Test.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10RehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10RehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10RehandshakeTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class DTLSv10RehandshakeTest {
+    public static void main(String[] args) {
+        RehandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeWithCipherChangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking with cipher change. New cipher
+ *          is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      DTLSv10RehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class DTLSv10RehandshakeWithCipherChangeTest {
+    public static void main(String[] args) {
+        RehandshakeWithCipherChangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeWithDataExTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking using each of the supported
+ *          cipher suites with application data exchange before and after
+ *          re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10RehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10RehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10RehandshakeWithDataExTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class DTLSv10RehandshakeWithDataExTest {
+    public static void main(String[] args) {
+        RehandshakeWithDataExTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10SequenceNumberTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS records sequence number property support in application
+ *          data exchange.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm DTLSv10SequenceNumberTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=norm_sni DTLSv10SequenceNumberTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      -Dtest.mode=krb DTLSv10SequenceNumberTest
+ */
+
+/**
+ * Testing DTLS records sequence number property support in application data
+ * exchange.
+ */
+public class DTLSv10SequenceNumberTest {
+    public static void main(String[] args) {
+        DTLSHandshakeWithReplicatedPacketsTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10UnsupportedCiphersTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing that try to enable unsupported ciphers
+ *          causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ *      DTLSv10UnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class DTLSv10UnsupportedCiphersTest {
+    public static void main(String[] args) {
+        UnsupportedCiphersTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/TEST.properties	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,1 @@
+modules=java.base java.security.jgss
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSDataExchangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS application data exchange using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSDataExchangeTest
+ */
+
+/**
+ * Testing TLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class TLSDataExchangeTest {
+    public static void main(String[] args) {
+        DataExchangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSEnginesClosureTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines closing using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSEnginesClosureTest
+ */
+
+/**
+ * Testing TLS engines closing using each of the supported cipher suites.
+ */
+public class TLSEnginesClosureTest {
+    public static void main(String[] args) {
+        EnginesClosureTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSHandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSHandshakeTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites.
+ */
+public class TLSHandshakeTest {
+    public static void main(String[] args) {
+        HandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSMFLNTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ *          cipher suites with different maximum fragment length. Testing of
+ *          MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSMFLNTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class TLSMFLNTest {
+    public static void main(String[] args) {
+        MFLNTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSNotEnabledRC4Test.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS TLSNotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class TLSNotEnabledRC4Test {
+    public static void main(String[] args) throws Exception {
+        NotEnabledRC4Test.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSRehandshakeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class TLSRehandshakeTest {
+    public static void main(String[] args) {
+        RehandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeWithCipherChangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking with cipher change. New cipher
+ *          is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS TLSRehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class TLSRehandshakeWithCipherChangeTest {
+    public static void main(String[] args) {
+        RehandshakeWithCipherChangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeWithDataExTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ *          cipher suites with application data exchange before and after
+ *          re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSRehandshakeWithDataExTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class TLSRehandshakeWithDataExTest {
+    public static void main(String[] args) {
+        RehandshakeWithDataExTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSUnsupportedCiphersTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing that try to enable unsupported ciphers
+ *          causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS TLSUnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class TLSUnsupportedCiphersTest {
+    public static void main(String[] args) {
+        UnsupportedCiphersTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/BufferOverflowUnderflowTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.nio.ByteBuffer;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngine incorrect app data packages unwrapping.
+ */
+public class BufferOverflowUnderflowTest extends SSLEngineTestCase {
+
+    private final String MESSAGE = "Hello peer!";
+
+    public static void main(String[] args) {
+        BufferOverflowUnderflowTest test = new BufferOverflowUnderflowTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+        checkBufferOverflowOnWrap(clientEngine);
+        checkBufferOverflowOnWrap(serverEngine);
+        checkBufferOverflowOnUnWrap(clientEngine, serverEngine);
+        checkBufferOverflowOnUnWrap(serverEngine, clientEngine);
+        checkBufferUnderflowOnUnWrap(serverEngine, clientEngine);
+        checkBufferUnderflowOnUnWrap(clientEngine, serverEngine);
+    }
+
+    private void checkBufferOverflowOnWrap(SSLEngine engine)
+            throws SSLException {
+        String mode = engine.getUseClientMode() ? "client"
+                : "server";
+        System.out.println("================================================="
+                + "===========");
+        System.out.println("Testing SSLEngine buffer overflow"
+                + " on wrap by " + mode);
+        ByteBuffer app = ByteBuffer.wrap(MESSAGE.getBytes());
+        //Making net buffer size less than required by 1 byte.
+        ByteBuffer net = ByteBuffer
+                .allocate(engine.getSession().getPacketBufferSize() - 1);
+        SSLEngineResult r = engine.wrap(app, net);
+        checkResult(r, SSLEngineResult.Status.BUFFER_OVERFLOW);
+        System.out.println("Passed");
+    }
+
+    private void checkBufferOverflowOnUnWrap(SSLEngine wrappingEngine,
+            SSLEngine unwrappingEngine)
+            throws SSLException {
+        String wrapperMode = wrappingEngine.getUseClientMode() ? "client"
+                : "server";
+        String unwrapperMode = unwrappingEngine.getUseClientMode() ? "client"
+                : "server";
+        if (wrapperMode.equals(unwrapperMode)) {
+            throw new Error("Test error: both engines are in the same mode!");
+        }
+        System.out.println("================================================="
+                + "===========");
+        System.out.println("Testing SSLEngine buffer overflow"
+                + " on unwrap by " + unwrapperMode);
+        ByteBuffer app = ByteBuffer.wrap(MESSAGE.getBytes());
+        ByteBuffer net = ByteBuffer
+                .allocate(wrappingEngine.getSession().getPacketBufferSize());
+        SSLEngineResult r = wrappingEngine.wrap(app, net);
+        checkResult(r, SSLEngineResult.Status.OK);
+        //Making app buffer size less than required by 1 byte.
+        app = ByteBuffer.allocate(MESSAGE.length() - 1);
+        net.flip();
+        r = unwrappingEngine.unwrap(net, app);
+        checkResult(r, SSLEngineResult.Status.BUFFER_OVERFLOW);
+        System.out.println("Passed");
+    }
+
+    private void checkBufferUnderflowOnUnWrap(SSLEngine wrappingEngine,
+            SSLEngine unwrappingEngine)
+            throws SSLException {
+        String wrapperMode = wrappingEngine.getUseClientMode() ? "client"
+                : "server";
+        String unwrapperMode = unwrappingEngine.getUseClientMode() ? "client"
+                : "server";
+        if (wrapperMode.equals(unwrapperMode)) {
+            throw new Error("Test error: both engines are in the same mode!");
+        }
+        System.out.println("================================================="
+                + "===========");
+        System.out.println("Testing SSLEngine buffer underflow"
+                + " on unwrap by " + unwrapperMode);
+        ByteBuffer app = ByteBuffer.wrap(MESSAGE.getBytes());
+        ByteBuffer net = ByteBuffer
+                .allocate(wrappingEngine.getSession().getPacketBufferSize());
+        SSLEngineResult r = wrappingEngine.wrap(app, net);
+        checkResult(r, SSLEngineResult.Status.OK);
+        app = ByteBuffer.allocate(unwrappingEngine.getSession()
+                .getApplicationBufferSize());
+        net.flip();
+        //Making net buffer size less than size of dtls message.
+        net.limit(net.limit() - 1);
+        r = unwrappingEngine.unwrap(net, app);
+        checkResult(r, SSLEngineResult.Status.BUFFER_UNDERFLOW);
+        System.out.println("Passed");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/DataExchangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngine application data exchange using each of the supported cipher
+ * suites.
+ */
+public class DataExchangeTest extends SSLEngineTestCase {
+
+    public static void main(String[] args) {
+        DataExchangeTest test = new DataExchangeTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+        sendApplicationData(clientEngine, serverEngine);
+        sendApplicationData(serverEngine, clientEngine);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/EnginesClosureTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines closing using each of the supported cipher suites.
+ */
+public class EnginesClosureTest extends SSLEngineTestCase {
+
+    public static void main(String[] args) {
+        EnginesClosureTest test = new EnginesClosureTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        closingTest(cipher, true);
+        closingTest(cipher, false);
+    }
+
+    private void closingTest(String cipher, boolean clientCloses)
+            throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+        if (clientCloses) {
+            closeEngines(clientEngine, serverEngine);
+        } else {
+            closeEngines(serverEngine, clientEngine);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/HandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines handshake using each of the supported cipher suites.
+ */
+public class HandshakeTest extends SSLEngineTestCase {
+
+    public static void main(String[] args) {
+        HandshakeTest test = new HandshakeTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/MFLNTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class MFLNTest extends SSLEngineTestCase {
+
+    public static void main(String[] args) {
+        setUpAndStartKDCIfNeeded();
+        System.setProperty("jsse.enableMFLNExtension", "true");
+        for (int mfl = 4096; mfl >= 256; mfl /= 2) {
+            System.out.println("=============================================="
+                    + "==============");
+            System.out.printf("Testsing DTLS handshake with MFL = %d%n", mfl);
+            MFLNTest test = new MFLNTest(mfl);
+            test.runTests();
+        }
+    }
+
+    protected MFLNTest(int maxPacketSize) {
+        super(maxPacketSize);
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/NotEnabledRC4Test.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+
+/**
+ * Testing SSLEngines do not enable RC4 ciphers by default.
+ */
+public class NotEnabledRC4Test {
+
+    public static void main(String[] s) throws Exception {
+        SSLContext context = SSLEngineTestCase.getContext();
+        SSLEngine clientEngine = context.createSSLEngine();
+        clientEngine.setUseClientMode(true);
+        SSLEngine serverEngine = context.createSSLEngine();
+        serverEngine.setUseClientMode(false);
+        String[] cliEnabledCiphers = clientEngine.getEnabledCipherSuites();
+        rc4Test(cliEnabledCiphers, true);
+        String[] srvEnabledCiphers = serverEngine.getEnabledCipherSuites();
+        rc4Test(srvEnabledCiphers, false);
+    }
+
+    private static void rc4Test(String[] ciphers, boolean isClient) {
+        String mode = isClient ? "client" : "server";
+        for (String cipher : ciphers) {
+            if (cipher.contains("RC4")) {
+                throw new AssertionError("RC4 cipher " + cipher + " is enabled"
+                        + " by default on " + mode + " SSLEngine,"
+                        + " but it should not!");
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/RehandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class RehandshakeTest extends SSLEngineTestCase {
+
+    public static void main(String[] args) {
+        RehandshakeTest test = new RehandshakeTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.REHANDSHAKE_BEGIN_CLIENT);
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.REHANDSHAKE_BEGIN_SERVER);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/RehandshakeWithCipherChangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import java.util.Random;
+import jdk.testlibrary.RandomFactory;
+
+/**
+ * Testing SSLEngines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class RehandshakeWithCipherChangeTest extends SSLEngineTestCase {
+
+    public static void main(String[] s) {
+        RehandshakeWithCipherChangeTest test
+                = new RehandshakeWithCipherChangeTest();
+        test.runTests(Ciphers.ENABLED_NON_KRB_NOT_ANON_CIPHERS);
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        SSLEngine clientEngine = context.createSSLEngine();
+        clientEngine.setUseClientMode(true);
+        SSLEngine serverEngine = context.createSSLEngine();
+        serverEngine.setUseClientMode(false);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(
+                Ciphers.ENABLED_NON_KRB_NOT_ANON_CIPHERS.ciphers);
+        String randomCipher;
+        serverEngine.setNeedClientAuth(true);
+        long initialEpoch = 0;
+        long secondEpoch = 0;
+        SSLEngineResult r;
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+        sendApplicationData(clientEngine, serverEngine);
+        r = sendApplicationData(serverEngine, clientEngine);
+        if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+            initialEpoch = r.sequenceNumber() >> 48;
+        }
+        final Random RNG = RandomFactory.getRandom();
+        randomCipher = Ciphers.ENABLED_NON_KRB_NOT_ANON_CIPHERS.ciphers[RNG
+                .nextInt(Ciphers.ENABLED_NON_KRB_NOT_ANON_CIPHERS.ciphers.length)];
+        clientEngine.setEnabledCipherSuites(new String[]{randomCipher});
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.REHANDSHAKE_BEGIN_CLIENT);
+        sendApplicationData(clientEngine, serverEngine);
+        r = sendApplicationData(serverEngine, clientEngine);
+        if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+            secondEpoch = r.sequenceNumber() >> 48;
+            AssertionError epochError = new AssertionError("Epoch number"
+                    + " did not grow after re-handshake! "
+                    + " Was " + initialEpoch + ", now " + secondEpoch + ".");
+            if (Long.compareUnsigned(secondEpoch, initialEpoch) <= 0) {
+                throw epochError;
+            }
+        }
+        closeEngines(clientEngine, serverEngine);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/RehandshakeWithDataExTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class RehandshakeWithDataExTest extends SSLEngineTestCase {
+
+    public static void main(String[] args) {
+        RehandshakeWithDataExTest test = new RehandshakeWithDataExTest();
+        setUpAndStartKDCIfNeeded();
+        test.runTests();
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) throws SSLException {
+        SSLContext context = getContext();
+        int maxPacketSize = getMaxPacketSize();
+        boolean useSNI = !TEST_MODE.equals("norm");
+        SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+        SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+        clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+        long initialEpoch = 0;
+        long secondEpoch = 0;
+        long thirdEpoch = 0;
+        SSLEngineResult r;
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.INITIAL_HANDSHAKE);
+        sendApplicationData(clientEngine, serverEngine);
+        r = sendApplicationData(serverEngine, clientEngine);
+        if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+            initialEpoch = r.sequenceNumber() >> 48;
+        }
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.REHANDSHAKE_BEGIN_CLIENT);
+        sendApplicationData(clientEngine, serverEngine);
+        r = sendApplicationData(serverEngine, clientEngine);
+        AssertionError epochError = new AssertionError("Epoch number"
+                + " did not grow after re-handshake! "
+                + " Was " + initialEpoch + ", now " + secondEpoch + ".");
+        if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+            secondEpoch = r.sequenceNumber() >> 48;
+            if (Long.compareUnsigned(secondEpoch, initialEpoch) <= 0) {
+                throw epochError;
+            }
+        }
+        doHandshake(clientEngine, serverEngine, maxPacketSize,
+                HandshakeMode.REHANDSHAKE_BEGIN_SERVER);
+        sendApplicationData(clientEngine, serverEngine);
+        r = sendApplicationData(serverEngine, clientEngine);
+        if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+        thirdEpoch = r.sequenceNumber() >> 48;
+            if (Long.compareUnsigned(thirdEpoch, secondEpoch) <= 0) {
+                throw epochError;
+            }
+        }
+        closeEngines(clientEngine, serverEngine);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/SSLEngineTestCase.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,1081 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SNIHostName;
+import javax.net.ssl.SNIMatcher;
+import javax.net.ssl.SNIServerName;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.TrustManagerFactory;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Basic class to inherit SSLEngine test cases from it. Tests apply for
+ * the TLS or DTLS security protocols and their versions.
+ */
+abstract public class SSLEngineTestCase {
+
+    public enum Ciphers {
+
+        /**
+         * Ciphers supported by the tested SSLEngine without those with kerberos
+         * authentication.
+         */
+        SUPPORTED_NON_KRB_CIPHERS(SSLEngineTestCase.SUPPORTED_NON_KRB_CIPHERS,
+                "Supported non kerberos"),
+        /**
+         * Ciphers supported by the tested SSLEngine without those with kerberos
+         * authentication and without those with SHA256 ans SHA384.
+         */
+        SUPPORTED_NON_KRB_NON_SHA_CIPHERS(SSLEngineTestCase.SUPPORTED_NON_KRB_NON_SHA_CIPHERS,
+                "Supported non kerberos non SHA256 and SHA384"),
+        /**
+         * Ciphers supported by the tested SSLEngine with kerberos authentication.
+         */
+        SUPPORTED_KRB_CIPHERS(SSLEngineTestCase.SUPPORTED_KRB_CIPHERS,
+                "Supported kerberos"),
+        /**
+         * Ciphers enabled by default for the tested SSLEngine without kerberos
+         * and anon.
+         */
+        ENABLED_NON_KRB_NOT_ANON_CIPHERS(
+                SSLEngineTestCase.ENABLED_NON_KRB_NOT_ANON_CIPHERS,
+                "Enabled by default non kerberos not anonymous"),
+        /**
+         * Ciphers unsupported by the tested SSLEngine.
+         */
+        UNSUPPORTED_CIPHERS(SSLEngineTestCase.UNSUPPORTED_CIPHERS,
+                "Unsupported");
+
+        Ciphers(String[] ciphers, String description) {
+            this.ciphers = ciphers;
+            this.description = description;
+        }
+
+        final String[] ciphers;
+        final String description;
+    }
+
+    /**
+     * Enumeration used to distinguish handshake mode in
+     * {@link SSLEngineTestCase#doHandshake(javax.net.ssl.SSLEngine,
+     * javax.net.ssl.SSLEngine, int, SSLEngineTestCase.HandshakeMode, boolean)
+     * SSLEngineTestCase.doHandshake} method.
+     */
+    public enum HandshakeMode {
+
+        /**
+         * Initial handshake done for the first time: both engines call
+         * {@link SSLEngine#beginHandshake()} method.
+         */
+        INITIAL_HANDSHAKE,
+        /**
+         * Repeated handshake done by client: client engine calls
+         * {@link SSLEngine#beginHandshake()} method.
+         */
+        REHANDSHAKE_BEGIN_CLIENT,
+        /**
+         * Repeated handshake done by server: server engine calls
+         * {@link SSLEngine#beginHandshake()} method.
+         */
+        REHANDSHAKE_BEGIN_SERVER;
+    }
+    /**
+     * Security protocol to be tested: "TLS" or "DTLS" or their versions,
+     * e.g. "TLSv1", "TLSv1.1", "TLSv1.2", "DTLSv1.0", "DTLSv1.2".
+     */
+    public static final String TESTED_SECURITY_PROTOCOL
+            = System.getProperty("test.security.protocol", "TLS");
+    /**
+     * Test mode: "norm", "norm_sni" or "krb".
+     * Modes "norm" and "norm_sni" are used to run
+     * with all supported non-kerberos ciphers.
+     * Mode "krb" is used to run with kerberos ciphers.
+     */
+    public static final String TEST_MODE
+            = System.getProperty("test.mode", "norm");
+
+    private static final String FS = System.getProperty("file.separator", "/");
+    private static final String PATH_TO_STORES = ".." + FS + "etc";
+    private static final String KEY_STORE_FILE = "keystore";
+    private static final String TRUST_STORE_FILE = "truststore";
+    private static final String PASSWD = "passphrase";
+
+    private static final String KEY_FILE_NAME
+            = System.getProperty("test.src", ".") + FS + PATH_TO_STORES
+            + FS + KEY_STORE_FILE;
+    private static final String TRUST_FILE_NAME
+            = System.getProperty("test.src", ".") + FS + PATH_TO_STORES
+            + FS + TRUST_STORE_FILE;
+
+    private static ByteBuffer net;
+    private static ByteBuffer netReplicatedClient;
+    private static ByteBuffer netReplicatedServer;
+    private static final int MAX_HANDSHAKE_LOOPS = 100;
+    private static final String EXCHANGE_MSG_SENT = "Hello, peer!";
+    private static boolean doUnwrapForNotHandshakingStatus;
+    private static boolean endHandshakeLoop = false;
+    private static final String TEST_SRC = System.getProperty("test.src", ".");
+    private static final String KTAB_FILENAME = "krb5.keytab.data";
+    private static final String KRB_REALM = "TEST.REALM";
+    private static final String KRBTGT_PRINCIPAL = "krbtgt/" + KRB_REALM;
+    private static final String KRB_USER = "USER";
+    private static final String KRB_USER_PASSWORD = "password";
+    private static final String KRB_USER_PRINCIPAL = KRB_USER + "@" + KRB_REALM;
+    private static final String KRB5_CONF_FILENAME = "krb5.conf";
+    private static final String PATH_TO_COMMON = ".." + FS + "TLSCommon";
+    private static final String JAAS_CONF_FILE = PATH_TO_COMMON
+            + FS + "jaas.conf";
+    private static final int DELAY = 1000;
+    private static final String HOST = "localhost";
+    private static final String SERVER_NAME = "service.localhost";
+    private static final String SNI_PATTERN = ".*";
+
+    private static final String[] SUPPORTED_NON_KRB_CIPHERS;
+
+    static {
+        try {
+            String[] allSupportedCiphers = getContext()
+                    .createSSLEngine().getSupportedCipherSuites();
+            List<String> supportedCiphersList = new LinkedList<>();
+            for (String cipher : allSupportedCiphers) {
+                if (!cipher.contains("KRB5")
+                        && !cipher.contains("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")) {
+                    supportedCiphersList.add(cipher);
+                }
+            }
+            SUPPORTED_NON_KRB_CIPHERS = supportedCiphersList.toArray(new String[0]);
+        } catch (Exception ex) {
+            throw new Error("Unexpected issue", ex);
+        }
+    }
+
+    private static final String[] SUPPORTED_NON_KRB_NON_SHA_CIPHERS;
+
+    static {
+        try {
+            String[] allSupportedCiphers = getContext()
+                    .createSSLEngine().getSupportedCipherSuites();
+            List<String> supportedCiphersList = new LinkedList<>();
+            for (String cipher : allSupportedCiphers) {
+                if (!cipher.contains("KRB5")
+                        && !cipher.contains("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")
+                        && !cipher.endsWith("_SHA256")
+                        && !cipher.endsWith("_SHA384")) {
+                    supportedCiphersList.add(cipher);
+                }
+            }
+            SUPPORTED_NON_KRB_NON_SHA_CIPHERS
+                    = supportedCiphersList.toArray(new String[0]);
+        } catch (Exception ex) {
+            throw new Error("Unexpected issue", ex);
+        }
+    }
+
+    private static final String[] SUPPORTED_KRB_CIPHERS;
+
+    static {
+        try {
+            String[] allSupportedCiphers = getContext()
+                    .createSSLEngine().getSupportedCipherSuites();
+            List<String> supportedCiphersList = new LinkedList<>();
+            for (String cipher : allSupportedCiphers) {
+                if (cipher.contains("KRB5")
+                        && !cipher.contains("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")) {
+                    supportedCiphersList.add(cipher);
+                }
+            }
+            SUPPORTED_KRB_CIPHERS = supportedCiphersList.toArray(new String[0]);
+        } catch (Exception ex) {
+            throw new Error("Unexpected issue", ex);
+        }
+    }
+
+    private static final String[] ENABLED_NON_KRB_NOT_ANON_CIPHERS;
+
+    static {
+        try {
+            SSLEngine temporary = getContext().createSSLEngine();
+            temporary.setUseClientMode(true);
+            String[] enabledCiphers = temporary.getEnabledCipherSuites();
+            List<String> enabledCiphersList = new LinkedList<>();
+            for (String cipher : enabledCiphers) {
+                if (!cipher.contains("anon") && !cipher.contains("KRB5")
+                        && !cipher.contains("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")) {
+                    enabledCiphersList.add(cipher);
+                }
+            }
+            ENABLED_NON_KRB_NOT_ANON_CIPHERS = enabledCiphersList.toArray(new String[0]);
+        } catch (Exception ex) {
+            throw new Error("Unexpected issue", ex);
+        }
+    }
+
+    private static final String[] UNSUPPORTED_CIPHERS = {
+            "SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA",
+            "SSL_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA",
+            "SSL_DHE_DSS_WITH_RC4_128_SHA",
+            "SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA",
+            "SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA",
+            "SSL_DH_DSS_WITH_DES_CBC_SHA",
+            "SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA",
+            "SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA",
+            "SSL_DH_RSA_WITH_DES_CBC_SHA",
+            "SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA",
+            "SSL_FORTEZZA_DMS_WITH_NULL_SHA",
+            "SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA",
+            "SSL_RSA_EXPORT1024_WITH_RC4_56_SHA",
+            "SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5",
+            "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA",
+            "SSL_RSA_FIPS_WITH_DES_CBC_SHA",
+            "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5",
+            "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA",
+            "TLS_KRB5_WITH_IDEA_CBC_MD5",
+            "TLS_KRB5_WITH_IDEA_CBC_SHA",
+            "SSL_RSA_WITH_IDEA_CBC_SHA",
+            "TLS_DH_RSA_WITH_AES_128_GCM_SHA256",
+            "TLS_DH_RSA_WITH_AES_256_GCM_SHA384",
+            "TLS_DH_DSS_WITH_AES_128_GCM_SHA256",
+            "TLS_DH_DSS_WITH_AES_256_GCM_SHA384"
+    };
+
+    private final int maxPacketSize;
+
+    /**
+     * Constructs test case with the given MFLN maxMacketSize.
+     *
+     * @param maxPacketSize - MLFN extension max packet size.
+     */
+    public SSLEngineTestCase(int maxPacketSize) {
+        this.maxPacketSize = maxPacketSize;
+    }
+
+    /**
+     * Constructs test case with {@code maxPacketSize = 0}.
+     */
+    public SSLEngineTestCase() {
+        this.maxPacketSize = 0;
+    }
+
+    /**
+     * Wraps data with the specified engine.
+     *
+     * @param engine        - SSLEngine that wraps data.
+     * @param wrapper       - Set wrapper id, e.g. "server" of "client". Used for
+     *                      logging only.
+     * @param maxPacketSize - Max packet size to check that MFLN extension works
+     *                      or zero for no check.
+     * @param app           - Buffer with data to wrap.
+     * @return - Buffer with wrapped data.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static ByteBuffer doWrap(SSLEngine engine, String wrapper,
+                                    int maxPacketSize, ByteBuffer app)
+            throws SSLException {
+        return doWrap(engine, wrapper, maxPacketSize,
+                app, SSLEngineResult.Status.OK, null);
+    }
+
+    /**
+     * Wraps data with the specified engine.
+     *
+     * @param engine        - SSLEngine that wraps data.
+     * @param wrapper       - Set wrapper id, e.g. "server" of "client". Used for
+     *                      logging only.
+     * @param maxPacketSize - Max packet size to check that MFLN extension works
+     *                      or zero for no check.
+     * @param app           - Buffer with data to wrap.
+     * @param result        - Array which first element will be used to output wrap
+     *                      result object.
+     * @return - Buffer with wrapped data.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static ByteBuffer doWrap(SSLEngine engine, String wrapper,
+                                    int maxPacketSize, ByteBuffer app,
+                                    SSLEngineResult[] result)
+            throws SSLException {
+        return doWrap(engine, wrapper, maxPacketSize,
+                app, SSLEngineResult.Status.OK, result);
+    }
+
+    /**
+     * Wraps data with the specified engine.
+     *
+     * @param engine        - SSLEngine that wraps data.
+     * @param wrapper       - Set wrapper id, e.g. "server" of "client". Used for
+     *                      logging only.
+     * @param maxPacketSize - Max packet size to check that MFLN extension works
+     *                      or zero for no check.
+     * @param app           - Buffer with data to wrap.
+     * @param wantedStatus  - Specifies expected result status of wrapping.
+     * @return - Buffer with wrapped data.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static ByteBuffer doWrap(SSLEngine engine, String wrapper,
+                                    int maxPacketSize, ByteBuffer app,
+                                    SSLEngineResult.Status wantedStatus)
+            throws SSLException {
+        return doWrap(engine, wrapper, maxPacketSize,
+                app, wantedStatus, null);
+    }
+
+    /**
+     * Wraps data with the specified engine.
+     *
+     * @param engine        - SSLEngine that wraps data.
+     * @param wrapper       - Set wrapper id, e.g. "server" of "client". Used for
+     *                      logging only.
+     * @param maxPacketSize - Max packet size to check that MFLN extension works
+     *                      or zero for no check.
+     * @param app           - Buffer with data to wrap.
+     * @param wantedStatus  - Specifies expected result status of wrapping.
+     * @param result        - Array which first element will be used to output wrap
+     *                      result object.
+     * @return - Buffer with wrapped data.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static ByteBuffer doWrap(SSLEngine engine, String wrapper,
+                                    int maxPacketSize, ByteBuffer app,
+                                    SSLEngineResult.Status wantedStatus,
+                                    SSLEngineResult[] result)
+            throws SSLException {
+        ByteBuffer net = ByteBuffer.allocate(engine.getSession()
+                .getPacketBufferSize());
+        SSLEngineResult r = engine.wrap(app, net);
+        net.flip();
+        int length = net.remaining();
+        System.out.println(wrapper + " wrapped " + length + " bytes.");
+        System.out.println(wrapper + " handshake status is "
+                + engine.getHandshakeStatus());
+        if (maxPacketSize < length && maxPacketSize != 0) {
+            throw new AssertionError("Handshake wrapped net buffer length "
+                    + length + " exceeds maximum packet size "
+                    + maxPacketSize);
+        }
+        checkResult(r, wantedStatus);
+        if (result != null && result.length > 0) {
+            result[0] = r;
+        }
+        return net;
+    }
+
+    /**
+     * Unwraps data with the specified engine.
+     *
+     * @param engine    - SSLEngine that unwraps data.
+     * @param unwrapper - Set unwrapper id, e.g. "server" of "client". Used for
+     *                  logging only.
+     * @param net       - Buffer with data to unwrap.
+     * @return - Buffer with unwrapped data.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static ByteBuffer doUnWrap(SSLEngine engine, String unwrapper,
+                                      ByteBuffer net)
+            throws SSLException {
+        return doUnWrap(engine, unwrapper, net, SSLEngineResult.Status.OK, null);
+    }
+
+    /**
+     * Unwraps data with the specified engine.
+     *
+     * @param engine    - SSLEngine that unwraps data.
+     * @param unwrapper - Set unwrapper id, e.g. "server" of "client". Used for
+     *                  logging only.
+     * @param net       - Buffer with data to unwrap.
+     * @param result    - Array which first element will be used to output wrap
+     *                  result object.
+     * @return - Buffer with unwrapped data.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static ByteBuffer doUnWrap(SSLEngine engine, String unwrapper,
+                                      ByteBuffer net, SSLEngineResult[] result)
+            throws SSLException {
+        return doUnWrap(engine, unwrapper, net, SSLEngineResult.Status.OK, result);
+    }
+
+    /**
+     * Unwraps data with the specified engine.
+     *
+     * @param engine       - SSLEngine that unwraps data.
+     * @param unwrapper    - Set unwrapper id, e.g. "server" of "client". Used for
+     *                     logging only.
+     * @param net          - Buffer with data to unwrap.
+     * @param wantedStatus - Specifies expected result status of wrapping.
+     * @return - Buffer with unwrapped data.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static ByteBuffer doUnWrap(SSLEngine engine, String unwrapper,
+                                      ByteBuffer net,
+                                      SSLEngineResult.Status wantedStatus)
+            throws SSLException {
+        return doUnWrap(engine, unwrapper, net, wantedStatus, null);
+    }
+
+    /**
+     * Unwraps data with the specified engine.
+     *
+     * @param engine       - SSLEngine that unwraps data.
+     * @param unwrapper    - Set unwrapper id, e.g. "server" of "client". Used for
+     *                     logging only.
+     * @param net          - Buffer with data to unwrap.
+     * @param wantedStatus - Specifies expected result status of wrapping.
+     * @param result       - Array which first element will be used to output wrap
+     *                     result object.
+     * @return - Buffer with unwrapped data.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static ByteBuffer doUnWrap(SSLEngine engine, String unwrapper,
+                                      ByteBuffer net,
+                                      SSLEngineResult.Status wantedStatus,
+                                      SSLEngineResult[] result)
+            throws SSLException {
+        ByteBuffer app = ByteBuffer.allocate(engine.getSession()
+                .getApplicationBufferSize());
+        int length = net.remaining();
+        System.out.println(unwrapper + " unwrapping "
+                + length + " bytes...");
+        SSLEngineResult r = engine.unwrap(net, app);
+        app.flip();
+        System.out.println(unwrapper + " handshake status is "
+                + engine.getHandshakeStatus());
+        checkResult(r, wantedStatus);
+        if (result != null && result.length > 0) {
+            result[0] = r;
+        }
+        return app;
+    }
+
+    /**
+     * Does the handshake of the two specified engines according to the
+     * {@code mode} specified.
+     *
+     * @param clientEngine  - Client SSLEngine.
+     * @param serverEngine  - Server SSLEngine.
+     * @param maxPacketSize - Maximum packet size for MFLN of zero for no limit.
+     * @param mode          - Handshake mode according to {@link HandshakeMode} enum.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static void doHandshake(SSLEngine clientEngine,
+                                   SSLEngine serverEngine,
+                                   int maxPacketSize, HandshakeMode mode)
+            throws SSLException {
+        doHandshake(clientEngine, serverEngine, maxPacketSize, mode, false);
+    }
+
+    /**
+     * Does the handshake of the two specified engines according to the
+     * {@code mode} specified.
+     *
+     * @param clientEngine          - Client SSLEngine.
+     * @param serverEngine          - Server SSLEngine.
+     * @param maxPacketSize         - Maximum packet size for MFLN of zero for no limit.
+     * @param mode                  - Handshake mode according to {@link HandshakeMode} enum.
+     * @param enableReplicatedPacks - Set {@code true} to enable replicated
+     *                              packet sending.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static void doHandshake(SSLEngine clientEngine,
+                                   SSLEngine serverEngine, int maxPacketSize,
+                                   HandshakeMode mode,
+                                   boolean enableReplicatedPacks)
+            throws SSLException {
+        System.out.println("================================================="
+                + "===========");
+        System.out.println("Starting handshake " + mode.name());
+        int loop = 0;
+        if (maxPacketSize < 0) {
+            throw new Error("Test issue: maxPacketSize is less than zero!");
+        }
+        SSLParameters params = clientEngine.getSSLParameters();
+        params.setMaximumPacketSize(maxPacketSize);
+        clientEngine.setSSLParameters(params);
+        params = serverEngine.getSSLParameters();
+        params.setMaximumPacketSize(maxPacketSize);
+        serverEngine.setSSLParameters(params);
+        SSLEngine firstEngine;
+        SSLEngine secondEngine;
+        switch (mode) {
+            case INITIAL_HANDSHAKE:
+                firstEngine = clientEngine;
+                secondEngine = serverEngine;
+                doUnwrapForNotHandshakingStatus = false;
+                clientEngine.beginHandshake();
+                serverEngine.beginHandshake();
+                break;
+            case REHANDSHAKE_BEGIN_CLIENT:
+                firstEngine = clientEngine;
+                secondEngine = serverEngine;
+                doUnwrapForNotHandshakingStatus = true;
+                clientEngine.beginHandshake();
+                break;
+            case REHANDSHAKE_BEGIN_SERVER:
+                firstEngine = serverEngine;
+                secondEngine = clientEngine;
+                doUnwrapForNotHandshakingStatus = true;
+                serverEngine.beginHandshake();
+                break;
+            default:
+                throw new Error("Test issue: unknown handshake mode");
+        }
+        endHandshakeLoop = false;
+        while (!endHandshakeLoop) {
+            if (++loop > MAX_HANDSHAKE_LOOPS) {
+                throw new Error("Too much loops for handshaking");
+            }
+            System.out.println("==============================================");
+            System.out.println("Handshake loop " + loop);
+            SSLEngineResult.HandshakeStatus clientHSStatus
+                    = clientEngine.getHandshakeStatus();
+            SSLEngineResult.HandshakeStatus serverHSStatus
+                    = serverEngine.getHandshakeStatus();
+            System.out.println("Client handshake status "
+                    + clientHSStatus.name());
+            System.out.println("Server handshake status "
+                    + serverHSStatus.name());
+            handshakeProcess(firstEngine, secondEngine, maxPacketSize,
+                    enableReplicatedPacks);
+            handshakeProcess(secondEngine, firstEngine, maxPacketSize,
+                    enableReplicatedPacks);
+        }
+    }
+
+    /**
+     * Routine to send application data from one SSLEngine to another.
+     *
+     * @param fromEngine - Sending engine.
+     * @param toEngine   - Receiving engine.
+     * @return - Result of unwrap method of the receiving engine.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static SSLEngineResult sendApplicationData(SSLEngine fromEngine,
+                                                      SSLEngine toEngine)
+            throws SSLException {
+        String sender = null;
+        String reciever = null;
+        String excMsgSent = EXCHANGE_MSG_SENT;
+        if (fromEngine.getUseClientMode() && !toEngine.getUseClientMode()) {
+            sender = "Client";
+            reciever = "Server";
+            excMsgSent += " Client.";
+        } else if (toEngine.getUseClientMode() && !fromEngine.getUseClientMode()) {
+            sender = "Server";
+            reciever = "Client";
+            excMsgSent += " Server.";
+        } else {
+            throw new Error("Test issue: both engines are in the same mode");
+        }
+        System.out.println("================================================="
+                + "===========");
+        System.out.println("Trying to send application data from " + sender
+                + " to " + reciever);
+        ByteBuffer clientAppSent
+                = ByteBuffer.wrap(excMsgSent.getBytes());
+        net = doWrap(fromEngine, sender, 0, clientAppSent);
+        SSLEngineResult[] r = new SSLEngineResult[1];
+        ByteBuffer serverAppRecv = doUnWrap(toEngine, reciever, net, r);
+        byte[] serverAppRecvTrunc = Arrays.copyOf(serverAppRecv.array(),
+                serverAppRecv.limit());
+        String msgRecv = new String(serverAppRecvTrunc);
+        if (!msgRecv.equals(excMsgSent)) {
+            throw new AssertionError(sender + " to " + reciever
+                    + ": application data"
+                    + " has been altered while sending."
+                    + " Message sent: " + "\"" + excMsgSent + "\"."
+                    + " Message recieved: " + "\"" + msgRecv + "\".");
+        }
+        System.out.println("Successful sending application data from " + sender
+                + " to " + reciever);
+        return r[0];
+    }
+
+    /**
+     * Close engines by sending "close outbound" message from one SSLEngine to
+     * another.
+     *
+     * @param fromEngine - Sending engine.
+     * @param toEngine   - Receiving engine.
+     * @throws SSLException - thrown on engine errors.
+     */
+    public static void closeEngines(SSLEngine fromEngine,
+                                    SSLEngine toEngine) throws SSLException {
+        String from = null;
+        String to = null;
+        ByteBuffer app;
+        if (fromEngine.getUseClientMode() && !toEngine.getUseClientMode()) {
+            from = "Client";
+            to = "Server";
+        } else if (toEngine.getUseClientMode() && !fromEngine.getUseClientMode()) {
+            from = "Server";
+            to = "Client";
+        } else {
+            throw new Error("Both engines are in the same mode");
+        }
+        System.out.println("=========================================================");
+        System.out.println("Trying to close engines from " + from + " to " + to);
+        // Sending close outbound request to peer
+        fromEngine.closeOutbound();
+        app = ByteBuffer.allocate(fromEngine.getSession().getApplicationBufferSize());
+        net = doWrap(fromEngine, from, 0, app, SSLEngineResult.Status.CLOSED);
+        doUnWrap(toEngine, to, net, SSLEngineResult.Status.CLOSED);
+        app = ByteBuffer.allocate(fromEngine.getSession().getApplicationBufferSize());
+        net = doWrap(toEngine, to, 0, app, SSLEngineResult.Status.CLOSED);
+        doUnWrap(fromEngine, from, net, SSLEngineResult.Status.CLOSED);
+        if (!toEngine.isInboundDone()) {
+            throw new AssertionError(from + " sent close request to " + to
+                    + ", but " + to + "did not close inbound.");
+        }
+        // Executing close inbound
+        fromEngine.closeInbound();
+        app = ByteBuffer.allocate(fromEngine.getSession().getApplicationBufferSize());
+        net = doWrap(fromEngine, from, 0, app, SSLEngineResult.Status.CLOSED);
+        doUnWrap(toEngine, to, net, SSLEngineResult.Status.CLOSED);
+        if (!toEngine.isOutboundDone()) {
+            throw new AssertionError(from + "sent close request to " + to
+                    + ", but " + to + "did not close outbound.");
+        }
+        System.out.println("Successful closing from " + from + " to " + to);
+    }
+
+    /**
+     * Runs the same test case for all given {@code ciphers}. Method counts all
+     * failures and throws {@code AssertionError} if one or more tests fail.
+     *
+     * @param ciphers - Ciphers that should be tested.
+     */
+    public void runTests(Ciphers ciphers) {
+        int total = ciphers.ciphers.length;
+        int failed = testSomeCiphers(ciphers);
+        if (failed > 0) {
+            throw new AssertionError("" + failed + " of " + total
+                    + " tests failed!");
+        }
+        System.out.println("All tests passed!");
+    }
+
+    /**
+     * Runs test cases for ciphers defined by the test mode.
+     */
+    public void runTests() {
+        switch (TEST_MODE) {
+            case "norm":
+            case "norm_sni":
+                switch (TESTED_SECURITY_PROTOCOL) {
+                    case "DTLSv1.0":
+                    case "TLSv1":
+                    case "TLSv1.1":
+                        runTests(Ciphers.SUPPORTED_NON_KRB_NON_SHA_CIPHERS);
+                        break;
+                    default:
+                        runTests(Ciphers.SUPPORTED_NON_KRB_CIPHERS);
+                }
+                break;
+            case "krb":
+                runTests(Ciphers.SUPPORTED_KRB_CIPHERS);
+                break;
+            default:
+                throw new Error("Test error: unexpected test mode: " + TEST_MODE);
+        }
+    }
+
+    /**
+     * Returns maxPacketSize value used for MFLN extension testing
+     *
+     * @return - MLFN extension max packet size.
+     */
+    public int getMaxPacketSize() {
+        return maxPacketSize;
+    }
+
+    /**
+     * Checks that status of result {@code r} is {@code wantedStatus}.
+     *
+     * @param r            - Result.
+     * @param wantedStatus - Wanted status of the result.
+     * @throws AssertionError - if status or {@code r} is not
+     *                        {@code wantedStatus}.
+     */
+    public static void checkResult(SSLEngineResult r,
+                                   SSLEngineResult.Status wantedStatus) {
+        SSLEngineResult.Status rs = r.getStatus();
+        if (!rs.equals(wantedStatus)) {
+            throw new AssertionError("Unexpected status " + rs.name()
+                    + ", should be " + wantedStatus.name());
+        }
+    }
+
+    /**
+     * Returns SSLContext with TESTED_SECURITY_PROTOCOL protocol and sets up keys.
+     *
+     * @return - SSLContext with a protocol specified by TESTED_SECURITY_PROTOCOL.
+     */
+    public static SSLContext getContext() {
+        try {
+            KeyStore ks = KeyStore.getInstance("JKS");
+            KeyStore ts = KeyStore.getInstance("JKS");
+            char[] passphrase = PASSWD.toCharArray();
+            try (FileInputStream keyFileStream = new FileInputStream(KEY_FILE_NAME)) {
+                ks.load(keyFileStream, passphrase);
+            }
+            try (FileInputStream trustFileStream = new FileInputStream(TRUST_FILE_NAME)) {
+                ts.load(trustFileStream, passphrase);
+            }
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+            kmf.init(ks, passphrase);
+            TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+            tmf.init(ts);
+            SSLContext sslCtx = SSLContext.getInstance(TESTED_SECURITY_PROTOCOL);
+            sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+            return sslCtx;
+        } catch (KeyStoreException | IOException | NoSuchAlgorithmException |
+                CertificateException | UnrecoverableKeyException |
+                KeyManagementException ex) {
+            throw new Error("Unexpected exception", ex);
+        }
+    }
+
+    /**
+     * Sets up and starts kerberos KDC server.
+     */
+    public static void setUpAndStartKDC() {
+        String servicePrincipal = "host/" + SERVER_NAME + "@" + KRB_REALM;
+        Map<String, String> principals = new HashMap<>();
+        principals.put(KRB_USER_PRINCIPAL, KRB_USER_PASSWORD);
+        principals.put(KRBTGT_PRINCIPAL, null);
+        principals.put(servicePrincipal, null);
+        System.setProperty("java.security.krb5.conf", KRB5_CONF_FILENAME);
+        startKDC(KRB_REALM, principals, KTAB_FILENAME);
+        System.setProperty("java.security.auth.login.config",
+                TEST_SRC + FS + JAAS_CONF_FILE);
+        System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
+    }
+
+    /**
+     * Sets up and starts kerberos KDC server if SSLEngineTestCase.TEST_MODE is "krb".
+     */
+    public static void setUpAndStartKDCIfNeeded() {
+        if (TEST_MODE.equals("krb")) {
+            setUpAndStartKDC();
+        }
+    }
+
+    /**
+     * Returns client ssl engine.
+     *
+     * @param context - SSLContext to get SSLEngine from.
+     * @param useSNI  - flag used to enable or disable using SNI extension.
+     *                Needed for Kerberos.
+     */
+    public static SSLEngine getClientSSLEngine(SSLContext context, boolean useSNI) {
+        SSLEngine clientEngine = context.createSSLEngine(HOST, 80);
+        clientEngine.setUseClientMode(true);
+        if (useSNI) {
+            SNIHostName serverName = new SNIHostName(SERVER_NAME);
+            List<SNIServerName> serverNames = new ArrayList<>();
+            serverNames.add(serverName);
+            SSLParameters params = clientEngine.getSSLParameters();
+            params.setServerNames(serverNames);
+            clientEngine.setSSLParameters(params);
+        }
+        return clientEngine;
+    }
+
+    /**
+     * Returns server ssl engine.
+     *
+     * @param context - SSLContext to get SSLEngine from.
+     * @param useSNI  - flag used to enable or disable using SNI extension.
+     *                Needed for Kerberos.
+     */
+    public static SSLEngine getServerSSLEngine(SSLContext context, boolean useSNI) {
+        SSLEngine serverEngine = context.createSSLEngine();
+        serverEngine.setUseClientMode(false);
+        if (useSNI) {
+            SNIMatcher matcher = SNIHostName.createSNIMatcher(SNI_PATTERN);
+            List<SNIMatcher> matchers = new ArrayList<>();
+            matchers.add(matcher);
+            SSLParameters params = serverEngine.getSSLParameters();
+            params.setSNIMatchers(matchers);
+            serverEngine.setSSLParameters(params);
+        }
+        return serverEngine;
+    }
+
+    /**
+     * Runs the test case for one cipher suite.
+     *
+     * @param cipher - Cipher suite name.
+     * @throws SSLException - If tests fails.
+     */
+    abstract protected void testOneCipher(String cipher)
+            throws SSLException;
+
+    /**
+     * Iterates through an array of ciphers and runs the same test case for
+     * every entry.
+     *
+     * @param ciphers - Array of cipher names.
+     * @return - Number of tests failed.
+     */
+    protected int testSomeCiphers(Ciphers ciphers) {
+        int failedNum = 0;
+        String description = ciphers.description;
+        System.out.println("==================================================="
+                + "=========");
+        System.out.println(description + " ciphers testing");
+        System.out.println("==================================================="
+                + "=========");
+        for (String cs : ciphers.ciphers) {
+            System.out.println("-----------------------------------------------"
+                    + "-------------");
+            System.out.println("Testing cipher suite " + cs);
+            System.out.println("-----------------------------------------------"
+                    + "-------------");
+            Throwable error = null;
+            try {
+                testOneCipher(cs);
+            } catch (Throwable t) {
+                error = t;
+            }
+            switch (ciphers) {
+                case SUPPORTED_NON_KRB_CIPHERS:
+                case SUPPORTED_NON_KRB_NON_SHA_CIPHERS:
+                case SUPPORTED_KRB_CIPHERS:
+                case ENABLED_NON_KRB_NOT_ANON_CIPHERS:
+                    if (error != null) {
+                        System.out.println("Test Failed: " + cs);
+                        System.err.println("Test Exception for " + cs);
+                        error.printStackTrace();
+                        failedNum++;
+                    } else {
+                        System.out.println("Test Passed: " + cs);
+                    }
+                    break;
+                case UNSUPPORTED_CIPHERS:
+                    if (error == null) {
+                        System.out.println("Test Failed: " + cs);
+                        System.err.println("Test for " + cs + " should have thrown"
+                                + " IllegalArgumentException, but it has not!");
+                        failedNum++;
+                    } else if (!(error instanceof IllegalArgumentException)) {
+                        System.out.println("Test Failed: " + cs);
+                        System.err.println("Test Exception for " + cs);
+                        error.printStackTrace();
+                        failedNum++;
+                    } else {
+                        System.out.println("Test Passed: " + cs);
+                    }
+                    break;
+                default:
+                    throw new Error("Test issue: unexpected ciphers: "
+                            + ciphers.name());
+            }
+        }
+        return failedNum;
+    }
+
+    /**
+     * Method used for the handshake routine.
+     *
+     * @param wrapingEngine         - Engine that is expected to wrap data.
+     * @param unwrapingEngine       - Engine that is expected to unwrap data.
+     * @param maxPacketSize         - Maximum packet size for MFLN of zero for no limit.
+     * @param enableReplicatedPacks - Set {@code true} to enable replicated
+     *                              packet sending.
+     * @throws SSLException - thrown on engine errors.
+     */
+    private static void handshakeProcess(SSLEngine wrapingEngine,
+                                         SSLEngine unwrapingEngine,
+                                         int maxPacketSize,
+                                         boolean enableReplicatedPacks)
+            throws SSLException {
+        SSLEngineResult.HandshakeStatus wrapingHSStatus = wrapingEngine
+                .getHandshakeStatus();
+        SSLEngineResult.HandshakeStatus unwrapingHSStatus = unwrapingEngine
+                .getHandshakeStatus();
+        SSLEngineResult r;
+        String wrapper, unwrapper;
+        if (wrapingEngine.getUseClientMode()
+                && !unwrapingEngine.getUseClientMode()) {
+            wrapper = "Client";
+            unwrapper = "Server";
+        } else if (unwrapingEngine.getUseClientMode()
+                && !wrapingEngine.getUseClientMode()) {
+            wrapper = "Server";
+            unwrapper = "Client";
+        } else {
+            throw new Error("Both engines are in the same mode");
+        }
+        switch (wrapingHSStatus) {
+            case NEED_WRAP:
+                if (enableReplicatedPacks) {
+                    if (net != null) {
+                        net.flip();
+                        if (net.remaining() != 0) {
+                            if (wrapingEngine.getUseClientMode()) {
+                                netReplicatedServer = net;
+                            } else {
+                                netReplicatedClient = net;
+                            }
+                        }
+                    }
+                }
+                ByteBuffer app = ByteBuffer.allocate(wrapingEngine.getSession()
+                        .getApplicationBufferSize());
+                net = doWrap(wrapingEngine, wrapper, maxPacketSize, app);
+            case NOT_HANDSHAKING:
+                switch (unwrapingHSStatus) {
+                    case NEED_TASK:
+                        runDelegatedTasks(unwrapingEngine);
+                    case NEED_UNWRAP:
+                        doUnWrap(unwrapingEngine, unwrapper, net);
+                        if (enableReplicatedPacks) {
+                            System.out.println("Unwrapping replicated packet...");
+                            if (unwrapingEngine.getHandshakeStatus()
+                                    .equals(SSLEngineResult.HandshakeStatus.NEED_TASK)) {
+                                runDelegatedTasks(unwrapingEngine);
+                            }
+                            runDelegatedTasks(unwrapingEngine);
+                            ByteBuffer netReplicated;
+                            if (unwrapingEngine.getUseClientMode()) {
+                                netReplicated = netReplicatedClient;
+                            } else {
+                                netReplicated = netReplicatedServer;
+                            }
+                            if (netReplicated != null) {
+                                doUnWrap(unwrapingEngine, unwrapper, netReplicated);
+                            } else {
+                                net.flip();
+                                doUnWrap(unwrapingEngine, unwrapper, net);
+                            }
+                        }
+                        break;
+                    case NEED_UNWRAP_AGAIN:
+                        break;
+                    case NOT_HANDSHAKING:
+                        if (doUnwrapForNotHandshakingStatus) {
+                            doUnWrap(unwrapingEngine, unwrapper, net);
+                            doUnwrapForNotHandshakingStatus = false;
+                            break;
+                        } else {
+                            endHandshakeLoop = true;
+                        }
+                        break;
+                    default:
+                        throw new Error("Unexpected unwraping engine handshake status "
+                                + unwrapingHSStatus.name());
+                }
+                break;
+            case NEED_UNWRAP:
+                break;
+            case NEED_UNWRAP_AGAIN:
+                net.flip();
+                doUnWrap(wrapingEngine, wrapper, net);
+                break;
+            case NEED_TASK:
+                runDelegatedTasks(wrapingEngine);
+                break;
+            default:
+                throw new Error("Unexpected wraping engine handshake status "
+                        + wrapingHSStatus.name());
+        }
+    }
+
+    private static void runDelegatedTasks(SSLEngine engine) {
+        Runnable runnable;
+        System.out.println("Running delegated tasks...");
+        while ((runnable = engine.getDelegatedTask()) != null) {
+            runnable.run();
+        }
+        SSLEngineResult.HandshakeStatus hs = engine.getHandshakeStatus();
+        if (hs == SSLEngineResult.HandshakeStatus.NEED_TASK) {
+            throw new Error("Handshake shouldn't need additional tasks.");
+        }
+    }
+
+    /**
+     * Start a KDC server:
+     * - create a KDC instance
+     * - create Kerberos principals
+     * - save Kerberos configuration
+     * - save keys to keytab file
+     * - no pre-auth is required
+     */
+    private static void startKDC(String realm, Map<String, String> principals,
+                                 String ktab) {
+        try {
+            KDC kdc = KDC.create(realm, HOST, 0, true);
+            kdc.setOption(KDC.Option.PREAUTH_REQUIRED, Boolean.FALSE);
+            if (principals != null) {
+                principals.entrySet().stream().forEach((entry) -> {
+                    String name = entry.getKey();
+                    String password = entry.getValue();
+                    if (password == null || password.isEmpty()) {
+                        System.out.println("KDC: add a principal '" + name
+                                + "' with a random password");
+                        kdc.addPrincipalRandKey(name);
+                    } else {
+                        System.out.println("KDC: add a principal '" + name
+                                + "' with '" + password + "' password");
+                        kdc.addPrincipal(name, password.toCharArray());
+                    }
+                });
+            }
+            KDC.saveConfig(KRB5_CONF_FILENAME, kdc);
+            if (ktab != null) {
+                File ktabFile = new File(ktab);
+                if (ktabFile.exists()) {
+                    System.out.println("KDC: append keys to an exising "
+                            + "keytab file " + ktab);
+                    kdc.appendKtab(ktab);
+                } else {
+                    System.out.println("KDC: create a new keytab file "
+                            + ktab);
+                    kdc.writeKtab(ktab);
+                }
+            }
+            System.out.println("KDC: started on " + HOST + ":" + kdc.getPort()
+                    + " with '" + realm + "' realm");
+        } catch (Exception e) {
+            throw new RuntimeException("KDC: unexpected exception", e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/UnsupportedCiphersTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+
+/**
+ * Testing that try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class UnsupportedCiphersTest extends SSLEngineTestCase {
+
+    public static void main(String[] s) {
+        UnsupportedCiphersTest test = new UnsupportedCiphersTest();
+        test.runTests(Ciphers.UNSUPPORTED_CIPHERS);
+    }
+
+    @Override
+    protected void testOneCipher(String cipher) {
+        unsupTest(cipher, true);
+        unsupTest(cipher, false);
+    }
+
+    private void unsupTest(String cipher, boolean clientTest) {
+        SSLContext context = getContext();
+        SSLEngine clientEngine = context.createSSLEngine();
+        clientEngine.setUseClientMode(true);
+        SSLEngine serverEngine = context.createSSLEngine();
+        serverEngine.setUseClientMode(false);
+        if (clientTest) {
+            clientEngine.setEnabledCipherSuites(new String[]{cipher});
+        } else {
+            serverEngine.setEnabledCipherSuites(new String[]{cipher});
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/jaas.conf	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,17 @@
+com.sun.net.ssl.client {
+    com.sun.security.auth.module.Krb5LoginModule required
+    principal="USER@TEST.REALM"
+    doNotPrompt=true
+    useKeyTab=true
+    keyTab="krb5.keytab.data";
+};
+
+com.sun.net.ssl.server {
+    com.sun.security.auth.module.Krb5LoginModule required
+    principal="host/service.localhost@TEST.REALM"
+    isInitiator=false
+    useKeyTab=true
+    keyTab="krb5.keytab.data"
+    storeKey=true;
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSDataExchangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS application data exchange using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSDataExchangeTest
+ */
+
+/**
+ * Testing TLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class TLSDataExchangeTest {
+    public static void main(String[] args) {
+        DataExchangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSEnginesClosureTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines closing using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSEnginesClosureTest
+ */
+
+/**
+ * Testing TLS engines closing using each of the supported cipher suites.
+ */
+public class TLSEnginesClosureTest {
+    public static void main(String[] args) {
+        EnginesClosureTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSHandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSHandshakeTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites.
+ */
+public class TLSHandshakeTest {
+    public static void main(String[] args) {
+        HandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSMFLNTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ *          cipher suites with different maximum fragment length. Testing of
+ *          MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSMFLNTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class TLSMFLNTest {
+    public static void main(String[] args) {
+        MFLNTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSNotEnabledRC4Test.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 TLSNotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class TLSNotEnabledRC4Test {
+    public static void main(String[] args) throws Exception {
+        NotEnabledRC4Test.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSRehandshakeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class TLSRehandshakeTest {
+    public static void main(String[] args) {
+        RehandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeWithCipherChangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking with cipher change. New cipher
+ *          is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 TLSRehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class TLSRehandshakeWithCipherChangeTest {
+    public static void main(String[] args) {
+        RehandshakeWithCipherChangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeWithDataExTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ *          cipher suites with application data exchange before and after
+ *          re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSRehandshakeWithDataExTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class TLSRehandshakeWithDataExTest {
+    public static void main(String[] args) {
+        RehandshakeWithDataExTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSUnsupportedCiphersTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing that try to enable unsupported ciphers
+ *          causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 TLSUnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class TLSUnsupportedCiphersTest {
+    public static void main(String[] args) {
+        UnsupportedCiphersTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSDataExchangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS application data exchange using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSDataExchangeTest
+ */
+
+/**
+ * Testing TLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class TLSDataExchangeTest {
+    public static void main(String[] args) {
+        DataExchangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSEnginesClosureTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines closing using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSEnginesClosureTest
+ */
+
+/**
+ * Testing TLS engines closing using each of the supported cipher suites.
+ */
+public class TLSEnginesClosureTest {
+    public static void main(String[] args) {
+        EnginesClosureTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSHandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSHandshakeTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites.
+ */
+public class TLSHandshakeTest {
+    public static void main(String[] args) {
+        HandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSMFLNTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ *          cipher suites with different maximum fragment length. Testing of
+ *          MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSMFLNTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class TLSMFLNTest {
+    public static void main(String[] args) {
+        MFLNTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSNotEnabledRC4Test.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSNotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class TLSNotEnabledRC4Test {
+    public static void main(String[] args) throws Exception {
+        NotEnabledRC4Test.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ *          cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSRehandshakeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class TLSRehandshakeTest {
+    public static void main(String[] args) {
+        RehandshakeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeWithCipherChangeTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking with cipher change. New cipher
+ *          is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSRehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class TLSRehandshakeWithCipherChangeTest {
+    public static void main(String[] args) {
+        RehandshakeWithCipherChangeTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeWithDataExTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ *          cipher suites with application data exchange before and after
+ *          re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSRehandshakeWithDataExTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class TLSRehandshakeWithDataExTest {
+    public static void main(String[] args) {
+        RehandshakeWithDataExTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSUnsupportedCiphersTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing that try to enable unsupported ciphers
+ *          causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSUnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class TLSUnsupportedCiphersTest {
+    public static void main(String[] args) {
+        UnsupportedCiphersTest.main(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/security/auth/kerberos/DelegationPermissionCollection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for DelegationPermissionCollection subclass
+ */
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+import javax.security.auth.kerberos.DelegationPermission;
+
+public class DelegationPermissionCollection {
+
+    private static final String FOO = "\"host/foo.example.com@EXAMPLE.COM\"";
+    private static final String BAR = "\"host/bar.example.com@EXAMPLE.COM\"";
+    private static final String TGT = "\"krbtgt/EXAMPLE.COM@EXAMPLE.COM\"";
+
+    public static void main(String[] args) throws Exception {
+
+        int testFail = 0;
+
+        DelegationPermission perm = new DelegationPermission(FOO + " " + TGT);
+        PermissionCollection perms = perm.newPermissionCollection();
+
+        // test 1
+        System.out.println
+            ("test 1: add throws IllegalArgException for wrong perm type");
+        try {
+            perms.add(new SecurityPermission("createAccessControlContext"));
+            System.err.println("Expected IllegalArgumentException");
+            testFail++;
+        } catch (IllegalArgumentException iae) {}
+
+        // test 2
+        System.out.println("test 2: implies returns false for wrong perm type");
+        if (perms.implies(new SecurityPermission("getPolicy"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 3
+        System.out.println("test 3: implies returns true for match on name");
+        perms.add(new DelegationPermission(FOO + " " + TGT));
+        if (!perms.implies(new DelegationPermission(FOO + " " + TGT))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 4
+        System.out.println
+            ("test 4: implies returns false for non-match on name");
+        if (perms.implies(new DelegationPermission(BAR + " " + TGT))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 5
+        System.out.println("test 5: elements returns correct number of perms");
+        int numPerms = 0;
+        Enumeration<Permission> e = perms.elements();
+        while (e.hasMoreElements()) {
+            numPerms++;
+            System.out.println(e.nextElement());
+        }
+        if (numPerms != 1) {
+            System.err.println("Expected 1, got " + numPerms);
+            testFail++;
+        }
+
+        if (testFail > 0) {
+            throw new Exception(testFail + " test(s) failed");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/security/auth/kerberos/ServicePermissionCollection.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for ServicePermissionCollection subclass
+ */
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+import javax.security.auth.kerberos.ServicePermission;
+
+public class ServicePermissionCollection {
+
+    private static final String FOO = "host/foo.example.com@EXAMPLE.COM";
+    private static final String BAR = "host/bar.example.com@EXAMPLE.COM";
+    private static final String BAZ = "host/baz.example.com@EXAMPLE.COM";
+
+    public static void main(String[] args) throws Exception {
+
+        int testFail = 0;
+
+        ServicePermission perm = new ServicePermission(FOO, "accept");
+        PermissionCollection perms = perm.newPermissionCollection();
+
+        // test 1
+        System.out.println
+            ("test 1: add throws IllegalArgExc for wrong permission type");
+        try {
+            perms.add(new SecurityPermission("createAccessControlContext"));
+            System.err.println("Expected IllegalArgumentException");
+            testFail++;
+        } catch (IllegalArgumentException iae) {}
+
+        // test 2
+        System.out.println("test 2: implies returns false for wrong perm type");
+        if (perms.implies(new SecurityPermission("getPolicy"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 3
+        System.out.println
+            ("test 3: implies returns true for match on name and action");
+        perms.add(new ServicePermission(FOO, "accept"));
+        if (!perms.implies(new ServicePermission(FOO, "accept"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 4
+        System.out.println
+            ("test 4: implies returns false for match on name but not action");
+        if (perms.implies(new ServicePermission(FOO, "initiate"))) {
+            System.err.println("Expected false, returned true");
+            testFail++;
+        }
+
+        // test 5
+        System.out.println("test 5: implies returns true for match on " +
+                           "name and subset of actions");
+        perms.add(new ServicePermission(BAR, "accept, initiate"));
+        if (!perms.implies(new ServicePermission(BAR, "accept"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 6
+        System.out.println("test 6: implies returns false for aggregate " +
+                           "match on name and action");
+        perms.add(new ServicePermission(BAZ, "accept"));
+        perms.add(new ServicePermission(BAZ, "initiate"));
+        if (!perms.implies(new ServicePermission(BAZ, "initiate"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+        if (!perms.implies(new ServicePermission(BAZ, "initiate, accept"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 7
+        System.out.println("test 7: implies returns true for wildcard " +
+                           "match on name and action");
+        perms.add(new ServicePermission("*", "initiate"));
+        if (!perms.implies(new ServicePermission("Duke", "initiate"))) {
+            System.err.println("Expected true, returned false");
+            testFail++;
+        }
+
+        // test 8
+        System.out.println("test 8: elements returns correct number of perms");
+        int numPerms = 0;
+        Enumeration<Permission> e = perms.elements();
+        while (e.hasMoreElements()) {
+            numPerms++;
+            System.out.println(e.nextElement());
+        }
+        // the 2 FOO permissions and the 2 BAZ permisssions
+        // are combined into one
+        if (numPerms != 4) {
+            System.err.println("Expected 4, got " + numPerms);
+            testFail++;
+        }
+
+        if (testFail > 0) {
+            throw new Exception(testFail + " test(s) failed");
+        }
+    }
+}
--- a/jdk/test/sun/text/resources/LocaleData	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/sun/text/resources/LocaleData	Wed Jul 05 20:37:47 2017 +0200
@@ -5414,11 +5414,13 @@
 FormatData/en_SG/TimePatterns/1=h:mm:ss a z
 FormatData/en_SG/TimePatterns/2=h:mm:ss a
 FormatData/en_SG/TimePatterns/3=h:mm a
-FormatData/en_SG/DatePatterns/0=EEEE, MMMM d, yyyy
-FormatData/en_SG/DatePatterns/1=MMMM d, yyyy
-FormatData/en_SG/DatePatterns/2=MMM d, yyyy
-FormatData/en_SG/DatePatterns/3=M/d/yy
 FormatData/en_SG/DateTimePatterns/0={1} {0}
+# bug# 8080774
+# Day should precede month for all date formats in en_SG - CLDR 27.0.0
+FormatData/en_SG/DatePatterns/0=EEEE, d MMMM, yyyy
+FormatData/en_SG/DatePatterns/1=d MMMM, yyyy
+FormatData/en_SG/DatePatterns/2=d MMM, yyyy
+FormatData/en_SG/DatePatterns/3=d/M/yy
 # Use approved data
 FormatData/ms/Eras/0=BCE
 FormatData/ms/Eras/1=CE
--- a/jdk/test/sun/text/resources/LocaleDataTest.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -36,7 +36,7 @@
  *      6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495
  *      7003124 7085757 7028073 7171028 7189611 8000983 7195759 8004489 8006509
  *      7114053 7074882 7040556 8013836 8021121 6192407 6931564 8027695 8017142
- *      8037343 8055222 8042126 8074791 8075173
+ *      8037343 8055222 8042126 8074791 8075173 8080774
  * @summary Verify locale data
  *
  */
--- a/jdk/test/sun/tools/jmap/heapconfig/JMapHeapConfigTest.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/sun/tools/jmap/heapconfig/JMapHeapConfigTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -21,25 +21,29 @@
  * questions.
  */
 
-/*
- * @test
- * @bug 8042397
- * @summary Unit test for jmap utility test heap configuration reader
- * @library /lib/testlibrary
- * @modules java.management
- * @build jdk.testlibrary.*
- * @build JMapHeapConfigTest LingeredApp TmtoolTestScenario
- * @run main JMapHeapConfigTest
- */
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+
+import jdk.test.lib.apps.LingeredApp;
 import jdk.testlibrary.Utils;
 import jdk.testlibrary.Platform;
 
+/*
+ * @test
+ * @bug 8042397
+ * @summary Unit test for jmap utility test heap configuration reader
+ * @library /../../test/lib/share/classes
+ * @library /lib/testlibrary
+ * @modules java.management
+ * @build jdk.testlibrary.*
+ * @build jdk.test.lib.apps.*
+ * @build JMapHeapConfigTest TmtoolTestScenario
+ * @run main JMapHeapConfigTest
+ */
 public class JMapHeapConfigTest {
 
     static final String expectedJMapValues[] = {
--- a/jdk/test/sun/tools/jmap/heapconfig/LingeredApp.java	Thu Jun 11 20:19:18 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,431 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.nio.file.attribute.FileTime;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * This is a framework to launch an app that could be synchronized with caller
- * to make further attach actions reliable across supported platforms
-
- * Caller example:
- *   SmartTestApp a = SmartTestApp.startApp(cmd);
- *     // do something
- *   a.stopApp();
- *
- *   or fine grained control
- *
- *   a = new SmartTestApp("MyLock.lck");
- *   a.createLock();
- *   a.runApp();
- *   a.waitAppReady();
- *     // do something
- *   a.deleteLock();
- *   a.waitAppTerminate();
- *
- *  Then you can work with app output and process object
- *
- *   output = a.getAppOutput();
- *   process = a.getProcess();
- *
- */
-public class LingeredApp {
-
-    private static final long spinDelay = 1000;
-
-    private final String lockFileName;
-    private long lockCreationTime;
-    private Process appProcess;
-    private final ArrayList<String> storedAppOutput;
-
-    /*
-     * Drain child process output, store it into string array
-     */
-    class InputGobbler extends Thread {
-
-        InputStream is;
-        List<String> astr;
-
-        InputGobbler(InputStream is, List<String> astr) {
-            this.is = is;
-            this.astr = astr;
-        }
-
-        public void run() {
-            try {
-                InputStreamReader isr = new InputStreamReader(is);
-                BufferedReader br = new BufferedReader(isr);
-                String line = null;
-                while ((line = br.readLine()) != null) {
-                    astr.add(line);
-                }
-            } catch (IOException ex) {
-                // pass
-            }
-        }
-    }
-
-    /**
-     * Create LingeredApp object on caller side. Lock file have be a valid filename
-     * at writable location
-     *
-     * @param lockFileName - the name of lock file
-     */
-    public LingeredApp(String lockFileName) {
-        this.lockFileName = lockFileName;
-        this.storedAppOutput = new ArrayList();
-    }
-
-    /**
-     *
-     * @return name of lock file
-     */
-    public String getLockFileName() {
-        return this.lockFileName;
-    }
-
-    /**
-     *
-     * @return name of testapp
-     */
-    public String getAppName() {
-        return this.getClass().getName();
-    }
-
-    /**
-     *
-     *  @return pid of java process running testapp
-     */
-    public long getPid() {
-        if (appProcess == null) {
-            throw new RuntimeException("Process is not alive");
-        }
-        return appProcess.getPid();
-    }
-
-    /**
-     *
-     * @return process object
-     */
-    public Process getProcess() {
-        return appProcess;
-    }
-
-    /**
-     *
-     * @return application output as string array. Empty array if application produced no output
-     */
-    List<String> getAppOutput() {
-        if (appProcess.isAlive()) {
-            throw new RuntimeException("Process is still alive. Can't get its output.");
-        }
-        return storedAppOutput;
-    }
-
-    /* Make sure all part of the app use the same method to get dates,
-     as different methods could produce different results
-     */
-    private static long epoch() {
-        return new Date().getTime();
-    }
-
-    private static long lastModified(String fileName) throws IOException {
-        Path path = Paths.get(fileName);
-        BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
-        return attr.lastModifiedTime().toMillis();
-    }
-
-    private static void setLastModified(String fileName, long newTime) throws IOException {
-        Path path = Paths.get(fileName);
-        FileTime fileTime = FileTime.fromMillis(newTime);
-        Files.setLastModifiedTime(path, fileTime);
-    }
-
-    /**
-     * create lock
-     *
-     * @throws IOException
-     */
-    public void createLock() throws IOException {
-        Path path = Paths.get(lockFileName);
-        // Files.deleteIfExists(path);
-        Files.createFile(path);
-        lockCreationTime = lastModified(lockFileName);
-    }
-
-    /**
-     * Delete lock
-     *
-     * @throws IOException
-     */
-    public void deleteLock() throws IOException {
-        try {
-            Path path = Paths.get(lockFileName);
-            Files.delete(path);
-        } catch (NoSuchFileException ex) {
-            // Lock already deleted. Ignore error
-        }
-    }
-
-    public void waitAppTerminate() {
-        while (true) {
-            try {
-                appProcess.waitFor();
-                break;
-            } catch (InterruptedException ex) {
-                // pass
-            }
-        }
-    }
-
-    /**
-     * The app touches the lock file when it's started
-     * wait while it happens. Caller have to delete lock on wait error.
-     *
-     * @param timeout
-     * @throws java.io.IOException
-     */
-    public void waitAppReady(long timeout) throws IOException {
-        long here = epoch();
-        while (true) {
-            long epoch = epoch();
-            if (epoch - here > (timeout * 1000)) {
-                throw new IOException("App waiting timeout");
-            }
-
-            // Live process should touch lock file every second
-            long lm = lastModified(lockFileName);
-            if (lm > lockCreationTime) {
-                break;
-            }
-
-            // Make sure process didn't already exit
-            if (!appProcess.isAlive()) {
-                throw new IOException("App exited unexpectedly with " + appProcess.exitValue());
-            }
-
-            try {
-                Thread.sleep(spinDelay);
-            } catch (InterruptedException ex) {
-                // pass
-            }
-        }
-    }
-
-    /**
-     * Run the app
-     *
-     * @param vmArguments
-     * @throws IOException
-     */
-    public void runApp(List<String> vmArguments)
-            throws IOException {
-
-        // We should always use testjava or throw an exception,
-        // so we can't use JDKToolFinder.getJDKTool("java");
-        // that falls back to compile java on error
-        String jdkPath = System.getProperty("test.jdk");
-        if (jdkPath == null) {
-            // we are not under jtreg, try env
-            Map<String, String> env = System.getenv();
-            jdkPath = env.get("TESTJAVA");
-        }
-
-        if (jdkPath == null) {
-            throw new RuntimeException("Can't determine jdk path neither test.jdk property no TESTJAVA env are set");
-        }
-
-        String osname = System.getProperty("os.name");
-        String javapath = jdkPath + ((osname.startsWith("window")) ? "/bin/java.exe" : "/bin/java");
-
-        List<String> cmd = new ArrayList();
-        cmd.add(javapath);
-
-
-        if (vmArguments == null) {
-            // Propagate test.vm.options to LingeredApp, filter out possible empty options
-            String testVmOpts[] = System.getProperty("test.vm.opts","").split("\\s+");
-            for (String s : testVmOpts) {
-                if (!s.equals("")) {
-                    cmd.add(s);
-                }
-            }
-        }
-        else{
-            // Lets user manage LingerApp options
-            cmd.addAll(vmArguments);
-        }
-
-        // Make sure we set correct classpath to run the app
-        cmd.add("-cp");
-        String classpath = System.getProperty("test.class.path");
-        cmd.add((classpath == null) ? "." : classpath);
-
-        cmd.add(this.getAppName());
-        cmd.add(lockFileName);
-
-        // Reporting
-        StringBuilder cmdLine = new StringBuilder();
-        for (String strCmd : cmd) {
-            cmdLine.append("'").append(strCmd).append("' ");
-        }
-
-        // A bit of verbosity
-        System.out.println("Command line: [" + cmdLine.toString() + "]");
-
-        ProcessBuilder pb = new ProcessBuilder(cmd);
-        // we don't expect any error output but make sure we are not stuck on pipe
-        // pb.redirectErrorStream(false);
-        pb.redirectError(ProcessBuilder.Redirect.INHERIT);
-
-        appProcess = pb.start();
-
-        // Create pipe reader for process, and read stdin and stderr to array of strings
-        InputGobbler gb = new InputGobbler(appProcess.getInputStream(), storedAppOutput);
-        gb.start();
-    }
-
-    /**
-     *  High level interface for test writers
-     */
-    /**
-     * Factory method that creates SmartAppTest object with ready to use application
-     * lock name is autogenerated, wait timeout is hardcoded
-     * @param cmd - vm options, could be null to auto add testvm.options
-     * @return LingeredApp object
-     * @throws IOException
-     */
-    public static LingeredApp startApp(List<String> cmd) throws IOException {
-        final String lockName = UUID.randomUUID().toString() + ".lck";
-        final int waitTime = 10;
-
-        LingeredApp a = new LingeredApp(lockName);
-        a.createLock();
-        try {
-            a.runApp(cmd);
-            a.waitAppReady(waitTime);
-        } catch (Exception ex) {
-            a.deleteLock();
-            throw ex;
-        }
-
-        return a;
-    }
-
-    public static LingeredApp startApp() throws IOException {
-        return startApp(null);
-    }
-
-    /**
-     * Delete lock file that signal app to terminate, then
-     * waits until app is actually terminated.
-     * @throws IOException
-     */
-    public void stopApp() throws IOException {
-        deleteLock();
-        waitAppTerminate();
-        int exitcode = appProcess.exitValue();
-        if (exitcode != 0) {
-            throw new IOException("LingeredApp terminated with non-zero exit code " + exitcode);
-        }
-    }
-
-    /**
-     * LastModified time might not work correctly in some cases it might
-     * cause later failures
-     */
-
-    public static boolean isLastModifiedWorking() {
-        boolean sane = true;
-        try {
-            long lm = lastModified(".");
-            if (lm == 0) {
-                System.err.println("SANITY Warning! The lastModifiedTime() doesn't work on this system, it returns 0");
-                sane = false;
-            }
-
-            long now = epoch();
-            if (lm > now) {
-                System.err.println("SANITY Warning! The Clock is wrong on this system lastModifiedTime() > getTime()");
-                sane = false;
-            }
-
-            setLastModified(".", epoch());
-            long lm1 = lastModified(".");
-            if (lm1 <= lm) {
-                System.err.println("SANITY Warning! The setLastModified doesn't work on this system");
-                sane = false;
-            }
-        }
-        catch(IOException e) {
-            System.err.println("SANITY Warning! IOException during sanity check " + e);
-            sane = false;
-        }
-
-        return sane;
-    }
-
-    /**
-     * This part is the application it self
-     */
-    public static void main(String args[]) {
-
-        if (args.length != 1) {
-            System.err.println("Lock file name is not specified");
-            System.exit(7);
-        }
-
-        String theLockFileName = args[0];
-
-        try {
-            Path path = Paths.get(theLockFileName);
-
-            while (Files.exists(path)) {
-                // Touch the lock to indicate our readiness
-                setLastModified(theLockFileName, epoch());
-                Thread.sleep(spinDelay);
-            }
-        } catch (NoSuchFileException ex) {
-            // Lock deleted while we are setting last modified time.
-            // Ignore error and lets the app exits
-        } catch (Exception ex) {
-            System.err.println("LingeredApp ERROR: " + ex);
-            // Leave exit_code = 1 to Java launcher
-            System.exit(3);
-        }
-
-        System.exit(0);
-    }
-}
--- a/jdk/test/sun/tools/jmap/heapconfig/LingeredAppTest.java	Thu Jun 11 20:19:18 2015 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @summary Unit test for LingeredApp
- * @compile LingeredAppTest.java
- * @compile LingeredApp.java
- * @run main LingeredAppTest
- */
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-public class LingeredAppTest {
-
-    public static void main(String[] args) {
-        try {
-            System.out.println("Starting LingeredApp with default parameters");
-
-            ArrayList<String> cmd = new ArrayList();
-
-            // Propagate test.vm.options to LingeredApp, filter out possible empty options
-            String testVmOpts[] = System.getProperty("test.vm.opts","").split("\\s+");
-            for (String s : testVmOpts) {
-                if (!s.equals("")) {
-                    cmd.add(s);
-                }
-            }
-
-            cmd.add("-XX:+PrintFlagsFinal");
-
-            LingeredApp a = LingeredApp.startApp(cmd);
-            System.out.printf("App pid: %d\n", a.getPid());
-            a.stopApp();
-
-            System.out.println("App output:");
-            int count = 0;
-            for (String line : a.getAppOutput()) {
-                count += 1;
-            }
-            System.out.println("Found " + count + " lines in VM output");
-            System.out.println("Test PASSED");
-        } catch (IOException ex) {
-            ex.printStackTrace();
-            System.out.println("Test ERROR");
-            System.exit(3);
-        }
-    }
-}
--- a/jdk/test/sun/tools/jmap/heapconfig/TmtoolTestScenario.java	Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/sun/tools/jmap/heapconfig/TmtoolTestScenario.java	Wed Jul 05 20:37:47 2017 +0200
@@ -31,6 +31,8 @@
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+
+import jdk.test.lib.apps.LingeredApp;
 import jdk.testlibrary.JDKToolLauncher;
 import jdk.testlibrary.Utils;
 
--- a/make/CompileJavaModules.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/make/CompileJavaModules.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -507,6 +507,10 @@
 # space separated list.
 JDK_USER_DEFINED_FILTER := $(strip $(subst $(COMMA),$(SPACE), $(JDK_FILTER)))
 
+# Create an empty directory to set the bootclasspath to.
+EMPTY_BOOTCLASSPATH := $(SUPPORT_OUTPUTDIR)/empty-dir
+$(call MakeDir, $(EMPTY_BOOTCLASSPATH))
+
 # This macro sets up compilation of a module and declares dependencies for it.
 # Param 1 - module name
 define SetupModuleCompilation
@@ -525,7 +529,7 @@
     $1_CLASSPATH := $$($1_CLASSPATH) $$(addprefix $(JDK_OUTPUTDIR)/modules/,jdk.hotspot.agent)
   endif
   $1_CLASSPATH := $$(subst $$(SPACE),$$(PATH_SEP),$$($1_CLASSPATH))
-  $1_JAVAC_FLAGS := -bootclasspath "$$($1_CLASSPATH)" $$($1_ADD_JAVAC_FLAGS)
+  $1_JAVAC_FLAGS := -bootclasspath $(EMPTY_BOOTCLASSPATH) -classpath "$$($1_CLASSPATH)" $$($1_ADD_JAVAC_FLAGS)
 
   $$(eval $$(call SetupJavaCompilation,$1, \
       SETUP := $$(if $$($1_SETUP), $$($1_SETUP), GENERATE_JDKBYTECODE), \
--- a/make/common/JavaCompilation.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/make/common/JavaCompilation.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -561,10 +561,6 @@
 
     $$($1_BIN)/_the.$1_batch: $$($1_SRCS) $$($1_DEPENDS) $$($1_VARDEPS_FILE)
 	$(MKDIR) -p $$(@D) $$(dir $$($1_SJAVAC_PORTFILE))
-        # As a workaround for sjavac not tracking api changed from the classpath, force full
-        # recompile if an external dependency, which is something other than a source
-        # change, triggered this compilation.
-	$$(if $$(filter-out $$($1_SRCS), $$?), $(FIND) $$(@D) -name "*.class" $(FIND_DELETE))
 	$$(call ListPathsSafely,$1_SRCS,\n, >> $$($1_BIN)/_the.$1_batch.tmp)
 	$(ECHO) Compiling $1
 	($$($1_JVM) $$($1_SJAVAC) \
--- a/make/common/NativeCompilation.gmk	Thu Jun 11 20:19:18 2015 -0700
+++ b/make/common/NativeCompilation.gmk	Wed Jul 05 20:37:47 2017 +0200
@@ -449,6 +449,16 @@
     $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release)
   endif
 
+  # If no C++ flags are explicitly set, default to using the C flags.
+  # After that, we can set additional C++ flags that should not interfere
+  # with the mechanism for copying the C flags by default.
+  ifeq ($$($1_CXXFLAGS),)
+    $1_CXXFLAGS:=$$($1_CFLAGS)
+  endif
+  ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
+    $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
+  endif
+
   ifeq ($$($1_DEBUG_SYMBOLS), true)
     ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
       ifdef OPENJDK
@@ -466,16 +476,6 @@
     endif
   endif
 
-  # If no C++ flags are explicitly set, default to using the C flags.
-  # After that, we can set additional C++ flags that should not interfere
-  # with the mechanism for copying the C flags by default.
-  ifeq ($$($1_CXXFLAGS),)
-    $1_CXXFLAGS:=$$($1_CFLAGS)
-  endif
-  ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
-    $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
-  endif
-
   ifneq (,$$($1_REORDER))
     $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
     $1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib-test/jdk/test/lib/apps/LingeredAppTest.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Unit test for LingeredApp
+ * @compile LingeredAppTest.java
+ * @compile LingeredApp.java
+ * @run main LingeredAppTest
+ */
+
+package jdk.test.lib.apps;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class LingeredAppTest {
+
+    public static void main(String[] args) {
+        try {
+            System.out.println("Starting LingeredApp with default parameters");
+
+            ArrayList<String> cmd = new ArrayList<String>();
+
+            // Propagate test.vm.options to LingeredApp, filter out possible empty options
+            String testVmOpts[] = System.getProperty("test.vm.opts","").split("\\s+");
+            for (String s : testVmOpts) {
+                if (!s.equals("")) {
+                    cmd.add(s);
+                }
+            }
+
+            cmd.add("-XX:+PrintFlagsFinal");
+
+            LingeredApp a = LingeredApp.startApp(cmd);
+            System.out.printf("App pid: %d\n", a.getPid());
+            a.stopApp();
+
+            System.out.println("App output:");
+            int count = 0;
+            for (String line : a.getAppOutput()) {
+                count += 1;
+            }
+            System.out.println("Found " + count + " lines in VM output");
+            System.out.println("Test PASSED");
+        } catch (IOException ex) {
+            ex.printStackTrace();
+            System.out.println("Test ERROR");
+            System.exit(3);
+        }
+    }
+}
--- a/test/lib/Makefile	Thu Jun 11 20:19:18 2015 -0700
+++ b/test/lib/Makefile	Wed Jul 05 20:37:47 2017 +0200
@@ -42,7 +42,8 @@
 JAR = $(JDK_HOME)/bin/jar
 
 WB_SRC_FILES = $(shell find $(SRC_DIR)/sun/hotspot -name '*.java')
-SHARE_SRC_FILES = $(shell find $(SRC_DIR)/share/classes -name '*.java')
+# test-lib.jar will contain only hprof classes until JDK-8081381 is resolved
+SHARE_SRC_FILES = $(shell find $(SRC_DIR)/share/classes/jdk/test/lib/hprof -name '*.java')
 
 .PHONY: wb.filelist share.filelist clean cleantmp
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/share/classes/jdk/test/lib/apps/LingeredApp.java	Wed Jul 05 20:37:47 2017 +0200
@@ -0,0 +1,434 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.test.lib.apps;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * This is a framework to launch an app that could be synchronized with caller
+ * to make further attach actions reliable across supported platforms
+
+ * Caller example:
+ *   SmartTestApp a = SmartTestApp.startApp(cmd);
+ *     // do something
+ *   a.stopApp();
+ *
+ *   or fine grained control
+ *
+ *   a = new SmartTestApp("MyLock.lck");
+ *   a.createLock();
+ *   a.runApp();
+ *   a.waitAppReady();
+ *     // do something
+ *   a.deleteLock();
+ *   a.waitAppTerminate();
+ *
+ *  Then you can work with app output and process object
+ *
+ *   output = a.getAppOutput();
+ *   process = a.getProcess();
+ *
+ */
+public class LingeredApp {
+
+    private static final long spinDelay = 1000;
+
+    private final String lockFileName;
+    private long lockCreationTime;
+    private Process appProcess;
+    private final ArrayList<String> storedAppOutput;
+
+    /*
+     * Drain child process output, store it into string array
+     */
+    class InputGobbler extends Thread {
+
+        InputStream is;
+        List<String> astr;
+
+        InputGobbler(InputStream is, List<String> astr) {
+            this.is = is;
+            this.astr = astr;
+        }
+
+        public void run() {
+            try {
+                InputStreamReader isr = new InputStreamReader(is);
+                BufferedReader br = new BufferedReader(isr);
+                String line = null;
+                while ((line = br.readLine()) != null) {
+                    astr.add(line);
+                }
+            } catch (IOException ex) {
+                // pass
+            }
+        }
+    }
+
+    /**
+     * Create LingeredApp object on caller side. Lock file have be a valid filename
+     * at writable location
+     *
+     * @param lockFileName - the name of lock file
+     */
+    public LingeredApp(String lockFileName) {
+        this.lockFileName = lockFileName;
+        this.storedAppOutput = new ArrayList<String>();
+    }
+
+    /**
+     *
+     * @return name of lock file
+     */
+    public String getLockFileName() {
+        return this.lockFileName;
+    }
+
+    /**
+     *
+     * @return name of testapp
+     */
+    public String getAppName() {
+        return this.getClass().getName();
+    }
+
+    /**
+     *
+     *  @return pid of java process running testapp
+     */
+    public long getPid() {
+        if (appProcess == null) {
+            throw new RuntimeException("Process is not alive");
+        }
+        return appProcess.getPid();
+    }
+
+    /**
+     *
+     * @return process object
+     */
+    public Process getProcess() {
+        return appProcess;
+    }
+
+    /**
+     *
+     * @return application output as string array. Empty array if application produced no output
+     */
+    public List<String> getAppOutput() {
+        if (appProcess.isAlive()) {
+            throw new RuntimeException("Process is still alive. Can't get its output.");
+        }
+        return storedAppOutput;
+    }
+
+    /* Make sure all part of the app use the same method to get dates,
+     as different methods could produce different results
+     */
+    private static long epoch() {
+        return new Date().getTime();
+    }
+
+    private static long lastModified(String fileName) throws IOException {
+        Path path = Paths.get(fileName);
+        BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
+        return attr.lastModifiedTime().toMillis();
+    }
+
+    private static void setLastModified(String fileName, long newTime) throws IOException {
+        Path path = Paths.get(fileName);
+        FileTime fileTime = FileTime.fromMillis(newTime);
+        Files.setLastModifiedTime(path, fileTime);
+    }
+
+    /**
+     * create lock
+     *
+     * @throws IOException
+     */
+    public void createLock() throws IOException {
+        Path path = Paths.get(lockFileName);
+        // Files.deleteIfExists(path);
+        Files.createFile(path);
+        lockCreationTime = lastModified(lockFileName);
+    }
+
+    /**
+     * Delete lock
+     *
+     * @throws IOException
+     */
+    public void deleteLock() throws IOException {
+        try {
+            Path path = Paths.get(lockFileName);
+            Files.delete(path);
+        } catch (NoSuchFileException ex) {
+            // Lock already deleted. Ignore error
+        }
+    }
+
+    public void waitAppTerminate() {
+        while (true) {
+            try {
+                appProcess.waitFor();
+                break;
+            } catch (InterruptedException ex) {
+                // pass
+            }
+        }
+    }
+
+    /**
+     * The app touches the lock file when it's started
+     * wait while it happens. Caller have to delete lock on wait error.
+     *
+     * @param timeout
+     * @throws java.io.IOException
+     */
+    public void waitAppReady(long timeout) throws IOException {
+        long here = epoch();
+        while (true) {
+            long epoch = epoch();
+            if (epoch - here > (timeout * 1000)) {
+                throw new IOException("App waiting timeout");
+            }
+
+            // Live process should touch lock file every second
+            long lm = lastModified(lockFileName);
+            if (lm > lockCreationTime) {
+                break;
+            }
+
+            // Make sure process didn't already exit
+            if (!appProcess.isAlive()) {
+                throw new IOException("App exited unexpectedly with " + appProcess.exitValue());
+            }
+
+            try {
+                Thread.sleep(spinDelay);
+            } catch (InterruptedException ex) {
+                // pass
+            }
+        }
+    }
+
+    /**
+     * Run the app
+     *
+     * @param vmArguments
+     * @throws IOException
+     */
+    public void runApp(List<String> vmArguments)
+            throws IOException {
+
+        // We should always use testjava or throw an exception,
+        // so we can't use JDKToolFinder.getJDKTool("java");
+        // that falls back to compile java on error
+        String jdkPath = System.getProperty("test.jdk");
+        if (jdkPath == null) {
+            // we are not under jtreg, try env
+            Map<String, String> env = System.getenv();
+            jdkPath = env.get("TESTJAVA");
+        }
+
+        if (jdkPath == null) {
+            throw new RuntimeException("Can't determine jdk path neither test.jdk property no TESTJAVA env are set");
+        }
+
+        String osname = System.getProperty("os.name");
+        String javapath = jdkPath + ((osname.startsWith("window")) ? "/bin/java.exe" : "/bin/java");
+
+        List<String> cmd = new ArrayList<String>();
+        cmd.add(javapath);
+
+
+        if (vmArguments == null) {
+            // Propagate test.vm.options to LingeredApp, filter out possible empty options
+            String testVmOpts[] = System.getProperty("test.vm.opts","").split("\\s+");
+            for (String s : testVmOpts) {
+                if (!s.equals("")) {
+                    cmd.add(s);
+                }
+            }
+        }
+        else{
+            // Lets user manage LingerApp options
+            cmd.addAll(vmArguments);
+        }
+
+        // Make sure we set correct classpath to run the app
+        cmd.add("-cp");
+        String classpath = System.getProperty("test.class.path");
+        cmd.add((classpath == null) ? "." : classpath);
+
+        cmd.add(this.getAppName());
+        cmd.add(lockFileName);
+
+        // Reporting
+        StringBuilder cmdLine = new StringBuilder();
+        for (String strCmd : cmd) {
+            cmdLine.append("'").append(strCmd).append("' ");
+        }
+
+        // A bit of verbosity
+        System.out.println("Command line: [" + cmdLine.toString() + "]");
+
+        ProcessBuilder pb = new ProcessBuilder(cmd);
+        // we don't expect any error output but make sure we are not stuck on pipe
+        // pb.redirectErrorStream(false);
+        pb.redirectError(ProcessBuilder.Redirect.INHERIT);
+
+        appProcess = pb.start();
+
+        // Create pipe reader for process, and read stdin and stderr to array of strings
+        InputGobbler gb = new InputGobbler(appProcess.getInputStream(), storedAppOutput);
+        gb.start();
+    }
+
+    /**
+     *  High level interface for test writers
+     */
+    /**
+     * Factory method that creates SmartAppTest object with ready to use application
+     * lock name is autogenerated, wait timeout is hardcoded
+     * @param cmd - vm options, could be null to auto add testvm.options
+     * @return LingeredApp object
+     * @throws IOException
+     */
+    public static LingeredApp startApp(List<String> cmd) throws IOException {
+        final String lockName = UUID.randomUUID().toString() + ".lck";
+        final int waitTime = 10;
+
+        LingeredApp a = new LingeredApp(lockName);
+        a.createLock();
+        try {
+            a.runApp(cmd);
+            a.waitAppReady(waitTime);
+        } catch (Exception ex) {
+            a.deleteLock();
+            throw ex;
+        }
+
+        return a;
+    }
+
+    public static LingeredApp startApp() throws IOException {
+        return startApp(null);
+    }
+
+    /**
+     * Delete lock file that signal app to terminate, then
+     * waits until app is actually terminated.
+     * @throws IOException
+     */
+    public void stopApp() throws IOException {
+        deleteLock();
+        waitAppTerminate();
+        int exitcode = appProcess.exitValue();
+        if (exitcode != 0) {
+            throw new IOException("LingeredApp terminated with non-zero exit code " + exitcode);
+        }
+    }
+
+    /**
+     * LastModified time might not work correctly in some cases it might
+     * cause later failures
+     */
+
+    public static boolean isLastModifiedWorking() {
+        boolean sane = true;
+        try {
+            long lm = lastModified(".");
+            if (lm == 0) {
+                System.err.println("SANITY Warning! The lastModifiedTime() doesn't work on this system, it returns 0");
+                sane = false;
+            }
+
+            long now = epoch();
+            if (lm > now) {
+                System.err.println("SANITY Warning! The Clock is wrong on this system lastModifiedTime() > getTime()");
+                sane = false;
+            }
+
+            setLastModified(".", epoch());
+            long lm1 = lastModified(".");
+            if (lm1 <= lm) {
+                System.err.println("SANITY Warning! The setLastModified doesn't work on this system");
+                sane = false;
+            }
+        }
+        catch(IOException e) {
+            System.err.println("SANITY Warning! IOException during sanity check " + e);
+            sane = false;
+        }
+
+        return sane;
+    }
+
+    /**
+     * This part is the application it self
+     */
+    public static void main(String args[]) {
+
+        if (args.length != 1) {
+            System.err.println("Lock file name is not specified");
+            System.exit(7);
+        }
+
+        String theLockFileName = args[0];
+
+        try {
+            Path path = Paths.get(theLockFileName);
+
+            while (Files.exists(path)) {
+                // Touch the lock to indicate our readiness
+                setLastModified(theLockFileName, epoch());
+                Thread.sleep(spinDelay);
+            }
+        } catch (NoSuchFileException ex) {
+            // Lock deleted while we are setting last modified time.
+            // Ignore error and lets the app exits
+        } catch (Exception ex) {
+            System.err.println("LingeredApp ERROR: " + ex);
+            // Leave exit_code = 1 to Java launcher
+            System.exit(3);
+        }
+
+        System.exit(0);
+    }
+}