changeset 44900:58233549abef

Merge
author aph
date Fri, 28 Apr 2017 18:10:28 +0100
parents 0ad72b76a0da b80c30ca5fcd
children 4f410a4ea962
files jdk/test/java/net/MulticastSocket/JoinGroup.java jdk/test/java/net/MulticastSocket/Leave.java
diffstat 270 files changed, 6103 insertions(+), 1374 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Wed Apr 19 16:41:27 2017 +0100
+++ b/.hgtags	Fri Apr 28 18:10:28 2017 +0100
@@ -1,3 +1,4 @@
+d3e973f1809606c67412361041ad197e50fe8cec jdk-9+166
 3965b747cfe1e6cbd66b8739da5a1ea6ec6985e9 jdk-9+165
 d16aebbb56d37f12e0c0b0a4fb427db65e1fb1a8 jdk-9+162
 18c41483a082e097ac2f5f983c1226ed94aa4215 jdk-9+163
@@ -413,3 +414,4 @@
 4a79ad46e578112fce68f1af9dd931025cc235cb jdk-10+2
 d1cab6c7e608479be4ebfad48a25b0ed48600f62 jdk-10+3
 02253db2ace1422f576f58502fc7831ead77424b jdk-10+4
+f113ce12fe24fbd24acf02711372d9f1e1c12426 jdk-10+5
--- a/.hgtags-top-repo	Wed Apr 19 16:41:27 2017 +0100
+++ b/.hgtags-top-repo	Fri Apr 28 18:10:28 2017 +0100
@@ -409,3 +409,4 @@
 c38c6b270ccc8e2b86d1631bcf42248241b54d2c jdk-9+163
 7810f75d016a52e32295c4233009de5ca90e31af jdk-9+164
 aff4f339acd40942d3dab499846b52acd87b3af1 jdk-9+165
+ba5b16c9c6d80632b61959a33d424b1c3398ce62 jdk-9+166
--- a/common/conf/jib-profiles.js	Wed Apr 19 16:41:27 2017 +0100
+++ b/common/conf/jib-profiles.js	Fri Apr 28 18:10:28 2017 +0100
@@ -231,7 +231,8 @@
     // List of the main profile names used for iteration
     common.main_profile_names = [
         "linux-x64", "linux-x86", "macosx-x64", "solaris-x64",
-        "solaris-sparcv9", "windows-x64", "windows-x86"
+        "solaris-sparcv9", "windows-x64", "windows-x86",
+        "linux-arm64", "linux-arm-vfp-hflt", "linux-arm-vfp-hflt-dyn"
     ];
 
     // These are the base setttings for all the main build profiles.
@@ -391,7 +392,7 @@
     // on such hardware.
     if (input.build_cpu == "sparcv9") {
        var cpu_brand = $EXEC("bash -c \"kstat -m cpu_info | grep brand | head -n1 | awk '{ print \$2 }'\"");
-       if (cpu_brand.trim() == 'SPARC-M7') {
+       if (cpu_brand.trim().match('SPARC-.7')) {
            boot_jdk_revision = "8u20";
            boot_jdk_subdirpart = "1.8.0_20";
        }
@@ -471,8 +472,43 @@
             build_cpu: "x64",
             dependencies: ["devkit", "freetype"],
             configure_args: concat(common.configure_args_32bit),
+        },
+
+        "linux-arm64": {
+            target_os: "linux",
+            target_cpu: "aarch64",
+            build_cpu: "x64",
+            dependencies: ["devkit", "build_devkit", "cups", "headless_stubs"],
+            configure_args: [
+                "--with-cpu-port=arm64",
+                "--with-jvm-variants=server",
+                "--openjdk-target=aarch64-linux-gnu",
+                "--enable-headless-only"
+            ],
+        },
+
+        "linux-arm-vfp-hflt": {
+            target_os: "linux",
+            target_cpu: "arm",
+            build_cpu: "x64",
+            dependencies: ["devkit", "build_devkit", "cups"],
+            configure_args: [
+                "--with-jvm-variants=minimal1,client",
+                "--with-x=" + input.get("devkit", "install_path") + "/arm-linux-gnueabihf/libc/usr/X11R6-PI",
+                "--openjdk-target=arm-linux-gnueabihf",
+                "--with-abi-profile=arm-vfp-hflt"
+            ],
+        },
+
+        // Special version of the SE profile adjusted to be testable on arm64 hardware.
+        "linux-arm-vfp-hflt-dyn": {
+            configure_args: "--with-stdc++lib=dynamic"
         }
     };
+    // Let linux-arm-vfp-hflt-dyn inherit everything from linux-arm-vfp-hflt
+    profiles["linux-arm-vfp-hflt-dyn"] = concatObjects(
+        profiles["linux-arm-vfp-hflt-dyn"], profiles["linux-arm-vfp-hflt"]);
+
     // Add the base settings to all the main profiles
     common.main_profile_names.forEach(function (name) {
         profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
@@ -584,7 +620,7 @@
     var testOnlyProfilesPrebuilt = {
         "run-test-prebuilt": {
             src: "src.conf",
-            dependencies: [ "jtreg", "gnumake", testedProfile + ".jdk",
+            dependencies: [ "jtreg", "gnumake", "boot_jdk", testedProfile + ".jdk",
                 testedProfile + ".test", "src.full"
             ],
             work_dir: input.get("src.full", "install_path") + "/test",
@@ -658,16 +694,28 @@
         "windows-x86": {
             platform: "windows-x86",
             demo_ext: "zip"
+        },
+       "linux-arm64": {
+            platform: "linux-arm64-vfp-hflt",
+            demo_ext: "tar.gz"
+        },
+        "linux-arm-vfp-hflt": {
+            platform: "linux-arm32-vfp-hflt",
+            demo_ext: "tar.gz"
+        },
+        "linux-arm-vfp-hflt-dyn": {
+            platform: "linux-arm32-vfp-hflt-dyn",
+            demo_ext: "tar.gz"
         }
     }
     // Generate common artifacts for all main profiles
-    common.main_profile_names.forEach(function (name) {
+    Object.keys(artifactData).forEach(function (name) {
         profiles[name] = concatObjects(profiles[name],
             common.main_profile_artifacts(artifactData[name].platform, artifactData[name].demo_ext));
     });
 
     // Generate common artifacts for all debug profiles
-    common.main_profile_names.forEach(function (name) {
+    Object.keys(artifactData).forEach(function (name) {
         var debugName = name + common.debug_suffix;
         profiles[debugName] = concatObjects(profiles[debugName],
             common.debug_profile_artifacts(artifactData[name].platform));
@@ -839,7 +887,11 @@
         macosx_x64: "Xcode6.3-MacOSX10.9+1.0",
         solaris_x64: "SS12u4-Solaris11u1+1.0",
         solaris_sparcv9: "SS12u4-Solaris11u1+1.0",
-        windows_x64: "VS2013SP4+1.0"
+        windows_x64: "VS2013SP4+1.0",
+        linux_aarch64: "gcc-linaro-aarch64-linux-gnu-4.8-2013.11_linux+1.0",
+        linux_arm: (input.profile != null && input.profile.indexOf("hflt") >= 0
+                    ? "gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux+1.0"
+                    : "arm-linaro-4.7+1.0")
     };
 
     var devkit_platform = (input.target_cpu == "x86"
--- a/corba/.hgtags	Wed Apr 19 16:41:27 2017 +0100
+++ b/corba/.hgtags	Fri Apr 28 18:10:28 2017 +0100
@@ -409,3 +409,4 @@
 493011dee80e51c2a2b064d049183c047df36d80 jdk-9+163
 965bbae3072702f7c0d95c240523b65e6bb19261 jdk-9+164
 a510b2201154abdd12ede42788086b5283bfb9a6 jdk-9+165
+934c18145915b06d3fcc0de1a30f91f5aab8a192 jdk-9+166
--- a/hotspot/.hgtags	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/.hgtags	Fri Apr 28 18:10:28 2017 +0100
@@ -560,6 +560,7 @@
 a9fdfd55835ef9dccb7f317b07249bd66653b874 jdk-9+154
 f3b3d77a1751897413aae43ac340a130b6fa2ae1 jdk-9+155
 43139c588ea48b6504e52b6c3dec530b17b1fdb4 jdk-9+156
+1ea217626ba0995dd03127f8322ba3687926a085 jdk-10+1
 b2d0a906afd73dcf27f572217eb1be0f196ec16c jdk-9+157
 4e78f30935229f13ce7c43089621cf7169f5abac jdk-9+158
 9211c2e89c1cd11ec2d5752b0f97131a7d7525c7 jdk-9+159
@@ -569,3 +570,5 @@
 983fe207555724d98f4876991e1cbafbcf2733e8 jdk-9+163
 0af429be8bbaeaaf0cb838e9af28c953dda6a9c8 jdk-9+164
 c92c6416ca03b1464d5ed99cf6201e52b5ba0a70 jdk-9+165
+560d7aa083a24b6a56443feb8de0f40435d33aa9 jdk-9+166
+48809c513ed5ebb4d4dbf2f454afcce2780db6db jdk-10+2
--- a/hotspot/src/cpu/s390/vm/c1_Runtime1_s390.cpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/cpu/s390/vm/c1_Runtime1_s390.cpp	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2016 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/AltHashing.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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.jvm.hotspot.memory;
+
+public class AltHashing {
+    public static long murmur3_32(long seed, byte[] data) {
+      long h1 = seed;
+      int len = data.length;
+      int count = len;
+
+      int offset = 0;
+
+      // body
+      while (count >= 4) {
+          long k1 = (data[offset] & 0x0FF)
+              | (data[offset + 1] & 0x0FF) << 8
+              | (data[offset + 2] & 0x0FF) << 16
+              | data[offset + 3] << 24;
+
+          count -= 4;
+          offset += 4;
+
+          k1 *= 0xcc9e2d51;
+          k1 = Integer.rotateLeft((int)k1, 15);
+          k1 *= 0x1b873593;
+          k1 &= 0xFFFFFFFFL;
+
+          h1 ^= k1;
+          h1 = Integer.rotateLeft((int)h1, 13);
+          h1 = h1 * 5 + 0xe6546b64;
+          h1 &= 0xFFFFFFFFL;
+      }
+
+      //tail
+      if (count > 0) {
+          long k1 = 0;
+
+          switch (count) {
+              case 3:
+                  k1 ^= (data[offset + 2] & 0xff) << 16;
+                  // fall through
+              case 2:
+                  k1 ^= (data[offset + 1] & 0xff) << 8;
+                  // fall through
+              case 1:
+                  k1 ^= (data[offset] & 0xff);
+                  // fall through
+              default:
+                  k1 *= 0xcc9e2d51;
+                  k1 = Integer.rotateLeft((int)k1, 15);
+                  k1 *= 0x1b873593;
+                  k1 &= 0xFFFFFFFFL;
+                  h1 ^= k1;
+                  h1 &= 0xFFFFFFFFL;
+          }
+      }
+
+      // finalization
+      h1 ^= len;
+
+      // finalization mix force all bits of a hash block to avalanche
+      h1 ^= h1 >> 16;
+      h1 *= 0x85ebca6b;
+      h1 &= 0xFFFFFFFFL;
+      h1 ^= h1 >> 13;
+      h1 *= 0xc2b2ae35;
+      h1 &= 0xFFFFFFFFL;
+      h1 ^= h1 >> 16;
+
+      return h1 & 0xFFFFFFFFL;
+  }
+}
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/SymbolTable.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/memory/SymbolTable.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,11 +45,14 @@
     Type type = db.lookupType("SymbolTable");
     theTableField  = type.getAddressField("_the_table");
     sharedTableField = type.getAddressField("_shared_table");
+    type = db.lookupType("RehashableSymbolHashtable");
+    seedField = type.getCIntegerField("_seed");
   }
 
   // Fields
   private static AddressField theTableField;
   private static AddressField sharedTableField;
+  private static CIntegerField seedField;
 
   private CompactHashTable sharedTable;
 
@@ -62,6 +65,17 @@
     return table;
   }
 
+  public static long getSeed() {
+      return (long) seedField.getValue();
+  }
+
+  public static boolean useAlternateHashcode() {
+      if (getSeed() != 0) {
+          return true;
+      }
+      return false;
+  }
+
   public SymbolTable(Address addr) {
     super(addr);
   }
@@ -86,11 +100,17 @@
   public Symbol probe(byte[] name) {
     long hashValue = hashSymbol(name);
 
+    // shared table does not use alternate hashing algorithm,
+    // it always uses the same original hash code.
     Symbol s = sharedTable.probe(name, hashValue);
     if (s != null) {
       return s;
     }
 
+    if (useAlternateHashcode()) {
+        hashValue = AltHashing.murmur3_32(getSeed(), name);
+    }
+
     for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) {
       if (e.hash() == hashValue) {
          Symbol sym = Symbol.create(e.literalValue());
--- a/hotspot/src/share/vm/oops/metadata.hpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/oops/metadata.hpp	Fri Apr 28 18:10:28 2017 +0100
@@ -47,6 +47,7 @@
   virtual bool is_method()             const volatile { return false; }
   virtual bool is_methodData()         const volatile { return false; }
   virtual bool is_constantPool()       const volatile { return false; }
+  virtual bool is_methodCounters()     const volatile { return false; }
 
   virtual const char* internal_name()  const = 0;
 
--- a/hotspot/src/share/vm/oops/methodCounters.cpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/oops/methodCounters.cpp	Fri Apr 28 18:10:28 2017 +0100
@@ -73,3 +73,11 @@
 #endif
 }
 
+
+void MethodCounters::print_value_on(outputStream* st) const {
+  assert(is_methodCounters(), "must be methodCounters");
+  st->print("method counters");
+  print_address_on(st);
+}
+
+
--- a/hotspot/src/share/vm/oops/methodCounters.hpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/oops/methodCounters.hpp	Fri Apr 28 18:10:28 2017 +0100
@@ -30,7 +30,7 @@
 #include "interpreter/invocationCounter.hpp"
 #include "runtime/arguments.hpp"
 
-class MethodCounters: public MetaspaceObj {
+class MethodCounters : public Metadata {
  friend class VMStructs;
  friend class JVMCIVMStructs;
  private:
@@ -109,10 +109,11 @@
   }
 
  public:
+  virtual bool is_methodCounters() const volatile { return true; }
+
   static MethodCounters* allocate(methodHandle mh, TRAPS);
 
   void deallocate_contents(ClassLoaderData* loader_data) {}
-  DEBUG_ONLY(bool on_stack() { return false; })  // for template
 
   AOT_ONLY(Method* method() const { return _method; })
 
@@ -120,8 +121,6 @@
     return align_size_up(sizeof(MethodCounters), wordSize) / wordSize;
   }
 
-  bool is_klass() const { return false; }
-
   void clear_counters();
 
 #if defined(COMPILER2) || INCLUDE_JVMCI
@@ -253,5 +252,9 @@
   static ByteSize backedge_mask_offset() {
     return byte_offset_of(MethodCounters, _backedge_mask);
   }
+
+  virtual const char* internal_name() const { return "{method counters}"; }
+  virtual void print_value_on(outputStream* st) const;
+
 };
 #endif //SHARE_VM_OOPS_METHODCOUNTERS_HPP
--- a/hotspot/src/share/vm/opto/library_call.cpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/opto/library_call.cpp	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1668,6 +1668,9 @@
   }
 
   Node* adr = array_element_address(value, index, T_CHAR);
+  if (adr->is_top()) {
+    return false;
+  }
   if (is_store) {
     (void) store_to_memory(control(), adr, ch, T_CHAR, TypeAryPtr::BYTES, MemNode::unordered,
                            false, false, true /* mismatched */);
--- a/hotspot/src/share/vm/runtime/commandLineFlagConstraintsRuntime.cpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/runtime/commandLineFlagConstraintsRuntime.cpp	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/share/vm/runtime/commandLineFlagConstraintsRuntime.hpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/runtime/commandLineFlagConstraintsRuntime.hpp	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp	Fri Apr 28 18:10:28 2017 +0100
@@ -189,19 +189,6 @@
   assert(vf->is_compiled_frame(), "Wrong frame type");
   chunk->push(compiledVFrame::cast(vf));
 
-  ScopeDesc* trap_scope = chunk->at(0)->scope();
-  Handle exceptionObject;
-  if (trap_scope->rethrow_exception()) {
-    if (PrintDeoptimizationDetails) {
-      tty->print_cr("Exception to be rethrown in the interpreter for method %s::%s at bci %d", trap_scope->method()->method_holder()->name()->as_C_string(), trap_scope->method()->name()->as_C_string(), trap_scope->bci());
-    }
-    GrowableArray<ScopeValue*>* expressions = trap_scope->expressions();
-    guarantee(expressions != NULL && expressions->length() > 0, "must have exception to throw");
-    ScopeValue* topOfStack = expressions->top();
-    exceptionObject = StackValue::create_stack_value(&deoptee, &map, topOfStack)->get_obj();
-    assert(exceptionObject() != NULL, "exception oop can not be null");
-  }
-
   bool realloc_failures = false;
 
 #if defined(COMPILER2) || INCLUDE_JVMCI
@@ -296,6 +283,19 @@
 #endif // INCLUDE_JVMCI
 #endif // COMPILER2 || INCLUDE_JVMCI
 
+  ScopeDesc* trap_scope = chunk->at(0)->scope();
+  Handle exceptionObject;
+  if (trap_scope->rethrow_exception()) {
+    if (PrintDeoptimizationDetails) {
+      tty->print_cr("Exception to be rethrown in the interpreter for method %s::%s at bci %d", trap_scope->method()->method_holder()->name()->as_C_string(), trap_scope->method()->name()->as_C_string(), trap_scope->bci());
+    }
+    GrowableArray<ScopeValue*>* expressions = trap_scope->expressions();
+    guarantee(expressions != NULL && expressions->length() > 0, "must have exception to throw");
+    ScopeValue* topOfStack = expressions->top();
+    exceptionObject = StackValue::create_stack_value(&deoptee, &map, topOfStack)->get_obj();
+    guarantee(exceptionObject() != NULL, "exception oop can not be null");
+  }
+
   // Ensure that no safepoint is taken after pointers have been stored
   // in fields of rematerialized objects.  If a safepoint occurs from here on
   // out the java state residing in the vframeArray will be missed.
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp	Fri Apr 28 18:10:28 2017 +0100
@@ -199,6 +199,7 @@
 typedef HashtableEntry<Klass*, mtClass>       KlassHashtableEntry;
 typedef TwoOopHashtable<Symbol*, mtClass>     SymbolTwoOopHashtable;
 typedef CompactHashtable<Symbol*, char>       SymbolCompactHashTable;
+typedef RehashableHashtable<Symbol*, mtSymbol>   RehashableSymbolHashtable;
 
 //--------------------------------------------------------------------------------
 // VM_STRUCTS
@@ -584,6 +585,7 @@
                                                                                                                                      \
      static_field(SymbolTable,                 _the_table,                                    SymbolTable*)                          \
      static_field(SymbolTable,                 _shared_table,                                 SymbolCompactHashTable)                \
+     static_field(RehashableSymbolHashtable,   _seed,                                         juint)                                 \
                                                                                                                                      \
   /***************/                                                                                                                  \
   /* StringTable */                                                                                                                  \
@@ -1602,6 +1604,8 @@
                                                                           \
   declare_toplevel_type(BasicHashtable<mtInternal>)                       \
     declare_type(IntptrHashtable, BasicHashtable<mtInternal>)             \
+  declare_toplevel_type(BasicHashtable<mtSymbol>)                         \
+    declare_type(RehashableSymbolHashtable, BasicHashtable<mtSymbol>)     \
   declare_type(SymbolTable, SymbolHashtable)                              \
   declare_type(StringTable, StringHashtable)                              \
     declare_type(LoaderConstraintTable, KlassHashtable)                   \
--- a/hotspot/src/share/vm/utilities/hashtable.hpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/src/share/vm/utilities/hashtable.hpp	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -294,6 +294,7 @@
 };
 
 template <class T, MEMFLAGS F> class RehashableHashtable : public Hashtable<T, F> {
+ friend class VMStructs;
  protected:
 
   enum {
--- a/hotspot/test/compiler/ciReplay/SABase.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/compiler/ciReplay/SABase.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -141,7 +141,7 @@
         if (Platform.isSolaris()) {
             try {
                 OutputAnalyzer oa = ProcessTools.executeProcess("coreadm", "-p", "core",
-                        "" + ProcessHandle.current().getPid());
+                        "" + ProcessHandle.current().pid());
                 oa.shouldHaveExitValue(0);
             } catch (Throwable t) {
                 throw new Error("Can't launch coreadm: " + t, t);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/string/TestStringUTF16IntrinsicRangeChecks.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,320 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+/*
+ * @test
+ * @bug 8158168
+ * @summary Verifies that callers of StringUTF16 intrinsics throw array out of bounds exceptions.
+ * @library /compiler/patches /test/lib
+ * @build java.base/java.lang.Helper
+ * @run main/othervm -Xbatch -XX:CompileThreshold=100 -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_getCharStringU,_putCharStringU compiler.intrinsics.string.TestStringUTF16IntrinsicRangeChecks
+ * @run main/othervm -Xbatch -XX:CompileThreshold=100 -esa -ea -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_getCharStringU,_putCharStringU compiler.intrinsics.string.TestStringUTF16IntrinsicRangeChecks
+ */
+package compiler.intrinsics.string;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+
+public class TestStringUTF16IntrinsicRangeChecks {
+
+    public static void main(String[] args) throws Exception {
+        byte[] val = new byte[2];
+        byte[] b4  = new byte[4];
+        char[] c4  = new char[4];
+        String s4 = new String(c4);
+        byte[] valHigh = new byte[2];
+        byte[] valLow  = new byte[2];
+        Helper.putCharSB(valHigh, 0, Character.MIN_HIGH_SURROGATE);
+        Helper.putCharSB(valLow,  0, Character.MIN_LOW_SURROGATE);
+
+        for (int i = 0; i < 1000; ++i) {
+            getChars((int)1234, -5, -5 + 4, val);
+            getChars((int)1234, -1, -1 + 4, val);
+            getChars((int)1234,  0,  0 + 4, val);
+            getChars((int)1234,  1,  1 + 4, val);
+
+            getChars((long)1234, -5, -5 + 4, val);
+            getChars((long)1234, -1, -1 + 4, val);
+            getChars((long)1234,  0,  0 + 4, val);
+            getChars((long)1234,  1,  1 + 4, val);
+
+            byte[] val2 = Arrays.copyOf(val, val.length);
+            putCharSB(val2, -1, '!');
+            putCharSB(val2,  1, '!');
+
+            byte[] val4 = Arrays.copyOf(b4, b4.length);
+            char[] c2  = new char[2];
+            String s2 = new String(c2);
+
+            putCharsSB(val4, -3, c2, 0, 2);
+            putCharsSB(val4, -1, c2, 0, 2);
+            putCharsSB(val4,  0, c4, 0, 4);
+            putCharsSB(val4,  1, c2, 0, 2);
+            putCharsSB(val4, -3, s2, 0, 2);
+            putCharsSB(val4, -1, s2, 0, 2);
+            putCharsSB(val4,  0, s4, 0, 4);
+            putCharsSB(val4,  1, s2, 0, 2);
+
+            codePointAtSB(valHigh, -1, 1);
+            codePointAtSB(valHigh, -1, 2);
+            codePointAtSB(valHigh,  0, 2);
+            codePointAtSB(valHigh,  1, 2);
+
+            codePointBeforeSB(valLow,  0);
+            codePointBeforeSB(valLow, -1);
+            codePointBeforeSB(valLow,  2);
+
+            if (Helper.codePointCountSB(valHigh, 0, 1) != 1) {
+                throw new AssertionError("codePointCountSB");
+            }
+            if (Helper.codePointCountSB(valLow, 0, 1) != 1) {
+                throw new AssertionError("codePointCountSB");
+            }
+            codePointCountSB(valHigh, -1, 0);
+            codePointCountSB(valHigh, -1, 2);
+            codePointCountSB(valHigh,  0, 2);
+
+            charAt(val, -1);
+            charAt(val,  1);
+
+            contentEquals(b4, val, -1);
+            contentEquals(b4, val,  2);
+            contentEquals(val, s4,  2);
+            contentEquals(val, s4, -1);
+
+            StringBuilder sb = new StringBuilder();
+            sb.append((String)null).append(true).append(false);
+            if (!sb.toString().equals("nulltruefalse")) {
+                throw new AssertionError("append");
+            }
+
+            putCharsAt(val2, -1, '1', '2', '3', '4');
+            putCharsAt(val2,  0, '1', '2', '3', '4');
+            putCharsAt(val2,  2, '1', '2', '3', '4');
+            putCharsAt(val2, -1, '1', '2', '3', '4', '5');
+            putCharsAt(val2,  0, '1', '2', '3', '4', '5');
+            putCharsAt(val2,  2, '1', '2', '3', '4', '5');
+
+            reverse(valHigh, -1);
+            reverse(valHigh,  2);
+            reverse(valLow,  -1);
+            reverse(valLow,   2);
+
+            byte[] d4 = new byte[4];
+            inflate(b4, 0, d4, -1, 2);
+            inflate(b4, 0, d4,  3, 2);
+            inflate(b4, 0, d4,  4, 1);
+
+            byte[] b0 = new byte[0];
+            byte[] b1 = new byte[1];
+            byte[] b2 = new byte[2];
+            byte[] t1 = new byte[] {1};
+            byte[] t2 = new byte[] {1, 2};
+            byte[] t4 = new byte[] {1, 2, 3, 4};
+            indexOf(b1,  1, t2,  1, 0);
+            indexOf(b2,  1, t1,  1, 0);
+            indexOf(b2,  2, t2,  1, 0);
+            indexOf(b2,  1, t2,  2, 0);
+            indexOf(b2, -1, t2,  1, 0);
+            indexOf(b2,  1, t2, -1, 0);
+            indexOf(b2,  1, t2,  1, 1);
+
+            indexOfLatin1(b1,  1, t1,  1, 0);
+            indexOfLatin1(b2,  2, t1,  1, 0);
+            indexOfLatin1(b2,  1, b0,  1, 0);
+            indexOfLatin1(b2,  1, t1,  2, 0);
+            indexOfLatin1(b2, -1, t1,  1, 0);
+            indexOfLatin1(b2,  2, t1,  1, 0);
+            indexOfLatin1(b2,  1, t1, -1, 0);
+            indexOfLatin1(b2,  1, t1,  2, 0);
+
+            lastIndexOf(b1, t2, 1, 0);
+            lastIndexOf(b2, t4, 2, 0);
+            lastIndexOf(b2, t2, 1, 0);
+            lastIndexOf(b2, t2, 1, 1);
+
+            lastIndexOfLatin1(b1, t1, 1, 0);
+            lastIndexOfLatin1(b2, t2, 2, 0);
+            lastIndexOfLatin1(b2, t1, 1, 0);
+            lastIndexOfLatin1(b2, t1, 1, 1);
+        }
+    }
+
+    static void getChars(int i, int begin, int end, byte[] value) {
+        try {
+            Helper.getChars(i, begin, end, value);
+            throw new AssertionError("getChars");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void getChars(long l, int begin, int end, byte[] value) {
+        try {
+            Helper.getChars(l, begin, end, value);
+            throw new AssertionError("getChars");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void putCharSB(byte[] val, int index, int c) {
+        try {
+            Helper.putCharSB(val, index, c);
+            throw new AssertionError("putCharSB");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void putCharsSB(byte[] val, int index, char[] ca, int off, int end) {
+        try {
+            Helper.putCharsSB(val, index, ca, off, end);
+            throw new AssertionError("putCharsSB");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void putCharsSB(byte[] val, int index, CharSequence s, int off, int end) {
+        try {
+            Helper.putCharsSB(val, index, s, off, end);
+            throw new AssertionError("putCharsSB");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void codePointAtSB(byte[] val, int index, int end) {
+        try {
+            Helper.codePointAtSB(val, index, end);
+            throw new AssertionError("codePointAtSB");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void codePointBeforeSB(byte[] val, int index) {
+        try {
+            Helper.codePointBeforeSB(val, index);
+            throw new AssertionError("codePointBeforeSB");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void codePointCountSB(byte[] val, int beginIndex, int endIndex) {
+        try {
+            Helper.codePointCountSB(val, beginIndex, endIndex);
+            throw new AssertionError("codePointCountSB");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void charAt(byte[] v, int index) {
+        try {
+            Helper.charAt(v, index);
+            throw new AssertionError("charAt");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void contentEquals(byte[] v1, byte[] v2, int len) {
+        try {
+            Helper.contentEquals(v1, v2, len);
+            throw new AssertionError("contentEquals");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void contentEquals(byte[] v, CharSequence cs, int len) {
+        try {
+            Helper.contentEquals(v, cs, len);
+            throw new AssertionError("contentEquals");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void putCharsAt(byte[] v, int i, char c1, char c2, char c3, char c4) {
+        try {
+            Helper.putCharsAt(v, i, c1, c2, c3, c4);
+            throw new AssertionError("putCharsAt");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void putCharsAt(byte[] v, int i, char c1, char c2, char c3, char c4, char c5) {
+        try {
+            Helper.putCharsAt(v, i, c1, c2, c3, c4, c5);
+            throw new AssertionError("putCharsAt");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void reverse(byte[] v, int len) {
+        try {
+            Helper.reverse(v, len);
+            throw new AssertionError("reverse");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void inflate(byte[] v1, int o1, byte[] v2, int o2, int len) {
+        try {
+            Helper.inflate(v1, o1, v2, o2, len);
+            throw new AssertionError("inflate");
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void indexOf(byte[] v1, int l1, byte[] v2, int l2, int from) {
+        try {
+            if (Helper.indexOf(v1, l1, v2, l2, from) != -1) {
+                throw new AssertionError("indexOf");
+            }
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void lastIndexOf(byte[] v1, byte[] v2, int l2, int from) {
+        try {
+            if (Helper.lastIndexOf(v1, v2, l2, from) != -1) {
+                throw new AssertionError("lastIndexOf");
+            }
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void indexOfLatin1(byte[] v1, int l1, byte[] v2, int l2, int from) {
+        try {
+            if (Helper.indexOfLatin1(v1, l1, v2, l2, from) != -1) {
+                throw new AssertionError("indexOfLatin1");
+            }
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+
+    static void lastIndexOfLatin1(byte[] v1, byte[] v2, int l2, int from) {
+        try {
+            if (Helper.lastIndexOfLatin1(v1, v2, l2, from) != -1) {
+                throw new AssertionError("lastIndexOfLatin1");
+            }
+        } catch (IndexOutOfBoundsException io) {
+        }
+    }
+}
--- a/hotspot/test/compiler/patches/java.base/java/lang/Helper.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/compiler/patches/java.base/java/lang/Helper.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -73,4 +73,84 @@
         StringUTF16.getChars(value, srcBegin, srcEnd, dst, dstBegin);
         return dst;
     }
+
+    public static void putCharSB(byte[] val, int index, int c) {
+        StringUTF16.putCharSB(val, index, c);
+    }
+
+    public static void putCharsSB(byte[] val, int index, char[] ca, int off, int end) {
+        StringUTF16.putCharsSB(val, index, ca, off, end);
+    }
+
+    public static void putCharsSB(byte[] val, int index, CharSequence s, int off, int end) {
+        StringUTF16.putCharsSB(val, index, s, off, end);
+    }
+
+    public static int codePointAtSB(byte[] val, int index, int end) {
+        return StringUTF16.codePointAtSB(val, index, end);
+    }
+
+    public static int codePointBeforeSB(byte[] val, int index) {
+        return StringUTF16.codePointBeforeSB(val, index);
+    }
+
+    public static int codePointCountSB(byte[] val, int beginIndex, int endIndex) {
+        return StringUTF16.codePointCountSB(val, beginIndex, endIndex);
+    }
+
+    public static int getChars(int i, int begin, int end, byte[] value) {
+        return StringUTF16.getChars(i, begin, end, value);
+    }
+
+    public static int getChars(long l, int begin, int end, byte[] value) {
+        return StringUTF16.getChars(l, begin, end, value);
+    }
+
+    public static boolean contentEquals(byte[] v1, byte[] v2, int len) {
+        return StringUTF16.contentEquals(v1, v2, len);
+    }
+
+    public static boolean contentEquals(byte[] value, CharSequence cs, int len) {
+        return StringUTF16.contentEquals(value, cs, len);
+    }
+
+    public static int putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4) {
+        return StringUTF16.putCharsAt(value, i, c1, c2, c3, c4);
+    }
+
+    public static int putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4, char c5) {
+        return StringUTF16.putCharsAt(value, i, c1, c2, c3, c4, c5);
+    }
+
+    public static char charAt(byte[] value, int index) {
+        return StringUTF16.charAt(value, index);
+    }
+
+    public static void reverse(byte[] value, int count) {
+        StringUTF16.reverse(value, count);
+    }
+
+    public static void inflate(byte[] src, int srcOff, byte[] dst, int dstOff, int len) {
+        StringUTF16.inflate(src, srcOff, dst, dstOff, len);
+    }
+
+    public static int indexOf(byte[] src, int srcCount,
+                                    byte[] tgt, int tgtCount, int fromIndex) {
+        return StringUTF16.indexOf(src, srcCount, tgt, tgtCount, fromIndex);
+    }
+
+    public static int indexOfLatin1(byte[] src, int srcCount,
+                                    byte[] tgt, int tgtCount, int fromIndex) {
+        return StringUTF16.indexOfLatin1(src, srcCount, tgt, tgtCount, fromIndex);
+    }
+    public static int lastIndexOf(byte[] src, byte[] tgt, int tgtCount, int fromIndex) {
+        int srcCount = StringUTF16.length(src); // ignored
+        return StringUTF16.lastIndexOf(src, srcCount, tgt, tgtCount, fromIndex);
+    }
+
+    public static int lastIndexOfLatin1(byte[] src, byte[] tgt, int tgtCount, int fromIndex) {
+        int srcCount = StringUTF16.length(src); // ignored
+        return StringUTF16.lastIndexOfLatin1(src, srcCount, tgt, tgtCount, fromIndex);
+    }
+
 }
--- a/hotspot/test/runtime/libadimalloc.solaris.sparc/Testlibadimalloc.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/runtime/libadimalloc.solaris.sparc/Testlibadimalloc.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -67,7 +67,7 @@
 
         // Start the process, get the pid and then wait for the test to finish
         Process process = builder.start();
-        long pid = process.getPid();
+        long pid = process.pid();
         int retval = process.waitFor();
 
         // make sure the SEGVOverflow test crashed
--- a/hotspot/test/serviceability/attach/AttachSetGetFlag.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/attach/AttachSetGetFlag.java	Fri Apr 28 18:10:28 2017 +0100
@@ -80,7 +80,7 @@
     try {
       waitForReady(target);
 
-      int pid = (int)target.getPid();
+      int pid = (int)target.pid();
 
       HotSpotVirtualMachine vm = (HotSpotVirtualMachine)VirtualMachine.attach(((Integer)pid).toString());
 
@@ -116,7 +116,7 @@
     try {
       waitForReady(target);
 
-      int pid = (int)target.getPid();
+      int pid = (int)target.pid();
 
       HotSpotVirtualMachine vm = (HotSpotVirtualMachine)VirtualMachine.attach(((Integer)pid).toString());
 
--- a/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -60,7 +60,7 @@
             return;
         }
 
-        long ourPid = ProcessHandle.current().getPid();
+        long ourPid = ProcessHandle.current().pid();
 
         // The string we are expecting in the debugd ouput
         String golden = String.format(GOLDEN, ourPid);
--- a/hotspot/test/serviceability/tmtools/jstack/DaemonThreadTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstack/DaemonThreadTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -78,7 +78,7 @@
         thread.start();
 
         // Run jstack tool and collect the output
-        JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid());
+        JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid());
         ToolResults results = jstackTool.measure();
 
         // Analyze the jstack output for the correct thread type
--- a/hotspot/test/serviceability/tmtools/jstack/SpreadLockTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstack/SpreadLockTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -96,7 +96,7 @@
         debuggee.start();
 
         // Collect output from the jstack tool
-        JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid());
+        JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid());
         ToolResults results1 = jstackTool.measure();
 
         // Go to method b()
--- a/hotspot/test/serviceability/tmtools/jstack/ThreadNamesTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstack/ThreadNamesTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,7 +61,7 @@
         thread.start();
 
         // Run jstack tool and collect the output
-        JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid());
+        JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid());
         ToolResults results = jstackTool.measure();
 
         // Analyze the jstack output for the strange thread name
--- a/hotspot/test/serviceability/tmtools/jstack/TraveledLockTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstack/TraveledLockTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -95,7 +95,7 @@
         debuggee.start();
 
         // Collect output from the jstack tool
-        JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid());
+        JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid());
         ToolResults results1 = jstackTool.measure();
 
         // Go to method b()
--- a/hotspot/test/serviceability/tmtools/jstack/WaitNotifyThreadTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstack/WaitNotifyThreadTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -105,7 +105,7 @@
         waitThread.start();
 
         // Collect output from the jstack tool
-        JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid());
+        JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid());
         ToolResults results = jstackTool.measure();
 
         // Analyze the jstack output for the patterns needed
--- a/hotspot/test/serviceability/tmtools/jstat/GcCapacityTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstat/GcCapacityTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,7 @@
     public static void main(String[] args) throws Exception {
 
         // We will be running "jstat -gc" tool
-        JstatGcCapacityTool jstatGcTool = new JstatGcCapacityTool(ProcessHandle.current().getPid());
+        JstatGcCapacityTool jstatGcTool = new JstatGcCapacityTool(ProcessHandle.current().pid());
 
         // Run once and get the  results asserting that they are reasonable
         JstatGcCapacityResults measurement1 = jstatGcTool.measure();
--- a/hotspot/test/serviceability/tmtools/jstat/GcCauseTest01.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstat/GcCauseTest01.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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 @@
     public static void main(String[] args) throws Exception {
 
         // We will be running "jstat -gc" tool
-        JstatGcCauseTool jstatGcTool = new JstatGcCauseTool(ProcessHandle.current().getPid());
+        JstatGcCauseTool jstatGcTool = new JstatGcCauseTool(ProcessHandle.current().pid());
 
         // Run once and get the  results asserting that they are reasonable
         JstatGcCauseResults measurement1 = jstatGcTool.measure();
--- a/hotspot/test/serviceability/tmtools/jstat/GcCauseTest02.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstat/GcCauseTest02.java	Fri Apr 28 18:10:28 2017 +0100
@@ -38,6 +38,6 @@
 public class GcCauseTest02 {
 
     public static void main(String[] args) throws Exception {
-        new GarbageProducerTest(new JstatGcCauseTool(ProcessHandle.current().getPid())).run();
+        new GarbageProducerTest(new JstatGcCauseTool(ProcessHandle.current().pid())).run();
     }
 }
--- a/hotspot/test/serviceability/tmtools/jstat/GcCauseTest03.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstat/GcCauseTest03.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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 @@
     public static void main(String[] args) throws Exception {
 
         // We will be running "jstat -gc" tool
-        JstatGcCauseTool jstatGcTool = new JstatGcCauseTool(ProcessHandle.current().getPid());
+        JstatGcCauseTool jstatGcTool = new JstatGcCauseTool(ProcessHandle.current().pid());
 
         System.gc();
 
--- a/hotspot/test/serviceability/tmtools/jstat/GcNewTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstat/GcNewTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -40,7 +40,7 @@
     public static void main(String[] args) throws Exception {
 
         // We will be running "jstat -gc" tool
-        JstatGcNewTool jstatGcTool = new JstatGcNewTool(ProcessHandle.current().getPid());
+        JstatGcNewTool jstatGcTool = new JstatGcNewTool(ProcessHandle.current().pid());
 
         // Run once and get the  results asserting that they are reasonable
         JstatGcNewResults measurement1 = jstatGcTool.measure();
--- a/hotspot/test/serviceability/tmtools/jstat/GcTest01.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstat/GcTest01.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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 @@
     public static void main(String[] args) throws Exception {
 
         // We will be running "jstat -gc" tool
-        JstatGcTool jstatGcTool = new JstatGcTool(ProcessHandle.current().getPid());
+        JstatGcTool jstatGcTool = new JstatGcTool(ProcessHandle.current().pid());
 
         // Run once and get the  results asserting that they are reasonable
         JstatGcResults measurement1 = jstatGcTool.measure();
--- a/hotspot/test/serviceability/tmtools/jstat/GcTest02.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/hotspot/test/serviceability/tmtools/jstat/GcTest02.java	Fri Apr 28 18:10:28 2017 +0100
@@ -38,6 +38,6 @@
 public class GcTest02 {
 
     public static void main(String[] args) throws Exception {
-        new GarbageProducerTest(new JstatGcTool(ProcessHandle.current().getPid())).run();
+        new GarbageProducerTest(new JstatGcTool(ProcessHandle.current().pid())).run();
     }
 }
--- a/jaxp/.hgtags	Wed Apr 19 16:41:27 2017 +0100
+++ b/jaxp/.hgtags	Fri Apr 28 18:10:28 2017 +0100
@@ -409,3 +409,4 @@
 92a38c75cd277d8b11f4382511a62087044659a1 jdk-9+163
 6dc790a4e8310c86712cfdf7561a9820818546e6 jdk-9+164
 55419603989707ec50c84bb379bbdc1adeec3ab2 jdk-9+165
+8d3febd5c9d82e49f3e6e5f8eb10f959e7b50f83 jdk-9+166
--- a/jaxp/test/javax/xml/jaxp/libs/jdk/testlibrary/ProcessTools.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jaxp/test/javax/xml/jaxp/libs/jdk/testlibrary/ProcessTools.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -256,7 +256,7 @@
      * @return Process id
      */
     public static long getProcessId() {
-        return ProcessHandle.current().getPid();
+        return ProcessHandle.current().pid();
     }
 
     /**
@@ -523,8 +523,8 @@
         }
 
         @Override
-        public long getPid() {
-            return p.getPid();
+        public long pid() {
+            return p.pid();
         }
 
         @Override
--- a/jaxws/.hgtags	Wed Apr 19 16:41:27 2017 +0100
+++ b/jaxws/.hgtags	Fri Apr 28 18:10:28 2017 +0100
@@ -412,3 +412,4 @@
 3890f96e8995be8c84f330d1f65269b03ac36b24 jdk-9+163
 1a52de2da827459e866fd736f9e9c62eb2ecd6bb jdk-9+164
 a987401bac0d528475e57732c9d5d93f4405804c jdk-9+165
+b1f30c27367bd286fa4eb8a767335e917a5b5b82 jdk-9+166
--- a/jdk/.hgtags	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/.hgtags	Fri Apr 28 18:10:28 2017 +0100
@@ -409,3 +409,4 @@
 50171f8c47961710cbf87aead6f03fa431d8d240 jdk-9+163
 6dea581453d7c0e767e3169cfec8b423a381e71d jdk-9+164
 a7942c3b1e59495dbf51dc7c41aab355fcd253d7 jdk-9+165
+5d2b48f1f0a322aca719b49ff02ab421705bffc7 jdk-9+166
--- a/jdk/make/data/charsetmapping/stdcs-linux	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/make/data/charsetmapping/stdcs-linux	Fri Apr 28 18:10:28 2017 +0100
@@ -24,3 +24,5 @@
 JIS_X_0212
 JIS_X_0208_Solaris
 JIS_X_0212_Solaris
+MS932
+SJIS       # SJIS must go together with MS932 to support sun.nio.cs.map
--- a/jdk/src/java.base/linux/native/libnio/ch/EPoll.c	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/linux/native/libnio/ch/EPoll.c	Fri Apr 28 18:10:28 2017 +0100
@@ -95,9 +95,3 @@
     }
     return res;
 }
-
-JNIEXPORT void JNICALL
-Java_sun_nio_ch_EPoll_close0(JNIEnv *env, jclass c, jint epfd) {
-    int res;
-    RESTARTABLE(close(epfd), res);
-}
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/CounterMode.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/CounterMode.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,10 +42,10 @@
  * @author Andreas Sterbenz
  * @since 1.4.2
  */
-final class CounterMode extends FeedbackCipher {
+class CounterMode extends FeedbackCipher {
 
     // current counter value
-    private final byte[] counter;
+    final byte[] counter;
 
     // encrypted bytes of the previous counter value
     private final byte[] encryptedCounter;
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017 Oracle and/or its affiliates. All rights reserved.
  * 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,52 +29,43 @@
 
 package com.sun.crypto.provider;
 
-import java.security.*;
-import javax.crypto.*;
+import javax.crypto.IllegalBlockSizeException;
 import static com.sun.crypto.provider.AESConstants.AES_BLOCK_SIZE;
 
 /**
  * This class represents the GCTR function defined in NIST 800-38D
- * under section 6.5. It needs to be constructed w/ an initialized
- * cipher object, and initial counter block(ICB). Given an input X
- * of arbitrary length, it processes and returns an output which has
- * the same length as X. The invariants of this class are:
- *
- * (1) The length of intialCounterBlk (and also of its clones, e.g.,
- * fields counter and counterSave) is equal to AES_BLOCK_SIZE.
- *
- * (2) After construction, the field counter never becomes null, it
- * always contains a byte array of length AES_BLOCK_SIZE.
+ * under section 6.5.  With a given cipher object and initial counter
+ * block, a counter mode operation is performed.  Blocksize is limited
+ * to 16 bytes.
  *
  * If any invariant is broken, failures can occur because the
  * AESCrypt.encryptBlock method can be intrinsified on the HotSpot VM
  * (see JDK-8067648 for details).
  *
+ * The counter mode operations can be intrinsified and parallelized
+ * by using CounterMode.implCrypt() if HotSpot VM supports it on the
+ * architecture.
+ *
  * <p>This function is used in the implementation of GCM mode.
  *
  * @since 1.8
  */
-final class GCTR {
+final class GCTR extends CounterMode {
 
-    // these fields should not change after the object has been constructed
-    private final SymmetricCipher aes;
-    private final byte[] icb;
-
-    // the current counter value
-    private byte[] counter;
-
-    // needed for save/restore calls
-    private byte[] counterSave = null;
-
-    // NOTE: cipher should already be initialized
     GCTR(SymmetricCipher cipher, byte[] initialCounterBlk) {
-        this.aes = cipher;
+        super(cipher);
         if (initialCounterBlk.length != AES_BLOCK_SIZE) {
             throw new RuntimeException("length of initial counter block (" + initialCounterBlk.length +
                                        ") not equal to AES_BLOCK_SIZE (" + AES_BLOCK_SIZE + ")");
         }
-        this.icb = initialCounterBlk;
-        this.counter = icb.clone();
+
+        iv = initialCounterBlk;
+        reset();
+    }
+
+    @Override
+    String getFeedback() {
+        return "GCTR";
     }
 
     // input must be multiples of 128-bit blocks when calling update
@@ -89,23 +80,11 @@
             throw new RuntimeException("output buffer too small");
         }
 
-        byte[] encryptedCntr = new byte[AES_BLOCK_SIZE];
-
-        int numOfCompleteBlocks = inLen / AES_BLOCK_SIZE;
-        for (int i = 0; i < numOfCompleteBlocks; i++) {
-            aes.encryptBlock(counter, 0, encryptedCntr, 0);
-            for (int n = 0; n < AES_BLOCK_SIZE; n++) {
-                int index = (i * AES_BLOCK_SIZE + n);
-                out[outOfs + index] =
-                    (byte) ((in[inOfs + index] ^ encryptedCntr[n]));
-            }
-            GaloisCounterMode.increment32(counter);
-        }
-        return inLen;
+        return encrypt(in, inOfs, inLen, out, outOfs);
     }
 
     // input can be arbitrary size when calling doFinal
-    protected int doFinal(byte[] in, int inOfs, int inLen, byte[] out,
+    int doFinal(byte[] in, int inOfs, int inLen, byte[] out,
                           int outOfs) throws IllegalBlockSizeException {
         try {
             if (inLen < 0) {
@@ -118,7 +97,7 @@
                 if (lastBlockSize != 0) {
                     // do the last partial block
                     byte[] encryptedCntr = new byte[AES_BLOCK_SIZE];
-                    aes.encryptBlock(counter, 0, encryptedCntr, 0);
+                    embeddedCipher.encryptBlock(counter, 0, encryptedCntr, 0);
                     for (int n = 0; n < lastBlockSize; n++) {
                         out[outOfs + completeBlkLen + n] =
                             (byte) ((in[inOfs + completeBlkLen + n] ^
@@ -131,28 +110,4 @@
         }
         return inLen;
     }
-
-    /**
-     * Resets the content of this object to when it's first constructed.
-     */
-    void reset() {
-        System.arraycopy(icb, 0, counter, 0, icb.length);
-        counterSave = null;
-    }
-
-    /**
-     * Save the current content of this object.
-     */
-    void save() {
-        this.counterSave = this.counter.clone();
-    }
-
-    /**
-     * Restores the content of this object to the previous saved one.
-     */
-    void restore() {
-        if (this.counterSave != null) {
-            this.counter = this.counterSave;
-        }
-    }
 }
--- a/jdk/src/java.base/share/classes/java/io/FilePermission.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -209,6 +209,10 @@
     private static final Path here = builtInFS.getPath(
             GetPropertyAction.privilegedGetProperty("user.dir"));
 
+    private static final Path EMPTY_PATH = builtInFS.getPath("");
+    private static final Path DASH_PATH = builtInFS.getPath("-");
+    private static final Path DOTDOT_PATH = builtInFS.getPath("..");
+
     /**
      * A private constructor that clones some and updates some,
      * always with a different name.
@@ -341,7 +345,7 @@
                         .normalize();
                 // lastName should always be non-null now
                 Path lastName = npath.getFileName();
-                if (lastName != null && lastName.toString().equals("-")) {
+                if (lastName != null && lastName.equals(DASH_PATH)) {
                     directory = true;
                     recursive = !rememberStar;
                     npath = npath.getParent();
@@ -679,23 +683,76 @@
      * @return the depth in between
      */
     private static int containsPath(Path p1, Path p2) {
-        Path p;
-        try {
-            p = p2.relativize(p1).normalize();
-            if (p.getName(0).toString().isEmpty()) {
-                return 0;
-            } else {
-                for (Path item: p) {
-                    String s = item.toString();
-                    if (!s.equals("..")) {
-                        return -1;
-                    }
-                }
-                return p.getNameCount();
-            }
-        } catch (IllegalArgumentException iae) {
+
+        // Two paths must have the same root. For example,
+        // there is no contains relation between any two of
+        // "/x", "x", "C:/x", "C:x", and "//host/share/x".
+        if (!Objects.equals(p1.getRoot(), p2.getRoot())) {
             return -1;
         }
+
+        // Empty path (i.e. "." or "") is a strange beast,
+        // because its getNameCount()==1 but getName(0) is null.
+        // It's better to deal with it separately.
+        if (p1.equals(EMPTY_PATH)) {
+            if (p2.equals(EMPTY_PATH)) {
+                return 0;
+            } else if (p2.getName(0).equals(DOTDOT_PATH)) {
+                // "." contains p2 iif p2 has no "..". Since a
+                // a normalized path can only have 0 or more
+                // ".." at the beginning. We only need to look
+                // at the head.
+                return -1;
+            } else {
+                // and the distance is p2's name count. i.e.
+                // 3 between "." and "a/b/c".
+                return p2.getNameCount();
+            }
+        } else if (p2.equals(EMPTY_PATH)) {
+            int c1 = p1.getNameCount();
+            if (!p1.getName(c1 - 1).equals(DOTDOT_PATH)) {
+                // "." is inside p1 iif p1 is 1 or more "..".
+                // For the same reason above, we only need to
+                // look at the tail.
+                return -1;
+            }
+            // and the distance is the count of ".."
+            return c1;
+        }
+
+        // Good. No more empty paths.
+
+        // Common heads are removed
+
+        int c1 = p1.getNameCount();
+        int c2 = p2.getNameCount();
+
+        int n = Math.min(c1, c2);
+        int i = 0;
+        while (i < n) {
+            if (!p1.getName(i).equals(p2.getName(i)))
+                break;
+            i++;
+        }
+
+        // for p1 containing p2, p1 must be 0-or-more "..",
+        // and p2 cannot have "..". For the same reason, we only
+        // check tail of p1 and head of p2.
+        if (i < c1 && !p1.getName(c1 - 1).equals(DOTDOT_PATH)) {
+            return -1;
+        }
+
+        if (i < c2 && p2.getName(i).equals(DOTDOT_PATH)) {
+            return -1;
+        }
+
+        // and the distance is the name counts added (after removing
+        // the common heads).
+
+        // For example: p1 = "../../..", p2 = "../a".
+        // After removing the common heads, they become "../.." and "a",
+        // and the distance is (3-1)+(2-1) = 3.
+        return c1 - i + c2 - i;
     }
 
     /**
--- a/jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -307,6 +307,8 @@
      *             sequence.
      */
     public int codePointAt(int index) {
+        int count = this.count;
+        byte[] value = this.value;
         checkIndex(index, count);
         if (isLatin1()) {
             return value[index] & 0xff;
@@ -560,11 +562,7 @@
             val[count++] = 'l';
             val[count++] = 'l';
         } else {
-            checkOffset(count + 4, val.length >> 1);
-            StringUTF16.putChar(val, count++, 'n');
-            StringUTF16.putChar(val, count++, 'u');
-            StringUTF16.putChar(val, count++, 'l');
-            StringUTF16.putChar(val, count++, 'l');
+            count = StringUTF16.putCharsAt(val, count, 'n', 'u', 'l', 'l');
         }
         this.count = count;
         return this;
@@ -695,18 +693,9 @@
             }
         } else {
             if (b) {
-                checkOffset(count + 4, val.length >> 1);
-                StringUTF16.putChar(val, count++, 't');
-                StringUTF16.putChar(val, count++, 'r');
-                StringUTF16.putChar(val, count++, 'u');
-                StringUTF16.putChar(val, count++, 'e');
+                count = StringUTF16.putCharsAt(val, count, 't', 'r', 'u', 'e');
             } else {
-                checkOffset(count + 5, val.length >> 1);
-                StringUTF16.putChar(val, count++, 'f');
-                StringUTF16.putChar(val, count++, 'a');
-                StringUTF16.putChar(val, count++, 'l');
-                StringUTF16.putChar(val, count++, 's');
-                StringUTF16.putChar(val, count++, 'e');
+                count = StringUTF16.putCharsAt(val, count, 'f', 'a', 'l', 's', 'e');
             }
         }
         this.count = count;
@@ -755,16 +744,15 @@
      * @return  a reference to this object.
      */
     public AbstractStringBuilder append(int i) {
+        int count = this.count;
         int spaceNeeded = count + Integer.stringSize(i);
         ensureCapacityInternal(spaceNeeded);
         if (isLatin1()) {
             Integer.getChars(i, spaceNeeded, value);
         } else {
-            byte[] val = this.value;
-            checkOffset(spaceNeeded, val.length >> 1);
-            Integer.getCharsUTF16(i, spaceNeeded, val);
+            StringUTF16.getChars(i, count, spaceNeeded, value);
         }
-        count = spaceNeeded;
+        this.count = spaceNeeded;
         return this;
     }
 
@@ -781,16 +769,15 @@
      * @return  a reference to this object.
      */
     public AbstractStringBuilder append(long l) {
+        int count = this.count;
         int spaceNeeded = count + Long.stringSize(l);
         ensureCapacityInternal(spaceNeeded);
         if (isLatin1()) {
             Long.getChars(l, spaceNeeded, value);
         } else {
-            byte[] val = this.value;
-            checkOffset(spaceNeeded, val.length >> 1);
-            Long.getCharsUTF16(l, spaceNeeded, val);
+            StringUTF16.getChars(l, count, spaceNeeded, value);
         }
-        count = spaceNeeded;
+        this.count = spaceNeeded;
         return this;
     }
 
@@ -843,6 +830,7 @@
      *             greater than {@code end}.
      */
     public AbstractStringBuilder delete(int start, int end) {
+        int count = this.count;
         if (end > count) {
             end = count;
         }
@@ -850,7 +838,7 @@
         int len = end - start;
         if (len > 0) {
             shift(end, -len);
-            count -= len;
+            this.count = count - len;
         }
         return this;
     }
@@ -925,6 +913,7 @@
      *             greater than {@code end}.
      */
     public AbstractStringBuilder replace(int start, int end, String str) {
+        int count = this.count;
         if (end > count) {
             end = count;
         }
@@ -933,7 +922,7 @@
         int newCount = count + len - (end - start);
         ensureCapacityInternal(newCount);
         shift(end, newCount - count);
-        count = newCount;
+        this.count = newCount;
         putStringAt(start, str);
         return this;
     }
@@ -1500,40 +1489,11 @@
                 val[k] = cj;
             }
         } else {
-            checkOffset(count, val.length >> 1);
-            boolean hasSurrogates = false;
-            for (int j = (n-1) >> 1; j >= 0; j--) {
-                int k = n - j;
-                char cj = StringUTF16.getChar(val, j);
-                char ck = StringUTF16.getChar(val, k);
-                StringUTF16.putChar(val, j, ck);
-                StringUTF16.putChar(val, k, cj);
-                if (Character.isSurrogate(cj) ||
-                    Character.isSurrogate(ck)) {
-                    hasSurrogates = true;
-                }
-            }
-            if (hasSurrogates) {
-                reverseAllValidSurrogatePairs(val, count);
-            }
+            StringUTF16.reverse(val, count);
         }
         return this;
     }
 
-    /** Outlined helper method for reverse() */
-    private void reverseAllValidSurrogatePairs(byte[] val, int count) {
-        for (int i = 0; i < count - 1; i++) {
-            char c2 = StringUTF16.getChar(val, i);
-            if (Character.isLowSurrogate(c2)) {
-                char c1 = StringUTF16.getChar(val, i + 1);
-                if (Character.isHighSurrogate(c1)) {
-                    StringUTF16.putChar(val, i++, c1);
-                    StringUTF16.putChar(val, i, c2);
-                }
-            }
-        }
-    }
-
     /**
      * Returns a string representing the data in this sequence.
      * A new {@code String} object is allocated and initialized to
@@ -1682,6 +1642,7 @@
     }
 
     private final void appendChars(char[] s, int off, int end) {
+        int count = this.count;
         if (isLatin1()) {
             byte[] val = this.value;
             for (int i = off, j = count; i < end; i++) {
@@ -1689,17 +1650,17 @@
                 if (StringLatin1.canEncode(c)) {
                     val[j++] = (byte)c;
                 } else {
-                    count = j;
+                    this.count = count = j;
                     inflate();
                     StringUTF16.putCharsSB(this.value, j, s, i, end);
-                    count += end - i;
+                    this.count = count + end - i;
                     return;
                 }
             }
         } else {
             StringUTF16.putCharsSB(this.value, count, s, off, end);
         }
-        count += end - off;
+        this.count = count + end - off;
     }
 
     private final void appendChars(CharSequence s, int off, int end) {
--- a/jdk/src/java.base/share/classes/java/lang/Integer.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/Integer.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -386,7 +386,7 @@
     }
 
     /** byte[]/UTF16 version    */
-    static void formatUnsignedIntUTF16(int val, int shift, byte[] buf, int offset, int len) {
+    private static void formatUnsignedIntUTF16(int val, int shift, byte[] buf, int offset, int len) {
         int charPos = offset + len;
         int radix = 1 << shift;
         int mask = radix - 1;
@@ -442,7 +442,7 @@
             return new String(buf, LATIN1);
         } else {
             byte[] buf = new byte[size * 2];
-            getCharsUTF16(i, size, buf);
+            StringUTF16.getChars(i, size, buf);
             return new String(buf, UTF16);
         }
     }
@@ -516,49 +516,6 @@
         return charPos;
     }
 
-    /**
-     * This is a variant of {@link #getChars(int, int, byte[])}, but for
-     * UTF-16 coder.
-     *
-     * @param i     value to convert
-     * @param index next index, after the least significant digit
-     * @param buf   target buffer, UTF16-coded.
-     * @return index of the most significant digit or minus sign, if present
-     */
-    static int getCharsUTF16(int i, int index, byte[] buf) {
-        int q, r;
-        int charPos = index;
-
-        boolean negative = (i < 0);
-        if (!negative) {
-            i = -i;
-        }
-
-        // Get 2 digits/iteration using ints
-        while (i <= -100) {
-            q = i / 100;
-            r = (q * 100) - i;
-            i = q;
-            StringUTF16.putChar(buf, --charPos, DigitOnes[r]);
-            StringUTF16.putChar(buf, --charPos, DigitTens[r]);
-        }
-
-        // We know there are at most two digits left at this point.
-        q = i / 10;
-        r = (q * 10) - i;
-        StringUTF16.putChar(buf, --charPos, '0' + r);
-
-        // Whatever left is the remaining digit.
-        if (q < 0) {
-            StringUTF16.putChar(buf, --charPos, '0' - q);
-        }
-
-        if (negative) {
-            StringUTF16.putChar(buf, --charPos, '-');
-        }
-        return charPos;
-    }
-
     // Left here for compatibility reasons, see JDK-8143900.
     static final int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
                                       99999999, 999999999, Integer.MAX_VALUE };
--- a/jdk/src/java.base/share/classes/java/lang/Long.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/Long.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -414,7 +414,7 @@
     }
 
     /** byte[]/UTF16 version    */
-    static void formatUnsignedLong0UTF16(long val, int shift, byte[] buf, int offset, int len) {
+    private static void formatUnsignedLong0UTF16(long val, int shift, byte[] buf, int offset, int len) {
         int charPos = offset + len;
         int radix = 1 << shift;
         int mask = radix - 1;
@@ -475,7 +475,7 @@
             return new String(buf, LATIN1);
         } else {
             byte[] buf = new byte[size * 2];
-            getCharsUTF16(i, size, buf);
+            StringUTF16.getChars(i, size, buf);
             return new String(buf, UTF16);
         }
     }
@@ -562,61 +562,6 @@
     }
 
     /**
-     * This is a variant of {@link #getChars(long, int, byte[])}, but for
-     * UTF-16 coder.
-     *
-     * @param i     value to convert
-     * @param index next index, after the least significant digit
-     * @param buf   target buffer, UTF16-coded.
-     * @return index of the most significant digit or minus sign, if present
-     */
-    static int getCharsUTF16(long i, int index, byte[] buf) {
-        long q;
-        int r;
-        int charPos = index;
-
-        boolean negative = (i < 0);
-        if (!negative) {
-            i = -i;
-        }
-
-        // Get 2 digits/iteration using longs until quotient fits into an int
-        while (i <= Integer.MIN_VALUE) {
-            q = i / 100;
-            r = (int)((q * 100) - i);
-            i = q;
-            StringUTF16.putChar(buf, --charPos, Integer.DigitOnes[r]);
-            StringUTF16.putChar(buf, --charPos, Integer.DigitTens[r]);
-        }
-
-        // Get 2 digits/iteration using ints
-        int q2;
-        int i2 = (int)i;
-        while (i2 <= -100) {
-            q2 = i2 / 100;
-            r  = (q2 * 100) - i2;
-            i2 = q2;
-            StringUTF16.putChar(buf, --charPos, Integer.DigitOnes[r]);
-            StringUTF16.putChar(buf, --charPos, Integer.DigitTens[r]);
-        }
-
-        // We know there are at most two digits left at this point.
-        q2 = i2 / 10;
-        r  = (q2 * 10) - i2;
-        StringUTF16.putChar(buf, --charPos, '0' + r);
-
-        // Whatever left is the remaining digit.
-        if (q2 < 0) {
-            StringUTF16.putChar(buf, --charPos, '0' - q2);
-        }
-
-        if (negative) {
-            StringUTF16.putChar(buf, --charPos, '-');
-        }
-        return charPos;
-    }
-
-    /**
      * Returns the string representation size for a given long value.
      *
      * @param x long value
--- a/jdk/src/java.base/share/classes/java/lang/Process.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/Process.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -80,10 +80,10 @@
  *
  * <p>Subclasses of Process should override the {@link #onExit()} and
  * {@link #toHandle()} methods to provide a fully functional Process including the
- * {@link #getPid() process id},
- * {@link #info() information about the process},
- * {@link #children() direct children}, and
- * {@link #descendants() direct children plus descendants of those children} of the process.
+ * {@linkplain #pid() process id},
+ * {@linkplain #info() information about the process},
+ * {@linkplain #children() direct children}, and
+ * {@linkplain #descendants() direct children plus descendants of those children} of the process.
  * Delegating to the underlying Process or ProcessHandle is typically
  * easiest and most efficient.
  *
@@ -237,14 +237,14 @@
     /**
      * Kills the process.
      * Whether the process represented by this {@code Process} object is
-     * {@link #supportsNormalTermination normally terminated} or not is
+     * {@linkplain #supportsNormalTermination normally terminated} or not is
      * implementation dependent.
      * Forcible process destruction is defined as the immediate termination of a
      * process, whereas normal termination allows the process to shut down cleanly.
      * If the process is not alive, no action is taken.
      * <p>
      * The {@link java.util.concurrent.CompletableFuture} from {@link #onExit} is
-     * {@link java.util.concurrent.CompletableFuture#complete completed}
+     * {@linkplain java.util.concurrent.CompletableFuture#complete completed}
      * when the process has terminated.
      */
     public abstract void destroy();
@@ -257,7 +257,7 @@
      * If the process is not alive, no action is taken.
      * <p>
      * The {@link java.util.concurrent.CompletableFuture} from {@link #onExit} is
-     * {@link java.util.concurrent.CompletableFuture#complete completed}
+     * {@linkplain java.util.concurrent.CompletableFuture#complete completed}
      * when the process has terminated.
      * <p>
      * Invoking this method on {@code Process} objects returned by
@@ -335,15 +335,15 @@
      *
      * @implSpec
      * The implementation of this method returns the process id as:
-     * {@link #toHandle toHandle().getPid()}.
+     * {@link #toHandle toHandle().pid()}.
      *
      * @return the native process id of the process
      * @throws UnsupportedOperationException if the Process implementation
      *         does not support this operation
      * @since 9
      */
-    public long getPid() {
-        return toHandle().getPid();
+    public long pid() {
+        return toHandle().pid();
     }
 
     /**
@@ -357,9 +357,9 @@
      * <p>
      * Calling {@code onExit().get()} waits for the process to terminate and returns
      * the Process. The future can be used to check if the process is
-     * {@link java.util.concurrent.CompletableFuture#isDone done} or to
-     * {@link java.util.concurrent.CompletableFuture#get() wait} for it to terminate.
-     * {@link java.util.concurrent.CompletableFuture#cancel(boolean) Cancelling}
+     * {@linkplain java.util.concurrent.CompletableFuture#isDone done} or to
+     * {@linkplain java.util.concurrent.CompletableFuture#get() wait} for it to terminate.
+     * {@linkplain java.util.concurrent.CompletableFuture#cancel(boolean) Cancelling}
      * the CompletableFuture does not affect the Process.
      * <p>
      * Processes returned from {@link ProcessBuilder#start} override the
@@ -389,7 +389,7 @@
      * {@code waitFor} is interrupted, the thread's interrupt status is preserved.
      * <p>
      * When {@link #waitFor()} returns successfully the CompletableFuture is
-     * {@link java.util.concurrent.CompletableFuture#complete completed} regardless
+     * {@linkplain java.util.concurrent.CompletableFuture#complete completed} regardless
      * of the exit status of the process.
      *
      * This implementation may consume a lot of memory for thread stacks if a
@@ -463,7 +463,7 @@
      * This implementation throws an instance of
      * {@link java.lang.UnsupportedOperationException} and performs no other action.
      * Subclasses should override this method to provide a ProcessHandle for the
-     * process.  The methods {@link #getPid}, {@link #info}, {@link #children},
+     * process.  The methods {@link #pid}, {@link #info}, {@link #children},
      * and {@link #descendants}, unless overridden, operate on the ProcessHandle.
      *
      * @return Returns a ProcessHandle for the Process
@@ -500,10 +500,10 @@
     /**
      * Returns a snapshot of the direct children of the process.
      * The parent of a direct child process is the process.
-     * Typically, a process that is {@link #isAlive not alive} has no children.
+     * Typically, a process that is {@linkplain #isAlive not alive} has no children.
      * <p>
      * <em>Note that processes are created and terminate asynchronously.
-     * There is no guarantee that a process is {@link #isAlive alive}.
+     * There is no guarantee that a process is {@linkplain #isAlive alive}.
      * </em>
      *
      * @implSpec
@@ -526,10 +526,10 @@
      * Returns a snapshot of the descendants of the process.
      * The descendants of a process are the children of the process
      * plus the descendants of those children, recursively.
-     * Typically, a process that is {@link #isAlive not alive} has no children.
+     * Typically, a process that is {@linkplain #isAlive not alive} has no children.
      * <p>
      * <em>Note that processes are created and terminate asynchronously.
-     * There is no guarantee that a process is {@link #isAlive alive}.
+     * There is no guarantee that a process is {@linkplain #isAlive alive}.
      * </em>
      *
      * @implSpec
--- a/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,7 +104,7 @@
      * @throws UnsupportedOperationException if the implementation
      *         does not support this operation
      */
-    long getPid();
+    long pid();
 
     /**
      * Returns an {@code Optional<ProcessHandle>} for an existing native process.
@@ -383,7 +383,7 @@
     /**
      * Returns a hash code value for this ProcessHandle.
      * The hashcode value follows the general contract for {@link Object#hashCode()}.
-     * The value is a function of the {@link #getPid getPid()} value and
+     * The value is a function of the {@link #pid pid()} value and
      * may be a function of additional information to uniquely identify the process.
      * If two ProcessHandles are equal according to the {@link #equals(Object) equals}
      * method, then calling the hashCode method on each of the two objects
--- a/jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java	Fri Apr 28 18:10:28 2017 +0100
@@ -35,11 +35,7 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
-import java.util.concurrent.ForkJoinPool;
-import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
@@ -176,7 +172,7 @@
             throw new IllegalStateException("onExit for current process not allowed");
         }
 
-        return ProcessHandleImpl.completion(getPid(), false)
+        return ProcessHandleImpl.completion(pid(), false)
                 .handleAsync((exitStatus, unusedThrowable) -> this);
     }
 
@@ -259,7 +255,7 @@
      * @return the native process ID
      */
     @Override
-    public long getPid() {
+    public long pid() {
         return pid;
     }
 
--- a/jdk/src/java.base/share/classes/java/lang/String.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/String.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1064,11 +1064,7 @@
             if (!isLatin1()) {  // utf16 str and latin1 abs can never be "equal"
                 return false;
             }
-            for (int i = 0; i < len; i++) {
-                if ((char)(v1[i] & 0xff) != StringUTF16.getChar(v2, i)) {
-                    return false;
-                }
-            }
+            return StringUTF16.contentEquals(v1, v2, len);
         }
         return true;
     }
@@ -1120,10 +1116,8 @@
                 }
             }
         } else {
-            for (int i = 0; i < n; i++) {
-                if (StringUTF16.getChar(val, i) != cs.charAt(i)) {
-                    return false;
-                }
+            if (!StringUTF16.contentEquals(val, cs, n)) {
+                return false;
             }
         }
         return true;
@@ -1734,6 +1728,9 @@
         if (tgtCount == 0) {
             return fromIndex;
         }
+        if (tgtCount > srcCount) {
+            return -1;
+        }
         if (srcCoder == tgtCoder) {
             return srcCoder == LATIN1
                 ? StringLatin1.indexOf(src, srcCount, tgt, tgtCount, fromIndex)
@@ -1792,7 +1789,7 @@
      * is the string being searched for.
      *
      * @param   src         the characters being searched.
-     * @param   srcCoder  coder handles the mapping between bytes/chars
+     * @param   srcCoder    coder handles the mapping between bytes/chars
      * @param   srcCount    count of the source string.
      * @param   tgt         the characters being searched for.
      * @param   fromIndex   the index to begin searching from.
@@ -1807,12 +1804,12 @@
          * consistency, don't check for null str.
          */
         int rightIndex = srcCount - tgtCount;
+        if (fromIndex > rightIndex) {
+            fromIndex = rightIndex;
+        }
         if (fromIndex < 0) {
             return -1;
         }
-        if (fromIndex > rightIndex) {
-            fromIndex = rightIndex;
-        }
         /* Empty string always matches. */
         if (tgtCount == 0) {
             return fromIndex;
@@ -1825,31 +1822,8 @@
         if (srcCoder == LATIN1) {    // && tgtCoder == UTF16
             return -1;
         }
-                                     // srcCoder == UTF16 && tgtCoder == LATIN1
-        int min = tgtCount - 1;
-        int i = min + fromIndex;
-        int strLastIndex = tgtCount - 1;
-
-        char strLastChar = (char)(tgt[strLastIndex] & 0xff);
-    startSearchForLastChar:
-        while (true) {
-            while (i >= min && StringUTF16.getChar(src, i) != strLastChar) {
-                i--;
-            }
-            if (i < min) {
-                return -1;
-            }
-            int j = i - 1;
-            int start = j - strLastIndex;
-            int k = strLastIndex - 1;
-            while (j > start) {
-                if (StringUTF16.getChar(src, j--) != (tgt[k--] & 0xff)) {
-                    i--;
-                    continue startSearchForLastChar;
-                }
-            }
-            return start + 1;
-        }
+        // srcCoder == UTF16 && tgtCoder == LATIN1
+        return StringUTF16.lastIndexOfLatin1(src, srcCount, tgt, tgtCount, fromIndex);
     }
 
     /**
@@ -3078,7 +3052,8 @@
      */
     static void checkIndex(int index, int length) {
         if (index < 0 || index >= length) {
-            throw new StringIndexOutOfBoundsException("index " + index);
+            throw new StringIndexOutOfBoundsException("index " + index +
+                                                      ",length " + length);
         }
     }
 
@@ -3116,7 +3091,7 @@
      *          If {@code begin} is negative, {@code begin} is greater than
      *          {@code end}, or {@code end} is greater than {@code length}.
      */
-    private static void checkBoundsBeginEnd(int begin, int end, int length) {
+    static void checkBoundsBeginEnd(int begin, int end, int length) {
         if (begin < 0 || begin > end || end > length) {
             throw new StringIndexOutOfBoundsException(
                 "begin " + begin + ", end " + end + ", length " + length);
--- a/jdk/src/java.base/share/classes/java/lang/StringConcatHelper.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/StringConcatHelper.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -293,7 +293,7 @@
         if (coder == String.LATIN1) {
             return Integer.getChars(value, index, buf);
         } else {
-            return Integer.getCharsUTF16(value, index, buf);
+            return StringUTF16.getChars(value, index, buf);
         }
     }
 
@@ -311,7 +311,7 @@
         if (coder == String.LATIN1) {
             return Long.getChars(value, index, buf);
         } else {
-            return Long.getCharsUTF16(value, index, buf);
+            return StringUTF16.getChars(value, index, buf);
         }
     }
 
--- a/jdk/src/java.base/share/classes/java/lang/StringLatin1.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/StringLatin1.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,6 @@
 import static java.lang.String.LATIN1;
 import static java.lang.String.UTF16;
 import static java.lang.String.checkOffset;
-import static java.lang.String.checkBoundsOffCount;
 
 final class StringLatin1 {
 
@@ -566,11 +565,7 @@
     // inflatedCopy byte[] -> byte[]
     @HotSpotIntrinsicCandidate
     public static void inflate(byte[] src, int srcOff, byte[] dst, int dstOff, int len) {
-        // We need a range check here because 'putChar' has no checks
-        checkBoundsOffCount(dstOff << 1, len << 1, dst.length);
-        for (int i = 0; i < len; i++) {
-            StringUTF16.putChar(dst, dstOff++, src[srcOff++] & 0xff);
-        }
+        StringUTF16.inflate(src, srcOff, dst, dstOff, len);
     }
 
     static class CharsSpliterator implements Spliterator.OfInt {
--- a/jdk/src/java.base/share/classes/java/lang/StringUTF16.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/StringUTF16.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,11 @@
 import java.util.Spliterator;
 import java.util.function.IntConsumer;
 import jdk.internal.HotSpotIntrinsicCandidate;
+import jdk.internal.vm.annotation.ForceInline;
+import jdk.internal.vm.annotation.DontInline;
 
 import static java.lang.String.UTF16;
 import static java.lang.String.LATIN1;
-import static java.lang.String.checkIndex;
-import static java.lang.String.checkOffset;
-import static java.lang.String.checkBoundsOffCount;
 
 final class StringUTF16 {
 
@@ -51,33 +50,37 @@
     }
 
     @HotSpotIntrinsicCandidate
-    public static void putChar(byte[] val, int index, int c) {
+    // intrinsic performs no bounds checks
+    static void putChar(byte[] val, int index, int c) {
+        assert index >= 0 && index < length(val) : "Trusted caller missed bounds check";
         index <<= 1;
         val[index++] = (byte)(c >> HI_BYTE_SHIFT);
         val[index]   = (byte)(c >> LO_BYTE_SHIFT);
     }
 
     @HotSpotIntrinsicCandidate
-    public static char getChar(byte[] val, int index) {
+    // intrinsic performs no bounds checks
+    static char getChar(byte[] val, int index) {
+        assert index >= 0 && index < length(val) : "Trusted caller missed bounds check";
         index <<= 1;
         return (char)(((val[index++] & 0xff) << HI_BYTE_SHIFT) |
                       ((val[index]   & 0xff) << LO_BYTE_SHIFT));
     }
 
-    public static char charAt(byte[] value, int index) {
-        if (index < 0 || index >= value.length >> 1) {
-            throw new StringIndexOutOfBoundsException(index);
-        }
-        return getChar(value, index);
-    }
-
     public static int length(byte[] value) {
         return value.length >> 1;
     }
 
-    public static int codePointAt(byte[] value, int index, int end) {
+    private static int codePointAt(byte[] value, int index, int end, boolean checked) {
+        assert index < end;
+        if (checked) {
+            checkIndex(index, value);
+        }
         char c1 = getChar(value, index);
         if (Character.isHighSurrogate(c1) && ++index < end) {
+            if (checked) {
+                checkIndex(index, value);
+            }
             char c2 = getChar(value, index);
             if (Character.isLowSurrogate(c2)) {
                return Character.toCodePoint(c1, c2);
@@ -86,10 +89,22 @@
         return c1;
     }
 
-    public static int codePointBefore(byte[] value, int index) {
-        char c2 = getChar(value, --index);
+    public static int codePointAt(byte[] value, int index, int end) {
+       return codePointAt(value, index, end, false /* unchecked */);
+    }
+
+    private static int codePointBefore(byte[] value, int index, boolean checked) {
+        --index;
+        if (checked) {
+            checkIndex(index, value);
+        }
+        char c2 = getChar(value, index);
         if (Character.isLowSurrogate(c2) && index > 0) {
-            char c1 = getChar(value, --index);
+            --index;
+            if (checked) {
+                checkIndex(index, value);
+            }
+            char c1 = getChar(value, index);
             if (Character.isHighSurrogate(c1)) {
                return Character.toCodePoint(c1, c2);
             }
@@ -97,11 +112,19 @@
         return c2;
     }
 
-    public static int codePointCount(byte[] value, int beginIndex, int endIndex) {
+    public static int codePointBefore(byte[] value, int index) {
+        return codePointBefore(value, index, false /* unchecked */);
+    }
+
+    private static int codePointCount(byte[] value, int beginIndex, int endIndex, boolean checked) {
+        assert beginIndex <= endIndex;
         int count = endIndex - beginIndex;
-        for (int i = beginIndex; i < endIndex; ) {
+        int i = beginIndex;
+        if (checked && i < endIndex) {
+            checkBoundsBeginEnd(i, endIndex, value);
+        }
+        for (; i < endIndex - 1; ) {
             if (Character.isHighSurrogate(getChar(value, i++)) &&
-                i < endIndex &&
                 Character.isLowSurrogate(getChar(value, i))) {
                 count--;
                 i++;
@@ -110,6 +133,10 @@
         return count;
     }
 
+    public static int codePointCount(byte[] value, int beginIndex, int endIndex) {
+        return codePointCount(value, beginIndex, endIndex, false /* unchecked */);
+    }
+
     public static char[] toChars(byte[] value) {
         char[] dst = new char[value.length >> 1];
         getChars(value, 0, dst.length, dst, 0);
@@ -162,7 +189,7 @@
     @HotSpotIntrinsicCandidate
     public static int compress(byte[] src, int srcOff, byte[] dst, int dstOff, int len) {
         // We need a range check here because 'getChar' has no checks
-        checkBoundsOffCount(srcOff << 1, len << 1, src.length);
+        checkBoundsOffCount(srcOff, len, src);
         for (int i = 0; i < len; i++) {
             char c = getChar(src, srcOff);
             if (c > 0xFF) {
@@ -212,7 +239,7 @@
     public static void getChars(byte[] value, int srcBegin, int srcEnd, char dst[], int dstBegin) {
         // We need a range check here because 'getChar' has no checks
         if (srcBegin < srcEnd) {
-            checkBoundsOffCount(srcBegin << 1, (srcEnd - srcBegin) << 1, value.length);
+            checkBoundsOffCount(srcBegin, srcEnd - srcBegin, value);
         }
         for (int i = srcBegin; i < srcEnd; i++) {
             dst[dstBegin++] = getChar(value, i);
@@ -319,14 +346,25 @@
         if (str.length == 0) {
             return 0;
         }
-        if (value.length == 0) {
+        if (value.length < str.length) {
             return -1;
         }
-        return indexOf(value, length(value), str, length(str), 0);
+        return indexOfUnsafe(value, length(value), str, length(str), 0);
     }
 
     @HotSpotIntrinsicCandidate
     public static int indexOf(byte[] value, int valueCount, byte[] str, int strCount, int fromIndex) {
+        checkBoundsBeginEnd(fromIndex, valueCount, value);
+        checkBoundsBeginEnd(0, strCount, str);
+        return indexOfUnsafe(value, valueCount, str, strCount, fromIndex);
+    }
+
+
+    private static int indexOfUnsafe(byte[] value, int valueCount, byte[] str, int strCount, int fromIndex) {
+        assert fromIndex >= 0;
+        assert strCount > 0;
+        assert strCount <= length(str);
+        assert valueCount >= strCount;
         char first = getChar(str, 0);
         int max = (valueCount - strCount);
         for (int i = fromIndex; i <= max; i++) {
@@ -348,6 +386,7 @@
         return -1;
     }
 
+
     /**
      * Handles indexOf Latin1 substring in UTF16 string.
      */
@@ -356,14 +395,24 @@
         if (str.length == 0) {
             return 0;
         }
-        if (value.length == 0) {
+        if (length(value) < str.length) {
             return -1;
         }
-        return indexOfLatin1(value, length(value), str, str.length, 0);
+        return indexOfLatin1Unsafe(value, length(value), str, str.length, 0);
     }
 
     @HotSpotIntrinsicCandidate
     public static int indexOfLatin1(byte[] src, int srcCount, byte[] tgt, int tgtCount, int fromIndex) {
+        checkBoundsBeginEnd(fromIndex, srcCount, src);
+        String.checkBoundsBeginEnd(0, tgtCount, tgt.length);
+        return indexOfLatin1Unsafe(src, srcCount, tgt, tgtCount, fromIndex);
+    }
+
+    public static int indexOfLatin1Unsafe(byte[] src, int srcCount, byte[] tgt, int tgtCount, int fromIndex) {
+        assert fromIndex >= 0;
+        assert tgtCount > 0;
+        assert tgtCount <= tgt.length;
+        assert srcCount >= tgtCount;
         char first = (char)(tgt[0] & 0xff);
         int max = (srcCount - tgtCount);
         for (int i = fromIndex; i <= max; i++) {
@@ -389,6 +438,11 @@
 
     @HotSpotIntrinsicCandidate
     private static int indexOfChar(byte[] value, int ch, int fromIndex, int max) {
+        checkBoundsBeginEnd(fromIndex, max, value);
+        return indexOfCharUnsafe(value, ch, fromIndex, max);
+    }
+
+    private static int indexOfCharUnsafe(byte[] value, int ch, int fromIndex, int max) {
         for (int i = fromIndex; i < max; i++) {
             if (getChar(value, i) == ch) {
                 return i;
@@ -404,6 +458,7 @@
         if (Character.isValidCodePoint(ch)) {
             final char hi = Character.highSurrogate(ch);
             final char lo = Character.lowSurrogate(ch);
+            checkBoundsBeginEnd(fromIndex, max, value);
             for (int i = fromIndex; i < max - 1; i++) {
                 if (getChar(value, i) == hi && getChar(value, i + 1 ) == lo) {
                     return i;
@@ -413,13 +468,21 @@
         return -1;
     }
 
+    // srcCoder == UTF16 && tgtCoder == UTF16
     public static int lastIndexOf(byte[] src, int srcCount,
                                   byte[] tgt, int tgtCount, int fromIndex) {
+        assert fromIndex >= 0;
+        assert tgtCount > 0;
+        assert tgtCount <= length(tgt);
         int min = tgtCount - 1;
         int i = min + fromIndex;
         int strLastIndex = tgtCount - 1;
+
+        checkIndex(strLastIndex, tgt);
         char strLastChar = getChar(tgt, strLastIndex);
 
+        checkIndex(i, src);
+
     startSearchForLastChar:
         while (true) {
             while (i >= min && getChar(src, i) != strLastChar) {
@@ -509,6 +572,9 @@
     public static boolean regionMatchesCI(byte[] value, int toffset,
                                           byte[] other, int ooffset, int len) {
         int last = toffset + len;
+        assert toffset >= 0 && ooffset >= 0;
+        assert ooffset + len <= length(other);
+        assert last <= length(value);
         while (toffset < last) {
             char c1 = getChar(value, toffset++);
             char c2 = getChar(other, ooffset++);
@@ -599,6 +665,8 @@
     private static String toLowerCaseEx(String str, byte[] value,
                                         byte[] result, int first, Locale locale,
                                         boolean localeDependent) {
+        assert(result.length == value.length);
+        assert(first >= 0);
         int resultOffset = first;
         int length = value.length >> 1;
         int srcCount;
@@ -633,6 +701,8 @@
                     System.arraycopy(result, 0, result2, 0, resultOffset << 1);
                     result = result2;
                 }
+                assert resultOffset >= 0;
+                assert resultOffset + mapLen <= length(result);
                 for (int x = 0; x < mapLen; ++x) {
                     putChar(result, resultOffset++, lowerCharArray[x]);
                 }
@@ -697,6 +767,8 @@
                                         byte[] result, int first,
                                         Locale locale, boolean localeDependent)
     {
+        assert(result.length == value.length);
+        assert(first >= 0);
         int resultOffset = first;
         int length = value.length >> 1;
         int srcCount;
@@ -733,10 +805,12 @@
                     byte[] result2 = newBytesFor((result.length >> 1) + mapLen - srcCount);
                     System.arraycopy(result, 0, result2, 0, resultOffset << 1);
                     result = result2;
-                 }
-                 for (int x = 0; x < mapLen; ++x) {
+                }
+                assert resultOffset >= 0;
+                assert resultOffset + mapLen <= length(result);
+                for (int x = 0; x < mapLen; ++x) {
                     putChar(result, resultOffset++, upperCharArray[x]);
-                 }
+                }
             }
         }
         return newString(result, 0, resultOffset);
@@ -757,7 +831,7 @@
             null;
     }
 
-    public static void putChars(byte[] val, int index, char[] str, int off, int end) {
+    private static void putChars(byte[] val, int index, char[] str, int off, int end) {
         while (off < end) {
             putChar(val, index++, str[off++]);
         }
@@ -927,35 +1001,172 @@
     ////////////////////////////////////////////////////////////////
 
     public static void putCharSB(byte[] val, int index, int c) {
-        checkIndex(index, val.length >> 1);
+        checkIndex(index, val);
         putChar(val, index, c);
     }
 
     public static void putCharsSB(byte[] val, int index, char[] ca, int off, int end) {
-        checkOffset(index + end - off, val.length >> 1);
+        checkBoundsBeginEnd(index, index + end - off, val);
         putChars(val, index, ca, off, end);
     }
 
     public static void putCharsSB(byte[] val, int index, CharSequence s, int off, int end) {
-        checkOffset(index + end - off, val.length >> 1);
+        checkBoundsBeginEnd(index, index + end - off, val);
         for (int i = off; i < end; i++) {
             putChar(val, index++, s.charAt(i));
         }
     }
 
     public static int codePointAtSB(byte[] val, int index, int end) {
-        checkOffset(end, val.length >> 1);
-        return codePointAt(val, index, end);
+        return codePointAt(val, index, end, true /* checked */);
     }
 
     public static int codePointBeforeSB(byte[] val, int index) {
-        checkOffset(index, val.length >> 1);
-        return codePointBefore(val, index);
+        return codePointBefore(val, index, true /* checked */);
     }
 
     public static int codePointCountSB(byte[] val, int beginIndex, int endIndex) {
-        checkOffset(endIndex, val.length >> 1);
-        return codePointCount(val, beginIndex, endIndex);
+        return codePointCount(val, beginIndex, endIndex, true /* checked */);
+    }
+
+    public static int getChars(int i, int begin, int end, byte[] value) {
+        checkBoundsBeginEnd(begin, end, value);
+        int pos = getChars(i, end, value);
+        assert begin == pos;
+        return pos;
+    }
+
+    public static int getChars(long l, int begin, int end, byte[] value) {
+        checkBoundsBeginEnd(begin, end, value);
+        int pos = getChars(l, end, value);
+        assert begin == pos;
+        return pos;
+    }
+
+    public static boolean contentEquals(byte[] v1, byte[] v2, int len) {
+        checkBoundsOffCount(0, len, v2);
+        for (int i = 0; i < len; i++) {
+            if ((char)(v1[i] & 0xff) != getChar(v2, i)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static boolean contentEquals(byte[] value, CharSequence cs, int len) {
+        checkOffset(len, value);
+        for (int i = 0; i < len; i++) {
+            if (getChar(value, i) != cs.charAt(i)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static int putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4) {
+        int end = i + 4;
+        checkBoundsBeginEnd(i, end, value);
+        putChar(value, i++, c1);
+        putChar(value, i++, c2);
+        putChar(value, i++, c3);
+        putChar(value, i++, c4);
+        assert(i == end);
+        return end;
+    }
+
+    public static int putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4, char c5) {
+        int end = i + 5;
+        checkBoundsBeginEnd(i, end, value);
+        putChar(value, i++, c1);
+        putChar(value, i++, c2);
+        putChar(value, i++, c3);
+        putChar(value, i++, c4);
+        putChar(value, i++, c5);
+        assert(i == end);
+        return end;
+    }
+
+    public static char charAt(byte[] value, int index) {
+        checkIndex(index, value);
+        return getChar(value, index);
+    }
+
+    public static void reverse(byte[] val, int count) {
+        checkOffset(count, val);
+        int n = count - 1;
+        boolean hasSurrogates = false;
+        for (int j = (n-1) >> 1; j >= 0; j--) {
+            int k = n - j;
+            char cj = getChar(val, j);
+            char ck = getChar(val, k);
+            putChar(val, j, ck);
+            putChar(val, k, cj);
+            if (Character.isSurrogate(cj) ||
+                Character.isSurrogate(ck)) {
+                hasSurrogates = true;
+            }
+        }
+        if (hasSurrogates) {
+            reverseAllValidSurrogatePairs(val, count);
+        }
+    }
+
+    /** Outlined helper method for reverse() */
+    private static void reverseAllValidSurrogatePairs(byte[] val, int count) {
+        for (int i = 0; i < count - 1; i++) {
+            char c2 = getChar(val, i);
+            if (Character.isLowSurrogate(c2)) {
+                char c1 = getChar(val, i + 1);
+                if (Character.isHighSurrogate(c1)) {
+                    putChar(val, i++, c1);
+                    putChar(val, i, c2);
+                }
+            }
+        }
+    }
+
+    // inflatedCopy byte[] -> byte[]
+    public static void inflate(byte[] src, int srcOff, byte[] dst, int dstOff, int len) {
+        // We need a range check here because 'putChar' has no checks
+        checkBoundsOffCount(dstOff, len, dst);
+        for (int i = 0; i < len; i++) {
+            putChar(dst, dstOff++, src[srcOff++] & 0xff);
+        }
+    }
+
+    // srcCoder == UTF16 && tgtCoder == LATIN1
+    public static int lastIndexOfLatin1(byte[] src, int srcCount,
+                                        byte[] tgt, int tgtCount, int fromIndex) {
+        assert fromIndex >= 0;
+        assert tgtCount > 0;
+        assert tgtCount <= tgt.length;
+        int min = tgtCount - 1;
+        int i = min + fromIndex;
+        int strLastIndex = tgtCount - 1;
+
+        char strLastChar = (char)(tgt[strLastIndex] & 0xff);
+
+        checkIndex(i, src);
+
+    startSearchForLastChar:
+        while (true) {
+            while (i >= min && getChar(src, i) != strLastChar) {
+                i--;
+            }
+            if (i < min) {
+                return -1;
+            }
+            int j = i - 1;
+            int start = j - strLastIndex;
+            int k = strLastIndex - 1;
+            while (j > start) {
+                if (getChar(src, j--) != (tgt[k--] & 0xff)) {
+                    i--;
+                    continue startSearchForLastChar;
+                }
+            }
+            return start + 1;
+        }
     }
 
     ////////////////////////////////////////////////////////////////
@@ -975,4 +1186,123 @@
     }
 
     static final int MAX_LENGTH = Integer.MAX_VALUE >> 1;
+
+    // Used by trusted callers.  Assumes all necessary bounds checks have
+    // been done by the caller.
+
+    /**
+     * This is a variant of {@link Integer#getChars(int, int, byte[])}, but for
+     * UTF-16 coder.
+     *
+     * @param i     value to convert
+     * @param index next index, after the least significant digit
+     * @param buf   target buffer, UTF16-coded.
+     * @return index of the most significant digit or minus sign, if present
+     */
+    static int getChars(int i, int index, byte[] buf) {
+        int q, r;
+        int charPos = index;
+
+        boolean negative = (i < 0);
+        if (!negative) {
+            i = -i;
+        }
+
+        // Get 2 digits/iteration using ints
+        while (i <= -100) {
+            q = i / 100;
+            r = (q * 100) - i;
+            i = q;
+            putChar(buf, --charPos, Integer.DigitOnes[r]);
+            putChar(buf, --charPos, Integer.DigitTens[r]);
+        }
+
+        // We know there are at most two digits left at this point.
+        q = i / 10;
+        r = (q * 10) - i;
+        putChar(buf, --charPos, '0' + r);
+
+        // Whatever left is the remaining digit.
+        if (q < 0) {
+            putChar(buf, --charPos, '0' - q);
+        }
+
+        if (negative) {
+            putChar(buf, --charPos, '-');
+        }
+        return charPos;
+    }
+
+    /**
+     * This is a variant of {@link Long#getChars(long, int, byte[])}, but for
+     * UTF-16 coder.
+     *
+     * @param i     value to convert
+     * @param index next index, after the least significant digit
+     * @param buf   target buffer, UTF16-coded.
+     * @return index of the most significant digit or minus sign, if present
+     */
+    static int getChars(long i, int index, byte[] buf) {
+        long q;
+        int r;
+        int charPos = index;
+
+        boolean negative = (i < 0);
+        if (!negative) {
+            i = -i;
+        }
+
+        // Get 2 digits/iteration using longs until quotient fits into an int
+        while (i <= Integer.MIN_VALUE) {
+            q = i / 100;
+            r = (int)((q * 100) - i);
+            i = q;
+            putChar(buf, --charPos, Integer.DigitOnes[r]);
+            putChar(buf, --charPos, Integer.DigitTens[r]);
+        }
+
+        // Get 2 digits/iteration using ints
+        int q2;
+        int i2 = (int)i;
+        while (i2 <= -100) {
+            q2 = i2 / 100;
+            r  = (q2 * 100) - i2;
+            i2 = q2;
+            putChar(buf, --charPos, Integer.DigitOnes[r]);
+            putChar(buf, --charPos, Integer.DigitTens[r]);
+        }
+
+        // We know there are at most two digits left at this point.
+        q2 = i2 / 10;
+        r  = (q2 * 10) - i2;
+        putChar(buf, --charPos, '0' + r);
+
+        // Whatever left is the remaining digit.
+        if (q2 < 0) {
+            putChar(buf, --charPos, '0' - q2);
+        }
+
+        if (negative) {
+            putChar(buf, --charPos, '-');
+        }
+        return charPos;
+    }
+    // End of trusted methods.
+
+    public static void checkIndex(int off, byte[] val) {
+        String.checkIndex(off, length(val));
+    }
+
+    public static void checkOffset(int off, byte[] val) {
+        String.checkOffset(off, length(val));
+    }
+
+    public static void checkBoundsBeginEnd(int begin, int end, byte[] val) {
+        String.checkBoundsBeginEnd(begin, end, length(val));
+    }
+
+    public static void checkBoundsOffCount(int offset, int count, byte[] val) {
+        String.checkBoundsOffCount(offset, count, length(val));
+    }
+
 }
--- a/jdk/src/java.base/share/classes/java/lang/System.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/lang/System.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1766,6 +1766,7 @@
      * @since   1.1
      */
     @Deprecated(since="1.2", forRemoval=true)
+    @SuppressWarnings("removal")
     public static void runFinalizersOnExit(boolean value) {
         Runtime.runFinalizersOnExit(value);
     }
--- a/jdk/src/java.base/share/classes/java/time/temporal/ValueRange.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/share/classes/java/time/temporal/ValueRange.java	Fri Apr 28 18:10:28 2017 +0100
@@ -385,7 +385,7 @@
         }
         if (obj instanceof ValueRange) {
             ValueRange other = (ValueRange) obj;
-           return minSmallest == other.minSmallest && minLargest == other.minLargest &&
+            return minSmallest == other.minSmallest && minLargest == other.minLargest &&
                    maxSmallest == other.maxSmallest && maxLargest == other.maxLargest;
         }
         return false;
@@ -398,8 +398,9 @@
      */
     @Override
     public int hashCode() {
-        long hash = minSmallest + minLargest << 16 + minLargest >> 48 + maxSmallest << 32 +
-            maxSmallest >> 32 + maxLargest << 48 + maxLargest >> 16;
+        long hash = minSmallest + (minLargest << 16) + (minLargest >> 48) +
+                (maxSmallest << 32) + (maxSmallest >> 32) + (maxLargest << 48) +
+                (maxLargest >> 16);
         return (int) (hash ^ (hash >>> 32));
     }
 
--- a/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -617,7 +617,7 @@
     }
 
     @Override
-    public long getPid() {
+    public long pid() {
         return pid;
     }
 
--- a/jdk/src/java.base/windows/classes/java/lang/ProcessImpl.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.base/windows/classes/java/lang/ProcessImpl.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -523,7 +523,7 @@
 
     @Override
     public CompletableFuture<Process> onExit() {
-        return ProcessHandleImpl.completion(getPid(), false)
+        return ProcessHandleImpl.completion(pid(), false)
                 .handleAsync((exitStatus, unusedThrowable) -> this);
     }
 
@@ -550,8 +550,8 @@
     private static native void terminateProcess(long handle);
 
     @Override
-    public long getPid() {
-        return processHandle.getPid();
+    public long pid() {
+        return processHandle.pid();
     }
 
     private static native int getProcessId0(long handle);
@@ -572,7 +572,7 @@
     @Override
     public String toString() {
         int exitCode = getExitCodeProcess(handle);
-        return new StringBuilder("Process[pid=").append(getPid())
+        return new StringBuilder("Process[pid=").append(pid())
                 .append(", exitValue=").append(exitCode == STILL_ACTIVE ? "\"not exited\"" : exitCode)
                 .append("]").toString();
     }
--- a/jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/DataFlavor.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/DataFlavor.java	Fri Apr 28 18:10:28 2017 +0100
@@ -211,6 +211,9 @@
      *     representationClass = java.awt.Image
      *     mimeType            = "image/x-java-image"
      * </pre>
+     * Will be {@code null} if {@code java.awt.Image} is not visible, the
+     * {@code java.desktop} module is not loaded, or the {@code java.desktop}
+     * module is not in the run-time image.
      */
     public static final DataFlavor imageFlavor = createConstant("image/x-java-image; class=java.awt.Image", "Image");
 
--- a/jdk/src/java.desktop/macosx/classes/apple/laf/JRSUIConstants.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/apple/laf/JRSUIConstants.java	Fri Apr 28 18:10:28 2017 +0100
@@ -78,7 +78,7 @@
                 return "THUMB_START";
             } else if (hit == WINDOW_TITLE_BAR_HEIGHT) {
                 return "WINDOW_TITLE_BAR_HEIGHT";
-            } else if (hit == THUMB_START) {
+            } else if (hit == ANIMATION_FRAME) {
                 return "ANIMATION_FRAME";
             }
             return getClass().getSimpleName();
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/Application.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/Application.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,24 @@
 import java.awt.PopupMenu;
 import java.awt.Toolkit;
 import java.awt.Window;
-import java.awt.desktop.*;
+import java.awt.desktop.AboutHandler;
+import java.awt.desktop.AppForegroundListener;
+import java.awt.desktop.AppHiddenListener;
+import java.awt.desktop.AppReopenedListener;
+import java.awt.desktop.OpenFilesEvent;
+import java.awt.desktop.OpenFilesHandler;
+import java.awt.desktop.OpenURIEvent;
+import java.awt.desktop.OpenURIHandler;
+import java.awt.desktop.PreferencesHandler;
+import java.awt.desktop.PrintFilesEvent;
+import java.awt.desktop.PrintFilesHandler;
+import java.awt.desktop.QuitHandler;
+import java.awt.desktop.QuitResponse;
+import java.awt.desktop.QuitStrategy;
+import java.awt.desktop.ScreenSleepListener;
+import java.awt.desktop.SystemEventListener;
+import java.awt.desktop.SystemSleepListener;
+import java.awt.desktop.UserSessionListener;
 import java.beans.Beans;
 
 import javax.swing.JMenuBar;
@@ -108,10 +125,10 @@
      *
      * @see AppForegroundListener
      * @see AppHiddenListener
-     * @see AppReOpenedListener
-     * @see AppScreenSleepListener
-     * @see AppSystemSleepListener
-     * @see AppUserSessionListener
+     * @see AppReopenedListener
+     * @see ScreenSleepListener
+     * @see SystemSleepListener
+     * @see UserSessionListener
      *
      * @param listener
      * @since Java for Mac OS X 10.6 Update 3
@@ -126,10 +143,10 @@
      *
      * @see AppForegroundListener
      * @see AppHiddenListener
-     * @see AppReOpenedListener
-     * @see AppScreenSleepListener
-     * @see AppSystemSleepListener
-     * @see AppUserSessionListener
+     * @see AppReopenedListener
+     * @see ScreenSleepListener
+     * @see SystemSleepListener
+     * @see UserSessionListener
      *
      * @param listener
      * @since Java for Mac OS X 10.6 Update 3
@@ -144,7 +161,7 @@
      *
      * Setting the {@link AboutHandler} to {@code null} reverts it to the default Cocoa About window.
      *
-     * @param aboutHandler the handler to respond to the {@link AboutHandler#handleAbout()} message
+     * @param aboutHandler the handler to respond to the {@link AboutHandler#handleAbout} message
      * @since Java for Mac OS X 10.6 Update 3
      * @since Java for Mac OS X 10.5 Update 8
      */
@@ -167,7 +184,7 @@
 
     /**
      * Installs the handler which is notified when the application is asked to open a list of files.
-     * The {@link OpenFilesHandler#openFiles(AppEvent.OpenFilesEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleDocumentTypes} array present in it's Info.plist.
+     * The {@link OpenFilesHandler#openFiles(OpenFilesEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleDocumentTypes} array present in it's Info.plist.
      * See the <a href="http://developer.apple.com/mac/library/documentation/General/Reference/InfoPlistKeyReference">Info.plist Key Reference</a> for more information about adding a {@code CFBundleDocumentTypes} key to your app's Info.plist.
      *
      * @param openFileHandler
@@ -180,7 +197,7 @@
 
     /**
      * Installs the handler which is notified when the application is asked to print a list of files.
-     * The {@link PrintFilesHandler#printFiles(AppEvent.PrintFilesEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleDocumentTypes} array present in it's Info.plist.
+     * The {@link PrintFilesHandler#printFiles(PrintFilesEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleDocumentTypes} array present in it's Info.plist.
      * See the <a href="http://developer.apple.com/mac/library/documentation/General/Reference/InfoPlistKeyReference">Info.plist Key Reference</a> for more information about adding a {@code CFBundleDocumentTypes} key to your app's Info.plist.
      *
      * @param printFileHandler
@@ -193,10 +210,10 @@
 
     /**
      * Installs the handler which is notified when the application is asked to open a URL.
-     * The {@link OpenURIHandler#openURI(AppEvent.OpenURIEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleURLTypes} array present in it's Info.plist.
+     * The {@link OpenURIHandler#openURI(OpenURIEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleURLTypes} array present in it's Info.plist.
      * See the <a href="http://developer.apple.com/mac/library/documentation/General/Reference/InfoPlistKeyReference">Info.plist Key Reference</a> for more information about adding a {@code CFBundleURLTypes} key to your app's Info.plist.
      *
-     * Setting the handler to {@code null} causes all {@link OpenURIHandler#openURI(AppEvent.OpenURIEvent)} requests to be enqueued until another handler is set.
+     * Setting the handler to {@code null} causes all {@link OpenURIHandler#openURI(OpenURIEvent)} requests to be enqueued until another handler is set.
      *
      * @param openURIHandler
      * @since Java for Mac OS X 10.6 Update 3
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationAdapter.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationAdapter.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,12 +25,26 @@
 
 package com.apple.eawt;
 
+import java.awt.desktop.AboutHandler;
+import java.awt.desktop.AppForegroundListener;
+import java.awt.desktop.AppHiddenListener;
+import java.awt.desktop.AppReopenedListener;
+import java.awt.desktop.OpenFilesHandler;
+import java.awt.desktop.OpenURIHandler;
+import java.awt.desktop.PreferencesHandler;
+import java.awt.desktop.PrintFilesHandler;
+import java.awt.desktop.QuitHandler;
+import java.awt.desktop.ScreenSleepListener;
+import java.awt.desktop.SystemEventListener;
+import java.awt.desktop.SystemSleepListener;
+import java.awt.desktop.UserSessionListener;
+
 /**
  * An abstract adapter class for receiving {@code ApplicationEvents}.
  *
  * ApplicationEvents are deprecated. Use individual app event listeners or handlers instead.
  *
- * @see Application#addAppEventListener(AppEventListener)
+ * @see Application#addAppEventListener(SystemEventListener)
  *
  * @see AboutHandler
  * @see PreferencesHandler
@@ -39,14 +53,14 @@
  * @see PrintFilesHandler
  * @see QuitHandler
  *
- * @see AppReOpenedListener
+ * @see AppReopenedListener
  * @see AppForegroundListener
  * @see AppHiddenListener
  * @see UserSessionListener
  * @see ScreenSleepListener
  * @see SystemSleepListener
  *
- * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReOpenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse}.
+ * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReopenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse}.
  * @since 1.4
  */
 @SuppressWarnings("deprecation")
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationEvent.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationEvent.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,12 +25,18 @@
 
 package com.apple.eawt;
 
+import java.awt.desktop.AboutHandler;
+import java.awt.desktop.AppReopenedListener;
+import java.awt.desktop.OpenFilesHandler;
+import java.awt.desktop.PreferencesHandler;
+import java.awt.desktop.PrintFilesHandler;
+import java.awt.desktop.QuitHandler;
 import java.util.EventObject;
 
 /**
  * The class of events sent to the deprecated ApplicationListener callbacks.
  *
- * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReOpenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse}
+ * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReopenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse}
  * @since 1.4
  */
 @Deprecated
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationListener.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationListener.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,12 +25,25 @@
 
 package com.apple.eawt;
 
+import java.awt.desktop.AboutHandler;
+import java.awt.desktop.AppForegroundListener;
+import java.awt.desktop.AppHiddenListener;
+import java.awt.desktop.AppReopenedListener;
+import java.awt.desktop.OpenFilesHandler;
+import java.awt.desktop.OpenURIHandler;
+import java.awt.desktop.PreferencesHandler;
+import java.awt.desktop.PrintFilesHandler;
+import java.awt.desktop.QuitHandler;
+import java.awt.desktop.ScreenSleepListener;
+import java.awt.desktop.SystemEventListener;
+import java.awt.desktop.SystemSleepListener;
+import java.awt.desktop.UserSessionListener;
 import java.util.EventListener;
 
 /**
  * ApplicationEvents are deprecated. Use individual AppEvent listeners or handlers instead.
  *
- * @see Application#addAppEventListener(AppEventListener)
+ * @see Application#addAppEventListener(SystemEventListener)
  *
  * @see AboutHandler
  * @see PreferencesHandler
@@ -39,7 +52,7 @@
  * @see PrintFilesHandler
  * @see QuitHandler
  *
- * @see AppReOpenedListener
+ * @see AppReopenedListener
  * @see AppForegroundListener
  * @see AppHiddenListener
  * @see UserSessionListener
@@ -47,7 +60,7 @@
  * @see SystemSleepListener
  *
  * @since 1.4
- * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReOpenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse}
+ * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReopenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse}
  */
 @SuppressWarnings("deprecation")
 @Deprecated
@@ -146,7 +159,7 @@
      * event is sent from another application, include that code as part of this handler.
      *
      * @param event the Reopen Application event
-     * @deprecated use {@link AppReOpenedListener}
+     * @deprecated use {@link AppReopenedListener}
      */
     @Deprecated
     public void handleReOpenApplication(ApplicationEvent event);
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenAdapter.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenAdapter.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,13 +25,15 @@
 
 package com.apple.eawt;
 
+import java.awt.Window;
+
 import com.apple.eawt.event.FullScreenEvent;
 
 /**
  * Abstract adapter class for receiving fullscreen events. This class is provided
  * as a convenience for creating listeners.
  *
- * Subclasses registered with {@link FullScreenUtilities#addFullScreenListenerTo(javax.swing.RootPaneContainer, FullScreenListener)}
+ * Subclasses registered with {@link FullScreenUtilities#addFullScreenListenerTo(Window, FullScreenListener)}
  * will receive all entering/entered/exiting/exited full screen events.
  *
  * @see FullScreenUtilities
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenListener.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenListener.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,25 +37,25 @@
 public interface FullScreenListener extends EventListener {
         /**
      * Invoked when a window has started to enter full screen.
-     * @param event containing the specific window entering full screen.
+     * @param e containing the specific window entering full screen.
      */
         public void windowEnteringFullScreen(final FullScreenEvent e);
 
         /**
      * Invoked when a window has fully entered full screen.
-     * @param event containing the specific window which has entered full screen.
+     * @param e containing the specific window which has entered full screen.
      */
         public void windowEnteredFullScreen(final FullScreenEvent e);
 
         /**
      * Invoked when a window has started to exit full screen.
-     * @param event containing the specific window exiting full screen.
+     * @param e containing the specific window exiting full screen.
      */
         public void windowExitingFullScreen(final FullScreenEvent e);
 
         /**
      * Invoked when a window has fully exited full screen.
-     * @param event containing the specific window which has exited full screen.
+     * @param e containing the specific window which has exited full screen.
      */
         public void windowExitedFullScreen(final FullScreenEvent e);
 }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenUtilities.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenUtilities.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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 @@
 /**
  * Utility class perform animated full screen actions to top-level {@link Window}s.
  *
- * This class manages the relationship between {@link Windows}s and the {@link FullScreenListener}s
+ * This class manages the relationship between {@link Window}s and the {@link FullScreenListener}s
  * attached to them. It's design is similar to the Java SE 6u10 {@link com.sun.awt.AWTUtilities}
  * class which adds additional functionality to AWT Windows, without adding new API to the
  * {@link java.awt.Window} class.
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/MacQuitResponse.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/MacQuitResponse.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,14 @@
 
 package com.apple.eawt;
 
+import java.awt.desktop.QuitEvent;
+import java.awt.desktop.QuitHandler;
 import java.awt.desktop.QuitResponse;
+import java.awt.desktop.QuitStrategy;
 
 /**
  * Used to respond to a request to quit the application.
- * The QuitResponse may be used after the {@link QuitHandler#handleQuitRequestWith(AppEvent.QuitEvent, MacQuitResponse)} method has returned, and may be used from any thread.
+ * The QuitResponse may be used after the {@link QuitHandler#handleQuitRequestWith(QuitEvent, QuitResponse)} method has returned, and may be used from any thread.
  *
  * @see Application#setQuitHandler(QuitHandler)
  * @see QuitHandler
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GestureAdapter.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GestureAdapter.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,7 @@
  * Abstract adapter class for receiving gesture events. This class is provided
  * as a convenience for creating listeners.
  *
- * Subclasses registered with {@link GestureUtilities#addGestureListenerTo()}
+ * Subclasses registered with {@link GestureUtilities#addGestureListenerTo}
  * will receive all phase, magnification, rotation, and swipe events.
  *
  * @see GestureUtilities
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GestureEvent.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GestureEvent.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
 package com.apple.eawt.event;
 
 import java.awt.*;
+import java.awt.event.InputEvent;
 
 /**
  * Abstract event all gestures inherit from.
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GesturePhaseListener.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GesturePhaseListener.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,13 +39,13 @@
 public interface GesturePhaseListener extends GestureListener {
     /**
      * Invoked when the user has started a continuous gesture.
-     * @param event representing the start of a continuous gesture.
+     * @param e representing the start of a continuous gesture.
      */
     public void gestureBegan(final GesturePhaseEvent e);
 
     /**
      * Invoked when the user has stopped a continuous gesture.
-     * @param event representing the end of a continuous gesture.
+     * @param e representing the end of a continuous gesture.
      */
     public void gestureEnded(final GesturePhaseEvent e);
 }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/MagnificationListener.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/MagnificationListener.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,7 @@
 public interface MagnificationListener extends GestureListener {
     /**
      * Invoked when a magnification gesture is performed by the user.
-     * @param event containing the scale of the magnification.
+     * @param e containing the scale of the magnification.
      */
     public void magnify(final MagnificationEvent e);
 }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/RotationListener.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/RotationListener.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,7 @@
 public interface RotationListener extends GestureListener {
     /**
      * Invoked when a rotation gesture is performed by the user.
-     * @param event containing an abstract measure of rotation.
+     * @param e containing an abstract measure of rotation.
      */
     public void rotate(final RotationEvent e);
 }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/SwipeListener.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/SwipeListener.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,25 +38,25 @@
 public interface SwipeListener extends GestureListener {
     /**
      * Invoked when an upwards swipe gesture is performed by the user.
-     * @param event representing the occurrence of a swipe.
+     * @param e representing the occurrence of a swipe.
      */
     public void swipedUp(final SwipeEvent e);
 
     /**
      * Invoked when a downward swipe gesture is performed by the user.
-     * @param event representing the occurrence of a swipe.
+     * @param e representing the occurrence of a swipe.
      */
     public void swipedDown(final SwipeEvent e);
 
     /**
      * Invoked when a leftward swipe gesture is performed by the user.
-     * @param event representing the occurrence of a swipe.
+     * @param e representing the occurrence of a swipe.
      */
     public void swipedLeft(final SwipeEvent e);
 
     /**
      * Invoked when a rightward swipe gesture is performed by the user.
-     * @param event representing the occurrence of a swipe.
+     * @param e representing the occurrence of a swipe.
      */
     public void swipedRight(final SwipeEvent e);
 }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -3732,7 +3732,6 @@
          * <p>
          * This should be used if the ActionMap can be shared.
          *
-         * @param c JComponent to install the ActionMap on.
          * @param loaderClass Class object that gets loadActionMap invoked
          *                    on.
          * @param defaultsKey Key to use to defaults table to check for
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/ScreenMenuPropertyListener.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/ScreenMenuPropertyListener.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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 @@
 
     /**
      * This method gets called when a bound property is changed.
-     * @param evt A PropertyChangeEvent object describing the event source
+     * @param e A PropertyChangeEvent object describing the event source
      *       and the property that has changed.
      */
     public void propertyChange(final PropertyChangeEvent e) {
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -232,6 +232,7 @@
 
     private volatile boolean isInFullScreen;
     private volatile boolean isIconifyAnimationActive;
+    private volatile boolean isZoomed;
 
     private Window target;
     private LWWindowPeer peer;
@@ -506,7 +507,7 @@
 
     private boolean isMaximized() {
         return undecorated ? this.normalBounds != null
-                : CWrapper.NSWindow.isZoomed(getNSWindowPtr());
+                : isZoomed;
     }
 
     private void maximize() {
@@ -974,6 +975,7 @@
 
     protected void deliverMoveResizeEvent(int x, int y, int width, int height,
                                         boolean byUser) {
+        isZoomed = CWrapper.NSWindow.isZoomed(getNSWindowPtr());
         checkZoom();
 
         final Rectangle oldB = nativeBounds;
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CPrinterJob.m	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CPrinterJob.m	Fri Apr 28 18:10:28 2017 +0100
@@ -376,7 +376,7 @@
     static JNF_MEMBER_CACHE(jm_getMaxPage, sjc_CPrinterJob, "getMaxPageAttrib", "()I");
     static JNF_MEMBER_CACHE(jm_getSelectAttrib, sjc_CPrinterJob, "getSelectAttrib", "()I");
     static JNF_MEMBER_CACHE(jm_getNumberOfPages, jc_Pageable, "getNumberOfPages", "()I");
-    static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormatFromAttributes", "()Ljava/awt/print/PageFormat;");
+    static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormat", "(I)Ljava/awt/print/PageFormat;");
 
     NSMutableDictionary* printingDictionary = [dst dictionary];
 
@@ -412,7 +412,7 @@
     [printingDictionary setObject:[NSNumber numberWithInteger:fromPage] forKey:NSPrintFirstPage];
     [printingDictionary setObject:[NSNumber numberWithInteger:toPage] forKey:NSPrintLastPage];
 
-    jobject page = JNFCallObjectMethod(env, srcPrinterJob, jm_getPageFormat); 
+    jobject page = JNFCallObjectMethod(env, srcPrinterJob, jm_getPageFormat, (jint)0);
     if (page != NULL) {
         javaPageFormatToNSPrintInfo(env, NULL, page, dst);
     }
--- a/jdk/src/java.desktop/share/classes/com/sun/awt/AWTUtilities.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/awt/AWTUtilities.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,6 +27,8 @@
 
 import java.awt.*;
 
+import javax.swing.JRootPane;
+
 import sun.awt.AWTAccessor;
 import sun.awt.SunToolkit;
 
@@ -323,7 +325,7 @@
      * is thrown.
      * <p>If the window is a {@code Frame} or a {@code Dialog}, the window must
      * be undecorated prior to enabling the per-pixel translucency effect (see
-     * {@link Frame#setUndecorated()} and/or {@link Dialog#setUndecorated()}).
+     * {@link Frame#setUndecorated} and/or {@link Dialog#setUndecorated}).
      * If the window becomes decorated through a subsequent call to the
      * corresponding {@code setUndecorated()} method, the per-pixel
      * translucency effect will be disabled and the opaque property reset to
@@ -431,7 +433,7 @@
      * </ul>
      * <p>
      * The most common example when the 'mixing-cutout' shape is needed is a
-     * glass pane component. The {@link JRootPane#setGlassPane()} method
+     * glass pane component. The {@link JRootPane#setGlassPane} method
      * automatically sets the <i>empty-shape</i> as the 'mixing-cutout' shape
      * for the given glass pane component.  If a developer needs some other
      * 'mixing-cutout' shape for the glass pane (which is rare), this must be
--- a/jdk/src/java.desktop/share/classes/com/sun/awt/SecurityWarning.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/awt/SecurityWarning.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -59,7 +59,7 @@
      *
      * The returned value is not valid until the peer has been created. Before
      * invoking this method a developer must call the {@link Window#pack()},
-     * {@link Window#setVisible()}, or some other method that creates the peer.
+     * {@link Window#setVisible}, or some other method that creates the peer.
      *
      * @param window the window to get the security warning size for
      *
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/PaletteBuilder.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/PaletteBuilder.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -84,10 +84,8 @@
      * is unable to create approximation of {@code src}
      * and {@code canCreatePalette} returns {@code false}.
      *
-     * @see createIndexColorModel
-     *
-     * @see canCreatePalette
-     *
+     * @see #createIndexColorModel
+     * @see #canCreatePalette
      */
     public static RenderedImage createIndexedImage(RenderedImage src) {
         PaletteBuilder pb = new PaletteBuilder(src);
@@ -107,10 +105,8 @@
      * is unable to create approximation of {@code img}
      * and {@code canCreatePalette} returns {@code false}.
      *
-     * @see createIndexedImage
-     *
-     * @see canCreatePalette
-     *
+     * @see #createIndexedImage
+     * @see #canCreatePalette
      */
     public static IndexColorModel createIndexColorModel(RenderedImage img) {
         PaletteBuilder pb = new PaletteBuilder(img);
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/SingleTileRenderedImage.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/SingleTileRenderedImage.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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 @@
      * and a ColorModel.
      *
      * @param ras A Raster that will define tile (0, 0) of the image.
-     * @param cm A ColorModel that will serve as the image's
+     * @param colorModel A ColorModel that will serve as the image's
      *           ColorModel.
      */
     public SingleTileRenderedImage(Raster ras, ColorModel colorModel) {
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/gif/GIFImageWriter.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/gif/GIFImageWriter.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -729,7 +729,8 @@
     /**
      * Writes any extension blocks, the Image Descriptor, and the image data
      *
-     * @param iioimage The image and image metadata.
+     * @param image The image.
+     * @param imageMetadata The image metadata.
      * @param param The write parameters.
      * @param globalColorTable The Global Color Table.
      * @param sourceBounds The source region.
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -99,7 +99,7 @@
      * of the list if it is present, and any JFXX or APP2ICC marker
      * segments are subordinate to the JFIF marker segment.  This
      * list is package visible so that the writer can access it.
-     * @see #MarkerSegment
+     * @see MarkerSegment
      */
     List<MarkerSegment> markerSequence = new ArrayList<>();
 
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java	Fri Apr 28 18:10:28 2017 +0100
@@ -74,13 +74,13 @@
 
     /**
      * ImageWriteParam for JPEG writer.
-     * May be initialized by {@link #initJPEGWriter()}.
+     * May be initialized by {@link #initJPEGWriter}.
      */
     protected JPEGImageWriteParam JPEGParam = null;
 
     /**
      * The JPEG writer.
-     * May be initialized by {@link #initJPEGWriter()}.
+     * May be initialized by {@link #initJPEGWriter}.
      */
     protected ImageWriter JPEGWriter = null;
 
@@ -95,7 +95,7 @@
      * Stream metadata equivalent to a tables-only stream such as in
      * the {@code JPEGTables}. Default value is {@code null}.
      * This should be set by any subclass which sets
-     * {@link writeAbbreviatedStream} to {@code true}.
+     * {@link #writeAbbreviatedStream} to {@code true}.
      */
     protected IIOMetadata JPEGStreamMetadata = null;
 
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1322,7 +1322,7 @@
      * Sets the index of the planar configuration band to be decoded. This value
      * is ignored for chunky (interleaved) images.
      *
-     * @param the index of the planar band to decode
+     * @param planarBand the index of the planar band to decode
      */
     public void setPlanarBand(int planarBand) { this.planarBand = planarBand; }
 
@@ -2069,7 +2069,7 @@
      * <p> The default implementation calls {@code decodeRaw(byte[] b,
      * ...)} and copies the resulting data into {@code f}.
      *
-     * @param f a {@code double} array to be written.
+     * @param d a {@code double} array to be written.
      * @param dstOffset the starting offset in {@code f} to be
      * written.
      * @param bitsPerPixel the number of bits for each pixel.
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/wbmp/WBMPImageWriter.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/wbmp/WBMPImageWriter.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -58,8 +58,6 @@
  *
  * The encoding process may clip, subsample using the parameters
  * specified in the {@code ImageWriteParam}.
- *
- * @see com.sun.media.imageio.plugins.WBMPImageWriteParam
  */
 public class WBMPImageWriter extends ImageWriter {
     /** The output stream to write into */
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKColorType.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKColorType.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -138,9 +138,9 @@
      * arguments to scale.
      *
      * @param color Color to alter
-     * @param hFactory Amount to scale the hue
+     * @param hFactor Amount to scale the hue
      * @param lFactor Amount to scale the lightness
-     * @param sFactory Amount to sacle saturation
+     * @param sFactor Amount to sacle saturation
      * @return newly created color
      */
     static Color adjustColor(Color color, float hFactor, float lFactor,
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -82,7 +82,7 @@
      * render the text as html nor will it offset by the insets of the
      * component.
      *
-     * @param ss SynthContext
+     * @param context SynthContext
      * @param g Graphics used to render string in.
      * @param text Text to render
      * @param bounds Bounds of the text to be drawn.
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -319,7 +319,7 @@
      * insets will be placed in it, otherwise a new Insets object will be
      * created and returned.
      *
-     * @param context SynthContext identifying requestor
+     * @param state SynthContext identifying requestor
      * @param insets Where to place Insets
      * @return Insets.
      */
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -89,7 +89,6 @@
       * <b>drawStringInRect()</b> does not clip to the rectangle, but instead
       * uses this rectangle and the desired justification to compute the point
       * at which to begin drawing the text.
-      * @see #drawString
       */
     public static void drawStringInRect(Graphics g, String aString, int x, int y,
                                  int width, int height, int justification) {
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -127,7 +127,7 @@
      *
      * @param part a <code>Part</code>
      * @param state a <code>String</code>
-     * @param attributeKey a <code>String</code>
+     * @param prop a <code>String</code>
      * @return a <code>String</code> or null if key is not found
      *    in the current style
      *
@@ -172,7 +172,6 @@
 
     /** Get a named <code>Dimension</code> value from the current style
      *
-     * @param key a <code>String</code>
      * @return a <code>Dimension</code> or null if key is not found
      *    in the current style
      *
@@ -189,7 +188,6 @@
     /** Get a named <code>Point</code> (e.g. a location or an offset) value
      *  from the current style
      *
-     * @param key a <code>String</code>
      * @return a <code>Point</code> or null if key is not found
      *    in the current style
      *
@@ -205,7 +203,6 @@
 
     /** Get a named <code>Insets</code> value from the current style
      *
-     * @param key a <code>String</code>
      * @return an <code>Insets</code> object or null if key is not found
      *    in the current style
      *
@@ -223,7 +220,6 @@
 
     /** Get a named <code>Color</code> value from the current style
      *
-     * @param part a <code>Part</code>
      * @return a <code>Color</code> or null if key is not found
      *    in the current style
      */
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -90,7 +90,7 @@
 
     /**
      * Constructs a new AbstractMixer.
-     * @param mixer the mixer with which this line is associated
+     * @param mixerInfo the mixer with which this line is associated
      * @param controls set of supported controls
      */
     protected AbstractMixer(Mixer.Info mixerInfo,
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,6 +27,7 @@
 
 import java.util.Map;
 
+import javax.sound.midi.MidiSystem;
 import javax.sound.midi.MidiUnavailableException;
 import javax.sound.midi.Synthesizer;
 import javax.sound.sampled.AudioFormat;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -163,7 +163,6 @@
      * rllong
      * Protected helper method to read 64 bits and changing the order of
      * each bytes.
-     * @param DataInputStream
      * @return 32 bits swapped value.
      * @exception IOException
      */
@@ -187,7 +186,6 @@
     /**
      * big2little
      * Protected helper method to swap the order of bytes in a 32 bit int
-     * @param int
      * @return 32 bits swapped value
      */
     final int big2little(int i) {
@@ -207,7 +205,6 @@
     /**
      * rlshort
      * Protected helper method to read 16 bits value. Swap high with low byte.
-     * @param DataInputStream
      * @return the swapped value.
      * @exception IOException
      */
@@ -229,7 +226,6 @@
     /**
      * big2little
      * Protected helper method to swap the order of bytes in a 16 bit short
-     * @param int
      * @return 16 bits swapped value
      */
     final short big2littleShort(short i) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -69,7 +69,6 @@
      * rllong
      * Protected helper method to read 64 bits and changing the order of
      * each bytes.
-     * @param DataInputStream
      * @return 32 bits swapped value.
      * @exception IOException
      */
@@ -93,7 +92,6 @@
     /**
      * big2little
      * Protected helper method to swap the order of bytes in a 32 bit int
-     * @param int
      * @return 32 bits swapped value
      */
     final int big2little(int i) {
@@ -113,7 +111,6 @@
     /**
      * rlshort
      * Protected helper method to read 16 bits value. Swap high with low byte.
-     * @param DataInputStream
      * @return the swapped value.
      * @exception IOException
      */
@@ -135,7 +132,6 @@
     /**
      * big2little
      * Protected helper method to swap the order of bytes in a 16 bit short
-     * @param int
      * @return 16 bits swapped value
      */
     final short big2littleShort(short i) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -54,7 +54,7 @@
 
     /**
      * Swaps bytes.
-     * @throws ArrayOutOfBoundsException if len is not a multiple of 2.
+     * @throws ArrayIndexOutOfBoundsException if len is not a multiple of 2.
      */
     static void getByteSwapped(byte[] b, int off, int len) {
 
--- a/jdk/src/java.desktop/share/classes/java/awt/Component.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/Component.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -58,6 +58,7 @@
 import javax.accessibility.*;
 import java.applet.Applet;
 import javax.swing.JComponent;
+import javax.swing.JRootPane;
 
 import sun.awt.ComponentFactory;
 import sun.security.action.GetPropertyAction;
@@ -6232,7 +6233,7 @@
     /**
      * Indicates whether a class or its superclasses override coalesceEvents.
      * Must be called with lock on coalesceMap and privileged.
-     * @see checkCoalescing
+     * @see #checkCoalescing
      */
     private static boolean isCoalesceEventsOverriden(Class<?> clazz) {
         assert Thread.holdsLock(coalesceMap);
@@ -10406,7 +10407,7 @@
      * </ul>
      * <p>
      * The most common example when the 'mixing-cutout' shape is needed is a
-     * glass pane component. The {@link JRootPane#setGlassPane()} method
+     * glass pane component. The {@link JRootPane#setGlassPane} method
      * automatically sets the <i>empty-shape</i> as the 'mixing-cutout' shape
      * for the given glass pane component.  If a developer needs some other
      * 'mixing-cutout' shape for the glass pane (which is rare), this must be
--- a/jdk/src/java.desktop/share/classes/java/awt/Desktop.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/Desktop.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,9 +25,12 @@
 
 package java.awt;
 
+import java.awt.desktop.AboutEvent;
 import java.awt.desktop.AboutHandler;
 import java.awt.desktop.OpenFilesHandler;
+import java.awt.desktop.OpenURIEvent;
 import java.awt.desktop.OpenURIHandler;
+import java.awt.desktop.PreferencesEvent;
 import java.awt.desktop.PreferencesHandler;
 import java.awt.desktop.PrintFilesHandler;
 import java.awt.desktop.QuitHandler;
@@ -42,8 +45,9 @@
 import java.net.URISyntaxException;
 import java.net.URL;
 
+import javax.swing.JMenuBar;
+
 import sun.awt.SunToolkit;
-import javax.swing.JMenuBar;
 import sun.security.util.SecurityConstants;
 
 /**
--- a/jdk/src/java.desktop/share/classes/java/awt/Font.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/Font.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,6 +41,7 @@
 import java.security.PrivilegedExceptionAction;
 import java.text.AttributedCharacterIterator.Attribute;
 import java.text.CharacterIterator;
+import java.util.EventListener;
 import java.util.Hashtable;
 import java.util.Locale;
 import java.util.Map;
--- a/jdk/src/java.desktop/share/classes/java/awt/Menu.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/Menu.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,9 @@
 import java.awt.peer.MenuPeer;
 import java.io.IOException;
 import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Enumeration;
+import java.util.EventListener;
 import java.util.Vector;
 
 import javax.accessibility.Accessible;
--- a/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,9 @@
 import java.awt.peer.MenuBarPeer;
 import java.io.IOException;
 import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.util.Enumeration;
+import java.util.EventListener;
 import java.util.Vector;
 
 import javax.accessibility.Accessible;
--- a/jdk/src/java.desktop/share/classes/java/awt/PaintContext.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/PaintContext.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,10 @@
 
 package java.awt;
 
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.ColorModel;
 import java.awt.image.Raster;
-import java.awt.image.ColorModel;
 
 /**
  * The {@code PaintContext} interface defines the encapsulated
--- a/jdk/src/java.desktop/share/classes/java/awt/SystemTray.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/SystemTray.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,15 +25,17 @@
 
 package java.awt;
 
-import java.util.Vector;
+import java.awt.event.ActionListener;
 import java.awt.peer.SystemTrayPeer;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
-import sun.awt.AppContext;
-import sun.awt.SunToolkit;
-import sun.awt.HeadlessToolkit;
+import java.util.Vector;
+
 import sun.awt.AWTAccessor;
 import sun.awt.AWTPermissions;
+import sun.awt.AppContext;
+import sun.awt.HeadlessToolkit;
+import sun.awt.SunToolkit;
 
 /**
  * The {@code SystemTray} class represents the system tray for a
--- a/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -451,7 +451,7 @@
      *
      * @param s the error message
      * @param e the original exception
-     * @throws the new AWTError including the cause (the original exception)
+     * @throws AWTError the new AWTError including the cause (the original exception)
      */
     private static void newAWTError(Throwable e, String s) {
         AWTError newAWTError = new AWTError(s);
--- a/jdk/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1081,7 +1081,7 @@
      * when loading this profile.
      * If deferring is enabled, then the deferred activation
      * code will take care of access privileges.
-     * @see activateDeferredProfile()
+     * @see #activateDeferredProfile()
      */
     static ICC_Profile getDeferredInstance(ProfileDeferralInfo pdi) {
         if (!ProfileDeferralMgr.deferring) {
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/FilesEvent.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/FilesEvent.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,7 +42,6 @@
     /**
      * Constructs a {@code FilesEvent}
      * @param files files
-     * @param searchTerm searchTerm
      */
     FilesEvent(final List<File> files) {
         this.files = files;
--- a/jdk/src/java.desktop/share/classes/java/awt/font/CharArrayIterator.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/font/CharArrayIterator.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -47,7 +47,7 @@
      * Sets the position to getBeginIndex() and returns the character at that
      * position.
      * @return the first character in the text, or DONE if the text is empty
-     * @see getBeginIndex
+     * @see #getBeginIndex
      */
     public char first() {
 
@@ -59,7 +59,7 @@
      * Sets the position to getEndIndex()-1 (getEndIndex() if the text is empty)
      * and returns the character at that position.
      * @return the last character in the text, or DONE if the text is empty
-     * @see getEndIndex
+     * @see #getEndIndex
      */
     public char last() {
 
@@ -76,7 +76,7 @@
      * Gets the character at the current position (as returned by getIndex()).
      * @return the character at the current position or DONE if the current
      * position is off the end of the text.
-     * @see getIndex
+     * @see #getIndex
      */
     public char current() {
 
--- a/jdk/src/java.desktop/share/classes/java/awt/peer/DesktopPeer.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/peer/DesktopPeer.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,18 +24,21 @@
  */
 package java.awt.peer;
 
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
 import java.awt.Desktop.Action;
 import java.awt.desktop.AboutHandler;
-import java.awt.desktop.SystemEventListener;
 import java.awt.desktop.OpenFilesHandler;
+import java.awt.desktop.OpenURIEvent;
 import java.awt.desktop.OpenURIHandler;
+import java.awt.desktop.PreferencesEvent;
 import java.awt.desktop.PreferencesHandler;
 import java.awt.desktop.PrintFilesHandler;
 import java.awt.desktop.QuitHandler;
 import java.awt.desktop.QuitStrategy;
+import java.awt.desktop.SystemEventListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
 import javax.swing.JMenuBar;
 
 /**
@@ -162,7 +165,7 @@
      * the default behavior
      *
      * @param preferencesHandler the handler to respond to the
-     * {@link java.awt.desktop.PreferencesHandler#handlePreferences(java.awt.PreferencesEvent) }
+     * {@link java.awt.desktop.PreferencesHandler#handlePreferences(PreferencesEvent) }
      */
     default void setPreferencesHandler(final PreferencesHandler preferencesHandler) {
     }
@@ -191,7 +194,7 @@
      * open a URL.
      *
      * Setting the handler to {@code null} causes all
-     * {@link OpenURIHandler#openURI(AppEvent.OpenURIEvent)} requests to be
+     * {@link OpenURIHandler#openURI(OpenURIEvent)} requests to be
      * enqueued until another handler is set.
      *
      * @param openURIHandler handler
--- a/jdk/src/java.desktop/share/classes/java/awt/print/PrinterJob.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/awt/print/PrinterJob.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,12 +27,12 @@
 
 import java.awt.AWTError;
 import java.awt.HeadlessException;
-import java.util.Enumeration;
 
 import javax.print.DocFlavor;
 import javax.print.PrintService;
 import javax.print.PrintServiceLookup;
 import javax.print.StreamPrintServiceFactory;
+import javax.print.attribute.AttributeSet;
 import javax.print.attribute.PrintRequestAttributeSet;
 import javax.print.attribute.standard.Media;
 import javax.print.attribute.standard.MediaPrintableArea;
@@ -40,8 +40,6 @@
 import javax.print.attribute.standard.MediaSizeName;
 import javax.print.attribute.standard.OrientationRequested;
 
-import sun.security.action.GetPropertyAction;
-
 /**
  * The {@code PrinterJob} class is the principal class that controls
  * printing. An application calls methods in this class to set up a job,
--- a/jdk/src/java.desktop/share/classes/java/beans/ChangeListenerMap.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/java/beans/ChangeListenerMap.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,8 +39,8 @@
  * for the {@link PropertyChangeSupport PropertyChangeSupport} class
  * and the {@link VetoableChangeSupport VetoableChangeSupport} class.
  *
- * @see PropertyChangeListenerMap
- * @see VetoableChangeListenerMap
+ * @see PropertyChangeSupport.PropertyChangeListenerMap
+ * @see VetoableChangeSupport.VetoableChangeListenerMap
  *
  * @author Sergey A. Malenkov
  */
--- a/jdk/src/java.desktop/share/classes/javax/accessibility/AccessibleContext.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/accessibility/AccessibleContext.java	Fri Apr 28 18:10:28 2017 +0100
@@ -413,7 +413,7 @@
      *
      * @see #addPropertyChangeListener
      * @see #removePropertyChangeListener
-     * @see #firePropertyChangeListener
+     * @see #firePropertyChange
      */
     private PropertyChangeSupport accessibleChangeSupport = null;
 
--- a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MediaPrintableArea.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MediaPrintableArea.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,7 +24,9 @@
  */
 package javax.print.attribute.standard;
 
+import javax.print.DocFlavor;
 import javax.print.attribute.Attribute;
+import javax.print.attribute.AttributeSet;
 import javax.print.attribute.DocAttribute;
 import javax.print.attribute.PrintJobAttribute;
 import javax.print.attribute.PrintRequestAttribute;
--- a/jdk/src/java.desktop/share/classes/javax/swing/Action.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/Action.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -384,8 +384,8 @@
      * @param sender the object to check, can be null
      * @return {@code true} if the action should be performed with the sender
      *         object, must be false if the action is disabled.
-     * @see isEnabled
-     * @see setEnabled
+     * @see #isEnabled
+     * @see #setEnabled
      */
     default boolean accept(Object sender) {
         return isEnabled();
--- a/jdk/src/java.desktop/share/classes/javax/swing/ActionPropertyChangeListener.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/ActionPropertyChangeListener.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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 @@
  * a strong reference will be held to the containing class, which in most
  * cases defeats the purpose of this class.
  *
- * @param T the type of JComponent the underlying Action is attached to
+ * @param <T> the type of JComponent the underlying Action is attached to
  *
  * @author Georges Saab
  * @see AbstractButton
--- a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java	Fri Apr 28 18:10:28 2017 +0100
@@ -3733,7 +3733,11 @@
          * Fire PropertyChange listener, if one is registered,
          * when focus events happen
          * @since 1.3
+         * @deprecated This class is no longer used or needed.
+         * {@code java.awt.Component.AccessibleAWTComponent} provides
+         * the same functionality and it is handled in {@Component}.
          */
+        @Deprecated
         protected class AccessibleFocusHandler implements FocusListener {
            public void focusGained(FocusEvent event) {
                if (accessibleContext != null) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/JSpinner.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JSpinner.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1202,7 +1202,7 @@
          * on the new <code>JFormattedTextField</code>.
          *
          * @param spinner the spinner whose model <code>this</code> editor will monitor
-         * @param decimalFormatPattern the initial pattern for the
+         * @param format the initial pattern for the
          *     <code>DecimalFormat</code> object that's used to display
          *     and parse the value of the text field.
          * @exception IllegalArgumentException if the spinners model is not
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1783,7 +1783,7 @@
          *
          * @param axis may be either X_AXIS or Y_AXIS
          * @param len specifies where a break is desired in the span
-         * @param the current allocation of the view
+         * @param a the current allocation of the view
          * @return the fragment of the view that represents the given span
          *   if the view can be broken, otherwise null
          */
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/LazyActionMap.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/LazyActionMap.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -73,7 +73,6 @@
      * <p>
      * This should be used if the ActionMap can be shared.
      *
-     * @param c JComponent to install the ActionMap on.
      * @param loaderClass Class object that gets loadActionMap invoked
      *                    on.
      * @param defaultsKey Key to use to defaults table to check for
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFontDesktopProperty.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFontDesktopProperty.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -65,8 +65,6 @@
      * Creates a MetalFontDesktopProperty.
      *
      * @param key Key used in looking up desktop value.
-     * @param toolkit Toolkit used to fetch property from, can be null
-     *        in which default will be used.
      * @param type Type of font being used, corresponds to MetalTheme font
      *        type.
      */
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalRootPaneUI.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalRootPaneUI.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -338,7 +338,7 @@
      * and sets this value; the default is null, implying a native operating
      * system window title pane.
      *
-     * @param content the <code>JComponent</code> to use for the window title pane.
+     * @param titlePane the <code>JComponent</code> to use for the window title pane.
      */
     private void setTitlePane(JRootPane root, JComponent titlePane) {
         JLayeredPane layeredPane = root.getLayeredPane();
@@ -434,7 +434,7 @@
         /**
          * Returns the amount of space the layout would like to have.
          *
-         * @param the Container for which this layout manager is being used
+         * @param parent the Container for which this layout manager is being used
          * @return a Dimension object containing the layout's preferred size
          */
         public Dimension preferredLayoutSize(Container parent) {
@@ -486,7 +486,7 @@
         /**
          * Returns the minimum amount of space the layout needs.
          *
-         * @param the Container for which this layout manager is being used
+         * @param parent the Container for which this layout manager is being used
          * @return a Dimension object containing the layout's minimum size
          */
         public Dimension minimumLayoutSize(Container parent) {
@@ -537,7 +537,7 @@
         /**
          * Returns the maximum amount of space the layout can use.
          *
-         * @param the Container for which this layout manager is being used
+         * @param target the Container for which this layout manager is being used
          * @return a Dimension object containing the layout's maximum size
          */
         public Dimension maximumLayoutSize(Container target) {
@@ -601,7 +601,7 @@
          * Instructs the layout manager to perform the layout for the specified
          * container.
          *
-         * @param the Container for which this layout manager is being used
+         * @param parent the Container for which this layout manager is being used
          */
         public void layoutContainer(Container parent) {
             JRootPane root = (JRootPane) parent;
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -934,9 +934,7 @@
      * <p>The actual code path for determining the proper state is the same as
      * in Synth.</p>
      *
-     * @param ctx
      * @param lastState a 1 element array, allowing me to do pass-by-reference.
-     * @return
      */
     private RuntimeState getNextState(RuntimeState[] states,
                                       int[] lastState,
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -2179,9 +2179,6 @@
 
         /**
          * Create this action with the appropriate identifier.
-         * @param nm  the name of the action, Action.NAME.
-         * @param select whether to extend the selection when
-         *  changing the caret position.
          */
         SelectWordAction() {
             super(selectWordAction);
@@ -2209,9 +2206,6 @@
 
         /**
          * Create this action with the appropriate identifier.
-         * @param nm  the name of the action, Action.NAME.
-         * @param select whether to extend the selection when
-         *  changing the caret position.
          */
         SelectLineAction() {
             super(selectLineAction);
@@ -2239,9 +2233,6 @@
 
         /**
          * Create this action with the appropriate identifier.
-         * @param nm  the name of the action, Action.NAME.
-         * @param select whether to extend the selection when
-         *  changing the caret position.
          */
         SelectParagraphAction() {
             super(selectParagraphAction);
@@ -2269,9 +2260,6 @@
 
         /**
          * Create this action with the appropriate identifier.
-         * @param nm  the name of the action, Action.NAME.
-         * @param select whether to extend the selection when
-         *  changing the caret position.
          */
         SelectAllAction() {
             super(selectAllAction);
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultStyledDocument.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultStyledDocument.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1797,8 +1797,6 @@
         /**
          * Pushes a new element onto the stack that represents
          * the current path.
-         * @param record Whether or not the push should be
-         *  recorded as an element change or not.
          * @param isFracture true if pushing on an element that was created
          * as the result of a fracture.
          */
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphPainter1.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphPainter1.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -198,7 +198,7 @@
      * @param v the view
      * @param p0 the location in the model where the
      *  fragment should start its representation >= 0
-     * @param pos the graphic location along the axis that the
+     * @param x the graphic location along the axis that the
      *  broken view would occupy >= 0; this may be useful for
      *  things like tab calculations
      * @param len specifies the distance into the view
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphPainter2.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphPainter2.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -193,7 +193,7 @@
      * @param v the view to find the model location to break at.
      * @param p0 the location in the model where the
      *  fragment should start it's representation >= 0.
-     * @param pos the graphic location along the axis that the
+     * @param x the graphic location along the axis that the
      *  broken view would occupy >= 0.  This may be useful for
      *  things like tab calculations.
      * @param len specifies the distance into the view
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/ParagraphView.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/ParagraphView.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -899,7 +899,6 @@
         /**
          * Range represented by a row in the paragraph is only
          * a subset of the total range of the paragraph element.
-         * @see View#getRange
          */
         public int getStartOffset() {
             int offs = Integer.MAX_VALUE;
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/PlainView.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/PlainView.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -510,8 +510,8 @@
      * Provides a mapping from the view coordinate space to the logical
      * coordinate space of the model.
      *
-     * @param fx the X coordinate &gt;= 0
-     * @param fy the Y coordinate &gt;= 0
+     * @param x the X coordinate &gt;= 0
+     * @param y the Y coordinate &gt;= 0
      * @param a the allocated region to render into
      * @return the location within the model that best represents the
      *  given point in the view &gt;= 0
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/TextLayoutStrategy.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/TextLayoutStrategy.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -88,9 +88,8 @@
      * Gives notification from the document that attributes were changed
      * in a location that this view is responsible for.
      *
-     * @param changes the change information from the associated document
-     * @param a the current allocation of the view
-     * @param f the factory to use to rebuild if the view has children
+     * @param e the change information from the associated document
+     * @param alloc the current allocation of the view inside of the insets.
      * @see View#changedUpdate
      */
     public void changedUpdate(FlowView fv, DocumentEvent e, Rectangle alloc) {
@@ -117,9 +116,9 @@
      * views or view fragments) and follow that with bidi reordering
      * of the unidirectional view fragments.
      *
-     * @param row the row to fill in with views.  This is assumed
+     * @param rowIndex the row to fill in with views.  This is assumed
      *   to be empty on entry.
-     * @param pos  The current position in the children of
+     * @param p0  The current position in the children of
      *   this views element from which to start.
      * @return the position to start the next row
      */
@@ -157,7 +156,7 @@
      * calculated by the LineBreakMeasurer, this is implemented
      * to do nothing.
      *
-     * @param r the row to adjust to the current layout
+     * @param rowIndex the row to adjust to the current layout
      *  span.
      * @param desiredSpan the current layout span >= 0
      * @param x the location r starts at.
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/Utilities.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/Utilities.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1245,7 +1245,7 @@
      *
      * @param v View to query
      * @param pos the position to convert &gt;= 0
-     * @param a the allocated region to render into
+     * @param alloc the allocated region to render into
      * @param direction the direction from the current position that can
      *  be thought of as the arrow keys typically found on a keyboard;
      *  this may be one of the following:
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/CSS.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/CSS.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -948,7 +948,6 @@
      * Returns the size of a font from the passed in string.
      *
      * @param size CSS string describing font size
-     * @param baseFontSize size to use for relative units.
      */
     float getPointSize(String size, StyleSheet ss) {
         int relSize, absSize, diff, index;
@@ -1658,8 +1657,8 @@
      * value, this method returns a CssValue object to associate with the
      * CSS attribute.
      *
-     * @param the CSS.Attribute
-     * @param a String containing the value associated HTML.Attribtue.
+     * @param cssAttr the CSS.Attribute
+     * @param htmlAttrValue a String containing the value associated HTML.Attribute.
      */
     Object getCssValue(CSS.Attribute cssAttr, String htmlAttrValue) {
         CssValue value = (CssValue)valueConvertor.get(cssAttr);
@@ -1670,7 +1669,7 @@
     /**
      * Maps an HTML.Attribute object to its appropriate CSS.Attributes.
      *
-     * @param HTML.Attribute
+     * @param hAttr HTML.Attribute
      * @return CSS.Attribute[]
      */
     private CSS.Attribute[] getCssAttribute(HTML.Attribute hAttr) {
@@ -1685,7 +1684,7 @@
      * based on the tag associated with the attribute and the
      * value of the attribute.
      *
-     * @param AttributeSet containing HTML attributes.
+     * @param tag the AttributeSet containing HTML attributes.
      * @return CSS.Attribute mapping for HTML.Attribute.ALIGN.
      */
     private CSS.Attribute getCssAlignAttribute(HTML.Tag tag,
@@ -1711,7 +1710,7 @@
     /**
      * Fetches the tag associated with the HTML AttributeSet.
      *
-     * @param  AttributeSet containing the HTML attributes.
+     * @param  htmlAttrSet the AttributeSet containing the HTML attributes.
      * @return HTML.Tag
      */
     private HTML.Tag getHTMLTag(AttributeSet htmlAttrSet) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/FormView.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/FormView.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -209,7 +209,7 @@
      * Creates a component for an &lt;INPUT&gt; element based on the
      * value of the "type" attribute.
      *
-     * @param set of attributes associated with the &lt;INPUT&gt; element.
+     * @param attr set of attributes associated with the &lt;INPUT&gt; element.
      * @param model the value of the StyleConstants.ModelAttribute
      * @return the component.
      */
@@ -653,8 +653,6 @@
      * action.
      *
      * @param buffer        the buffer that contains that data to submit
-     * @param targetElement the element that triggered the
-     *                      form submission
      */
     private void getFormData(StringBuilder buffer) {
         Element formE = getFormElement();
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/FrameView.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/FrameView.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -143,8 +143,7 @@
      * contains it is editable. And then proceeds to call
      * the superclass to do the paint().
      *
-     * @param parent View
-     * @see text.ComponentView#paint
+     * @see javax.swing.text.ComponentView#paint
      */
     public void paint(Graphics g, Shape allocation) {
 
@@ -289,8 +288,6 @@
      * firing the event to the outermost JEditorPane, this
      * method also invokes the setPage() method and explicitly
      * replaces the current document with the destination url.
-     *
-     * @param HyperlinkEvent
      */
     public void hyperlinkUpdate(HyperlinkEvent evt) {
 
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/NoFramesView.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/NoFramesView.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2000, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -59,7 +59,7 @@
      * @param g the rendering surface to use
      * @param allocation the allocated region to render into
      * @see #isVisible
-     * @see text.ParagraphView#paint
+     * @see javax.swing.text.ParagraphView#paint
      */
     public void paint(Graphics g, Shape allocation) {
         Container host = getContainer();
@@ -126,7 +126,7 @@
      *           typically the view is told to render into the span
      *           that is returned, although there is no guarantee;
      *           the parent may choose to resize or break the view
-     * @see text.ParagraphView#getPreferredSpan
+     * @see javax.swing.text.ParagraphView#getPreferredSpan
      */
     public float getPreferredSpan(int axis) {
         if (!visible) {
@@ -143,7 +143,7 @@
      * @param axis may be either <code>View.X_AXIS</code> or
      *          <code>View.Y_AXIS</code>
      * @return  the minimum span the view can be rendered into
-     * @see text.ParagraphView#getMinimumSpan
+     * @see javax.swing.text.ParagraphView#getMinimumSpan
      */
     public float getMinimumSpan(int axis) {
         if (!visible) {
@@ -160,7 +160,7 @@
      * @param axis may be either <code>View.X_AXIS</code> or
      *  <code>View.Y_AXIS</code>
      * @return  the maximum span the view can be rendered into
-     * @see text.ParagraphView#getMaximumSpan
+     * @see javax.swing.text.ParagraphView#getMaximumSpan
      */
     public float getMaximumSpan(int axis) {
         if (!visible) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/parser/Parser.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/parser/Parser.java	Fri Apr 28 18:10:28 2017 +0100
@@ -2119,8 +2119,11 @@
             }
 
             /* To account for extra read()'s that happened */
-            for (int j = 0; j < i; j++) {
-                addString(charsToAdd[j]);
+            if (i > 0) {
+                for (int j = 0; j < i; j++) {
+                    addString(charsToAdd[j]);
+                }
+                continue;
             }
             switch (ch) {
             case -1:
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFGenerator.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFGenerator.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -42,12 +42,8 @@
  * <p>Note that this is a lossy conversion since RTF's model of
  * text does not exactly correspond with LightText's.
  *
- * @see LTAttributedText
- * @see LTRTFFilter
- * @see LTTextAcceptor
  * @see java.io.OutputStream
  */
-
 class RTFGenerator extends Object
 {
     /* These dictionaries map Colors, font names, or Style objects
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFParser.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFParser.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -32,11 +32,11 @@
  * and passes a stream of control words, text, and begin/end group
  * indications to its subclass.
  *
- * Normally programmers will only use <b>RTFFilter</b>, a subclass of this class that knows what to
+ * Normally programmers will only use <b>RTFReader</b>, a subclass of this class that knows what to
  * do with the tokens this class parses.
  *
  * @see AbstractFilter
- * @see RTFFilter
+ * @see RTFReader
  */
 abstract class RTFParser extends AbstractFilter
 {
--- a/jdk/src/java.desktop/share/classes/sun/applet/AppletSecurity.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletSecurity.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -109,7 +109,8 @@
     /**
      * get the current (first) instance of an AppletClassLoader on the stack.
      */
-    @SuppressWarnings("deprecation")
+    @SuppressWarnings({"deprecation",
+                       "removal"}) // SecurityManager.currentClassLoader()
     private AppletClassLoader currentAppletClassLoader()
     {
         // try currentClassLoader first
@@ -298,7 +299,8 @@
      * @exception  SecurityException  if the caller does not have
      *             permission to access the AWT event queue.
      */
-    @SuppressWarnings("deprecation")
+    @SuppressWarnings({"deprecation",
+                       "removal"}) //  SecurityManager.checkAwtEventQueueAccess
     public void checkAwtEventQueueAccess() {
         AppContext appContext = AppContext.getAppContext();
         AppletClassLoader appletClassLoader = currentAppletClassLoader();
--- a/jdk/src/java.desktop/share/classes/sun/awt/image/BytePackedRaster.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/sun/awt/image/BytePackedRaster.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,14 +24,16 @@
  */
 
 package sun.awt.image;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.MultiPixelPackedSampleModel;
 import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
 import java.awt.image.RasterFormatException;
 import java.awt.image.SampleModel;
-import java.awt.image.MultiPixelPackedSampleModel;
-import java.awt.image.DataBufferByte;
-import java.awt.Rectangle;
-import java.awt.Point;
+import java.awt.image.WritableRaster;
 
 /**
  * This class is useful for describing 1, 2, or 4 bit image data
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -153,11 +153,11 @@
      * The specified {@code src} {@link Shape} is widened according
      * to the parameters specified by the {@link BasicStroke} object.
      * Adjustments are made to the path as appropriate for the
-     * {@link VALUE_STROKE_NORMALIZE} hint if the {@code normalize}
-     * boolean parameter is true.
+     * {@link java.awt.RenderingHints#VALUE_STROKE_NORMALIZE} hint if the
+     * {@code normalize} boolean parameter is true.
      * Adjustments are made to the path as appropriate for the
-     * {@link VALUE_ANTIALIAS_ON} hint if the {@code antialias}
-     * boolean parameter is true.
+     * {@link java.awt.RenderingHints#VALUE_ANTIALIAS_ON} hint if the
+     * {@code antialias} boolean parameter is true.
      * <p>
      * The geometry of the widened path is forwarded to the indicated
      * {@link PathConsumer2D} object as it is calculated.
--- a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java	Fri Apr 28 18:10:28 2017 +0100
@@ -886,14 +886,6 @@
         }
    }
 
-   protected PageFormat getPageFormatFromAttributes() {
-       if (attributes == null || attributes.isEmpty()) {
-            return null;
-        }
-        return attributeToPageFormat(getPrintService(), this.attributes);
-   }
-
-
    /**
      * Presents the user a dialog for changing properties of the
      * print job interactively.
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Window.cpp	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Window.cpp	Fri Apr 28 18:10:28 2017 +0100
@@ -239,7 +239,9 @@
 
     fullScreenExclusiveModeState = FALSE;
     m_winSizeMove = FALSE;
-    prevScaleRec = { -1, -1, -1 };
+    prevScaleRec.screen = -1;
+    prevScaleRec.scaleX = -1.0f;
+    prevScaleRec.scaleY = -1.0f;
 }
 
 AwtWindow::~AwtWindow()
--- a/jdk/src/java.se.ee/share/classes/module-info.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/java.se.ee/share/classes/module-info.java	Fri Apr 28 18:10:28 2017 +0100
@@ -32,7 +32,8 @@
  * @moduleGraph
  * @since 9
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // java.corba and other modules
 module java.se.ee {
 
     requires transitive java.se;
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Exchange.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Exchange.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
 package jdk.incubator.http;
 
 import java.io.IOException;
+import java.io.UncheckedIOException;
 import java.net.InetSocketAddress;
 import java.net.ProxySelector;
 import java.net.SocketPermission;
@@ -64,6 +65,9 @@
     final HttpRequestImpl request;
     final HttpClientImpl client;
     volatile ExchangeImpl<T> exchImpl;
+    // used to record possible cancellation raised before the exchImpl
+    // has been established.
+    private volatile IOException failed;
     final List<SocketPermission> permissions = new LinkedList<>();
     final AccessControlContext acc;
     final MultiExchange<?,T> multi;
@@ -143,14 +147,80 @@
     }
 
     public void cancel() {
+        // cancel can be called concurrently before or at the same time
+        // that the exchange impl is being established.
+        // In that case we won't be able to propagate the cancellation
+        // right away
         if (exchImpl != null) {
             exchImpl.cancel();
+        } else {
+            // no impl - can't cancel impl yet.
+            // call cancel(IOException) instead which takes care
+            // of race conditions between impl/cancel.
+            cancel(new IOException("Request cancelled"));
         }
     }
 
     public void cancel(IOException cause) {
-        if (exchImpl != null) {
-            exchImpl.cancel(cause);
+        // If the impl is non null, propagate the exception right away.
+        // Otherwise record it so that it can be propagated once the
+        // exchange impl has been established.
+        ExchangeImpl<?> impl = exchImpl;
+        if (impl != null) {
+            // propagate the exception to the impl
+            impl.cancel(cause);
+        } else {
+            try {
+                // no impl yet. record the exception
+                failed = cause;
+                // now call checkCancelled to recheck the impl.
+                // if the failed state is set and the impl is not null, reset
+                // the failed state and propagate the exception to the impl.
+                checkCancelled(false);
+            } catch (IOException x) {
+                // should not happen - we passed 'false' above
+                throw new UncheckedIOException(x);
+            }
+        }
+    }
+
+    // This method will raise an exception if one was reported and if
+    // it is possible to do so. If the exception can be raised, then
+    // the failed state will be reset. Otherwise, the failed state
+    // will persist until the exception can be raised and the failed state
+    // can be cleared.
+    // Takes care of possible race conditions.
+    private void checkCancelled(boolean throwIfNoImpl) throws IOException {
+        ExchangeImpl<?> impl = null;
+        IOException cause = null;
+        if (failed != null) {
+            synchronized(this) {
+                cause = failed;
+                impl = exchImpl;
+                if (throwIfNoImpl || impl != null) {
+                    // The exception will be raised by one of the two methods
+                    // below: reset the failed state.
+                    failed = null;
+                }
+            }
+        }
+        if (cause == null) return;
+        if (impl != null) {
+            // The exception is raised by propagating it to the impl.
+            impl.cancel(cause);
+        } else if (throwIfNoImpl) {
+            // The exception is raised by throwing it immediately
+            throw cause;
+        } else {
+            Log.logTrace("Exchange: request [{0}/timeout={1}ms] no impl is set."
+                         + "\n\tCan''t cancel yet with {2}",
+                         request.uri(),
+                         request.duration() == null ? -1 :
+                         // calling duration.toMillis() can throw an exception.
+                         // this is just debugging, we don't care if it overflows.
+                         (request.duration().getSeconds() * 1000
+                          + request.duration().getNano() / 1000000),
+                         cause);
         }
     }
 
@@ -191,10 +261,26 @@
         }
     }
 
+    // get/set the exchange impl, solving race condition issues with
+    // potential concurrent calls to cancel() or cancel(IOException)
+    private void establishExchange(HttpConnection connection)
+        throws IOException, InterruptedException
+    {
+        // check if we have been cancelled first.
+        checkCancelled(true);
+        // not yet cancelled: create/get a new impl
+        exchImpl = ExchangeImpl.get(this, connection);
+        // recheck for cancelled, in case of race conditions
+        checkCancelled(true);
+        // now we're good to go. because exchImpl is no longer null
+        // cancel() will be able to propagate directly to the impl
+        // after this point.
+    }
+
     private Response responseImpl0(HttpConnection connection)
         throws IOException, InterruptedException
     {
-        exchImpl = ExchangeImpl.get(this, connection);
+        establishExchange(connection);
         exchImpl.setClientForRequest(requestProcessor);
         if (request.expectContinue()) {
             Log.logTrace("Sending Expect: 100-Continue");
@@ -257,7 +343,7 @@
 
     CompletableFuture<Response> responseAsyncImpl0(HttpConnection connection) {
         try {
-            exchImpl = ExchangeImpl.get(this, connection);
+            establishExchange(connection);
         } catch (IOException | InterruptedException e) {
             return MinimalFuture.failedFuture(e);
         }
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Exchange.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Exchange.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,9 +46,12 @@
 class Http1Exchange<T> extends ExchangeImpl<T> {
 
     final HttpRequestImpl request;        // main request
-    final List<CompletableFuture<?>> operations; // used for cancel
+    private final List<CompletableFuture<?>> operations; // used for cancel
     final Http1Request requestAction;
-    volatile Http1Response<T> response;
+    private volatile Http1Response<T> response;
+    // use to record possible cancellation raised before any operation
+    // has been initiated.
+    private IOException failed;
     final HttpConnection connection;
     final HttpClientImpl client;
     final Executor executor;
@@ -70,7 +73,7 @@
         this.request = exchange.request();
         this.client = exchange.client();
         this.executor = exchange.executor();
-        this.operations = Collections.synchronizedList(new LinkedList<>());
+        this.operations = new LinkedList<>();
         this.buffer = exchange.getBuffer();
         if (connection != null) {
             this.connection = connection;
@@ -186,9 +189,22 @@
         }
         connection.close();
         int count = 0;
-        for (CompletableFuture<?> cf : operations) {
-            cf.completeExceptionally(cause);
-            count++;
+        if (operations.isEmpty()) {
+            failed = cause;
+            Log.logTrace("Http1Exchange: request [{0}/timeout={1}ms] no pending operation."
+                         + "\n\tCan''t cancel yet with {2}",
+                         request.uri(),
+                         request.duration() == null ? -1 :
+                         // calling duration.toMillis() can throw an exception.
+                         // this is just debugging, we don't care if it overflows.
+                         (request.duration().getSeconds() * 1000
+                          + request.duration().getNano() / 1000000),
+                         cause);
+        } else {
+            for (CompletableFuture<?> cf : operations) {
+                cf.completeExceptionally(cause);
+                count++;
+            }
         }
         Log.logError("Http1Exchange.cancel: count=" + count);
     }
@@ -206,8 +222,24 @@
         CompletableFuture<Response> cf =
             connection.whenReceivingResponse()
                       .thenCompose((v) -> getResponseAsyncImpl(executor));
-
-        operations.add(cf);
+        IOException cause;
+        synchronized(this) {
+            operations.add(cf);
+            cause = failed;
+            failed = null;
+        }
+        if (cause != null) {
+            Log.logTrace("Http1Exchange: request [{0}/timeout={1}ms]"
+                         + "\n\tCompleting exceptionally with {2}\n",
+                         request.uri(),
+                         request.duration() == null ? -1 :
+                         // calling duration.toMillis() can throw an exception.
+                         // this is just debugging, we don't care if it overflows.
+                         (request.duration().getSeconds() * 1000
+                          + request.duration().getNano() / 1000000),
+                         cause);
+            cf.completeExceptionally(cause);
+        }
         return cf;
     }
 }
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpClientImpl.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpClientImpl.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -582,12 +582,14 @@
     // Timers are implemented through timed Selector.select() calls.
 
     synchronized void registerTimer(TimeoutEvent event) {
+        Log.logTrace("Registering timer {0}", event);
         timeouts.add(event);
         selmgr.wakeupSelector();
     }
 
     synchronized void cancelTimer(TimeoutEvent event) {
-        timeouts.stream().filter(e -> e == event).forEach(timeouts::remove);
+        Log.logTrace("Canceling timer {0}", event);
+        timeouts.remove(event);
     }
 
     /**
@@ -595,23 +597,61 @@
      * returns the amount of time, in milliseconds, until the next earliest
      * event. A return value of 0 means that there are no events.
      */
-    private synchronized long purgeTimeoutsAndReturnNextDeadline() {
-        if (timeouts.isEmpty())
-            return 0L;
+    private long purgeTimeoutsAndReturnNextDeadline() {
+        long diff = 0L;
+        List<TimeoutEvent> toHandle = null;
+        int remaining = 0;
+        // enter critical section to retrieve the timeout event to handle
+        synchronized(this) {
+            if (timeouts.isEmpty()) return 0L;
 
-        Instant now = Instant.now();
-        Iterator<TimeoutEvent> itr = timeouts.iterator();
-        while (itr.hasNext()) {
-            TimeoutEvent event = itr.next();
-            long diff = now.until(event.deadline(), ChronoUnit.MILLIS);
-            if (diff <= 0) {
-                itr.remove();
-                event.handle();  // TODO: release lock.
-            } else {
-                return diff;
+            Instant now = Instant.now();
+            Iterator<TimeoutEvent> itr = timeouts.iterator();
+            while (itr.hasNext()) {
+                TimeoutEvent event = itr.next();
+                diff = now.until(event.deadline(), ChronoUnit.MILLIS);
+                if (diff <= 0) {
+                    itr.remove();
+                    toHandle = (toHandle == null) ? new ArrayList<>() : toHandle;
+                    toHandle.add(event);
+                } else {
+                    break;
+                }
             }
+            remaining = timeouts.size();
         }
-        return 0L;
+
+        // can be useful for debugging
+        if (toHandle != null && Log.trace()) {
+            Log.logTrace("purgeTimeoutsAndReturnNextDeadline: handling "
+                    + (toHandle == null ? 0 : toHandle.size()) + " events, "
+                    + "remaining " + remaining
+                    + ", next deadline: " + (diff < 0 ? 0L : diff));
+        }
+
+        // handle timeout events out of critical section
+        if (toHandle != null) {
+            Throwable failed = null;
+            for (TimeoutEvent event : toHandle) {
+                try {
+                   Log.logTrace("Firing timer {0}", event);
+                   event.handle();
+                } catch (Error | RuntimeException e) {
+                    // Not expected. Handle remaining events then throw...
+                    // If e is an OOME or SOE it might simply trigger a new
+                    // error from here - but in this case there's not much we
+                    // could do anyway. Just let it flow...
+                    if (failed == null) failed = e;
+                    else failed.addSuppressed(e);
+                    Log.logTrace("Failed to handle event {0}: {1}", event, e);
+                }
+            }
+            if (failed instanceof Error) throw (Error) failed;
+            if (failed instanceof RuntimeException) throw (RuntimeException) failed;
+        }
+
+        // return time to wait until next event. 0L if there's no more events.
+        return diff < 0 ? 0L : diff;
     }
 
     // used for the connection window
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/MultiExchange.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/MultiExchange.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -357,9 +357,5 @@
         public void handle() {
             cancel(new HttpTimeoutException("request timed out"));
         }
-        @Override
-        public String toString() {
-            return "[deadline = " + deadline() + "]";
-        }
     }
 }
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainHttpConnection.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainHttpConnection.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -54,7 +54,7 @@
  */
 class PlainHttpConnection extends HttpConnection implements AsyncConnection {
 
-    protected SocketChannel chan;
+    protected final SocketChannel chan;
     private volatile boolean connected;
     private boolean closed;
 
@@ -100,6 +100,7 @@
                 chan.finishConnect();
             } catch (IOException e) {
                 cf.completeExceptionally(e);
+                return;
             }
             connected = true;
             cf.complete(null);
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -670,11 +670,21 @@
 
     @Override
     CompletableFuture<Response> getResponseAsync(Executor executor) {
-        CompletableFuture<Response> cf;
+        CompletableFuture<Response> cf = null;
+        // The code below deals with race condition that can be caused when
+        // completeResponse() is being called before getResponseAsync()
         synchronized (response_cfs) {
             if (!response_cfs.isEmpty()) {
+                // This CompletableFuture was created by completeResponse().
+                // it will be already completed.
                 cf = response_cfs.remove(0);
+                // if we find a cf here it should be already completed.
+                // finding a non completed cf should not happen. just assert it.
+                assert cf.isDone() : "Removing uncompleted response: could cause code to hang!";
             } else {
+                // getResponseAsync() is called first. Create a CompletableFuture
+                // that will be completed by completeResponse() when
+                // completeResponse() is called.
                 cf = new MinimalFuture<>();
                 response_cfs.add(cf);
             }
@@ -708,7 +718,7 @@
                     cf.complete(resp);
                     response_cfs.remove(cf);
                     return;
-                }
+                } // else we found the previous response: just leave it alone.
             }
             cf = MinimalFuture.completedFuture(resp);
             Log.logTrace("Created completed future (streamid={0}): {1}",
@@ -742,10 +752,13 @@
      */
     void completeResponseExceptionally(Throwable t) {
         synchronized (response_cfs) {
-            for (CompletableFuture<Response> cf : response_cfs) {
+            // use index to avoid ConcurrentModificationException
+            // caused by removing the CF from within the loop.
+            for (int i = 0; i < response_cfs.size(); i++) {
+                CompletableFuture<Response> cf = response_cfs.get(i);
                 if (!cf.isDone()) {
                     cf.completeExceptionally(t);
-                    response_cfs.remove(cf);
+                    response_cfs.remove(i);
                     return;
                 }
             }
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/TimeoutEvent.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/TimeoutEvent.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,10 +27,11 @@
 
 import java.time.Duration;
 import java.time.Instant;
+import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * Timeout event notified by selector thread. Executes the given handler if
- * the timer not cancelled first.
+ * the timer not canceled first.
  *
  * Register with {@link HttpClientImpl#registerTimer(TimeoutEvent)}.
  *
@@ -38,6 +39,10 @@
  */
 abstract class TimeoutEvent implements Comparable<TimeoutEvent> {
 
+    private static final AtomicLong COUNTER = new AtomicLong();
+    // we use id in compareTo to make compareTo consistent with equals
+    // see TimeoutEvent::compareTo below;
+    private final long id = COUNTER.incrementAndGet();
     private final Instant deadline;
 
     TimeoutEvent(Duration duration) {
@@ -52,6 +57,24 @@
 
     @Override
     public int compareTo(TimeoutEvent other) {
-        return this.deadline.compareTo(other.deadline);
+        if (other == this) return 0;
+        // if two events have the same deadline, but are not equals, then the
+        // smaller is the one that was created before (has the smaller id).
+        // This is arbitrary and we don't really care which is smaller or
+        // greater, but we need a total order, so two events with the
+        // same deadline cannot compare == 0 if they are not equals.
+        final int compareDeadline = this.deadline.compareTo(other.deadline);
+        if (compareDeadline == 0 && !this.equals(other)) {
+            long diff = this.id - other.id; // should take care of wrap around
+            if (diff < 0) return -1;
+            else if (diff > 0) return 1;
+            else assert false : "Different events with same id and deadline";
+        }
+        return compareDeadline;
+    }
+
+    @Override
+    public String toString() {
+        return "TimeoutEvent[id=" + id + ", deadline=" + deadline + "]";
     }
 }
--- a/jdk/src/jdk.internal.jvmstat/share/classes/module-info.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.internal.jvmstat/share/classes/module-info.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,12 @@
  * questions.
  */
 
+/**
+ * Defines an internal API for monitoring a HotSpot Java Virtual Machine using
+ * its shared memory instrumentation buffer
+ *
+ * @since 9
+ */
 module jdk.internal.jvmstat {
     exports sun.jvmstat.monitor to
         jdk.attach,
--- a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/extra/EditingHistory.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/extra/EditingHistory.java	Fri Apr 28 18:10:28 2017 +0100
@@ -264,9 +264,8 @@
     }
 
     public boolean previousSnippet() {
-        for (int i = index() - 1; i >= 0; i--) {
-            if (get(i) instanceof NarrowingHistoryLine) {
-                moveTo(i);
+        while (previous()) {
+            if (current() instanceof NarrowingHistoryLine) {
                 return true;
             }
         }
@@ -275,19 +274,17 @@
     }
 
     public boolean nextSnippet() {
-        for (int i = index() + 1; i < size(); i++) {
-            if (get(i) instanceof NarrowingHistoryLine) {
-                moveTo(i);
+        boolean success = false;
+
+        while (next()) {
+            success = true;
+
+            if (current() instanceof NarrowingHistoryLine) {
                 return true;
             }
         }
 
-        if (index() < size()) {
-            moveToEnd();
-            return true;
-        }
-
-        return false;
+        return success;
     }
 
     public final void load(Iterable<? extends String> originalHistory) {
--- a/jdk/src/jdk.management/share/classes/com/sun/management/VMOption.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.management/share/classes/com/sun/management/VMOption.java	Fri Apr 28 18:10:28 2017 +0100
@@ -47,8 +47,6 @@
  * object was constructed.  The value of the VM option
  * may be changed after the {@code VMOption} object was constructed,
  *
- * @see <a href="{@docRoot}/../../../../technotes/guides/vm/index.html">
- *         Java Virtual Machine</a>
  * @author Mandy Chung
  * @since 1.6
  */
--- a/jdk/src/jdk.policytool/share/classes/sun/security/tools/policytool/PolicyTool.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.policytool/share/classes/sun/security/tools/policytool/PolicyTool.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -71,6 +71,7 @@
  */
 
 @Deprecated(since="9", forRemoval=true)
+@SuppressWarnings("removal")
 public class PolicyTool {
 
     // for i18n
@@ -879,7 +880,8 @@
  * The Permission contains the (Type, Name, Action) triplet.
  *
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class PolicyEntry {
 
     private CodeSource codesource;
@@ -1019,7 +1021,8 @@
 /**
  * The main window for the PolicyTool
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class ToolWindow extends JFrame {
     // use serialVersionUID from JDK 1.2.2 for interoperability
     private static final long serialVersionUID = 5682568601210376777L;
@@ -1553,7 +1556,8 @@
 /**
  * General dialog window
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class ToolDialog extends JDialog {
     // use serialVersionUID from JDK 1.2.2 for interoperability
     private static final long serialVersionUID = -372244357011301190L;
@@ -2917,7 +2921,8 @@
 /**
  * Event handler for the PolicyTool window
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class ToolWindowListener implements WindowListener {
 
     private PolicyTool tool;
@@ -2962,7 +2967,8 @@
 /**
  * Event handler for the Policy List
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class PolicyListListener extends MouseAdapter implements ActionListener {
 
     private PolicyTool tool;
@@ -2992,7 +2998,8 @@
 /**
  * Event handler for the File Menu
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class FileMenuListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3091,7 +3098,8 @@
 /**
  * Event handler for the main window buttons and Edit Menu
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class MainWindowListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3167,7 +3175,8 @@
  *    if edit is FALSE, then we are ADDing a new PolicyEntry,
  *    so we only need to update the GUI listing.
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class AddEntryDoneButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3234,7 +3243,8 @@
 /**
  * Event handler for ChangeKeyStoreOKButton button
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class ChangeKeyStoreOKButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3281,7 +3291,8 @@
 /**
  * Event handler for AddPrinButton button
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class AddPrinButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3307,7 +3318,8 @@
 /**
  * Event handler for AddPermButton button
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class AddPermButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3333,7 +3345,8 @@
 /**
  * Event handler for AddPrinOKButton button
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class NewPolicyPrinOKButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3397,7 +3410,8 @@
 /**
  * Event handler for AddPermOKButton button
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class NewPolicyPermOKButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3461,7 +3475,8 @@
 /**
  * Event handler for RemovePrinButton button
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class RemovePrinButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3497,7 +3512,8 @@
 /**
  * Event handler for RemovePermButton button
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class RemovePermButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -3540,7 +3556,8 @@
  * GUI listing.  If the user is editing an existing PolicyEntry, we
  * update both the GUI listing and the actual PolicyEntry.
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class EditPrinButtonListener extends MouseAdapter implements ActionListener {
 
     private PolicyTool tool;
@@ -3587,7 +3604,8 @@
  * GUI listing.  If the user is editing an existing PolicyEntry, we
  * update both the GUI listing and the actual PolicyEntry.
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class EditPermButtonListener extends MouseAdapter implements ActionListener {
 
     private PolicyTool tool;
@@ -3628,7 +3646,8 @@
 /**
  * Event handler for Principal Popup Menu
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class PrincipalTypeMenuListener implements ItemListener {
 
     private ToolDialog td;
@@ -3680,7 +3699,8 @@
 /**
  * Event handler for Permission Popup Menu
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class PermissionMenuListener implements ItemListener {
 
     private ToolDialog td;
@@ -3755,7 +3775,8 @@
 /**
  * Event handler for Permission Name Popup Menu
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class PermissionNameMenuListener implements ItemListener {
 
     private ToolDialog td;
@@ -3909,7 +3930,8 @@
 /**
  * Event handler for UserSaveYes button
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class UserSaveYesButtonListener implements ActionListener {
 
     private ToolDialog us;
@@ -3964,7 +3986,8 @@
 /**
  * Event handler for UserSaveNoButton
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class UserSaveNoButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -4013,7 +4036,8 @@
 /**
  * Event handler for ConfirmRemovePolicyEntryOKButtonListener
  */
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class ConfirmRemovePolicyEntryOKButtonListener implements ActionListener {
 
     private PolicyTool tool;
@@ -4169,7 +4193,8 @@
     }
 }
 
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class AuthPerm extends Perm {
     AuthPerm() {
         super(javax.security.auth.AuthPermission.class,
@@ -4242,7 +4267,8 @@
     }
 }
 
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class URLPerm extends Perm {
     URLPerm() {
         super(java.net.URLPermission.class,
@@ -4407,7 +4433,8 @@
     }
 }
 
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class RuntimePerm extends Perm {
     RuntimePerm() {
         super(java.lang.RuntimePermission.class,
@@ -4448,7 +4475,8 @@
     }
 }
 
-@SuppressWarnings("deprecation")
+@SuppressWarnings({"deprecation",
+                   "removal"}) // PolicyTool
 class SecurityPerm extends Perm {
     SecurityPerm() {
         super(java.security.SecurityPermission.class,
--- a/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/SolarisLoginModule.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/SolarisLoginModule.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -66,6 +66,7 @@
     private boolean debug = true;
 
     // SolarisSystem to retrieve underlying system info
+    @SuppressWarnings("removal")
     private SolarisSystem ss;
 
     // the authentication status
@@ -73,9 +74,13 @@
     private boolean commitSucceeded = false;
 
     // Underlying system info
+    @SuppressWarnings("removal")
     private SolarisPrincipal userPrincipal;
+    @SuppressWarnings("removal")
     private SolarisNumericUserPrincipal UIDPrincipal;
+    @SuppressWarnings("removal")
     private SolarisNumericGroupPrincipal GIDPrincipal;
+    @SuppressWarnings("removal")
     private LinkedList<SolarisNumericGroupPrincipal> supplementaryGroups =
                 new LinkedList<>();
 
@@ -121,6 +126,7 @@
      * @return true in all cases (this {@code LoginModule}
      *          should not be ignored).
      */
+    @SuppressWarnings("removal")
     public boolean login() throws LoginException {
 
         long[] solarisGroups = null;
@@ -234,6 +240,7 @@
      * @return false if this LoginModule's own login and/or commit attempts
      *          failed, and true otherwise.
      */
+    @SuppressWarnings("removal")
     public boolean abort() throws LoginException {
         if (debug) {
             System.out.println("\t\t[SolarisLoginModule]: " +
@@ -271,6 +278,7 @@
      * @return true in all cases (this {@code LoginModule}
      *          should not be ignored).
      */
+    @SuppressWarnings("removal")
     public boolean logout() throws LoginException {
         if (debug) {
             System.out.println("\t\t[SolarisLoginModule]: " +
--- a/jdk/src/jdk.unsupported/share/classes/sun/reflect/Reflection.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/src/jdk.unsupported/share/classes/sun/reflect/Reflection.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
  * 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,6 +35,7 @@
      * with {@link StackWalker.StackFrame#getDeclaringClass} instead.
      */
     @Deprecated(forRemoval=true)
+    @SuppressWarnings("removal") // Reflection.getCallerClass
     public static Class<?> getCallerClass(int depth) {
         if (depth < 0)
             throw new InternalError("depth must be positive");
--- a/jdk/test/ProblemList.txt	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/ProblemList.txt	Fri Apr 28 18:10:28 2017 +0100
@@ -124,6 +124,7 @@
 # jdk_lang
 
 java/lang/StringCoding/CheckEncodings.sh                        7008363 generic-all
+java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java    8178776 generic-all
 
 jdk/internal/misc/JavaLangAccess/NewUnsafeString.java           8176188 generic-all
 
@@ -170,8 +171,6 @@
 
 java/net/DatagramSocket/SendDatagramToBadAddress.java           7143960 macosx-all
 
-java/net/httpclient/TimeoutOrdering.java                        8170940 solaris-all,windows-all
-
 ############################################################################
 
 # jdk_nio
@@ -257,8 +256,7 @@
 tools/jimage/JImageListTest.java                                8170120 generic-all
 tools/jimage/JImageVerifyTest.java                              8170120 generic-all
 
-
-tools/jlink/multireleasejar/JLinkMultiReleaseJarTest.java       8169971 windows-x64
+tools/jimage/VerifyJimage.java                                  8178776 generic-all
 
 tools/jar/multiRelease/RuntimeTest.java                         8173905 generic-all
 
--- a/jdk/test/com/sun/jdi/ProcessAttachTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/com/sun/jdi/ProcessAttachTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,13 +23,11 @@
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.List;
 import java.util.Map;
 
 import jdk.testlibrary.ProcessTools;
 
 import com.sun.jdi.Bootstrap;
-import com.sun.jdi.ThreadReference;
 import com.sun.jdi.VirtualMachine;
 import com.sun.jdi.connect.AttachingConnector;
 import com.sun.jdi.connect.Connector;
@@ -86,7 +84,7 @@
             is.read();
 
             // Attach a debugger
-            tryDebug(p.getPid());
+            tryDebug(p.pid());
         } finally {
             p.destroyForcibly();
         }
--- a/jdk/test/java/awt/MouseInfo/JContainerMousePositionTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/awt/MouseInfo/JContainerMousePositionTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017 Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -67,15 +67,19 @@
         robot.waitForIdle();
 
         AtomicReference<Rectangle> frameBounds = new AtomicReference<>();
+        AtomicReference<Insets> frameInsets = new AtomicReference<>();
         AtomicReference<Dimension> button1Size = new AtomicReference<>();
         SwingUtilities.invokeAndWait(() -> {
             frameBounds.set(frame1.getBounds());
+            frameInsets.set(frame1.getInsets());
             button1Size.set(jButton1.getSize());
         });
 
 //point mouse to center of top-left Component (button1)
-        robot.mouseMove(frameBounds.get().x + button1Size.get().width / 2,
-                        frameBounds.get().y + button1Size.get().height / 2);
+        robot.mouseMove(frameBounds.get().x + frameInsets.get().left +
+                                                    button1Size.get().width / 2,
+                        frameBounds.get().y + frameInsets.get().top +
+                                                  button1Size.get().height / 2);
 
         AtomicReference<Point> pFalse = new AtomicReference<>();
         AtomicReference<Point> pTrue = new AtomicReference<>();
@@ -108,10 +112,12 @@
         System.out.println("Test stage completed: Container.getMousePosition(boolean) returned null result outside Container. Passed.");
 
 //point mouse in place free from child components (right-botton component)
-        robot.mouseMove(frameBounds.get().x + centerC4.get().x,
-                        frameBounds.get().y + centerC4.get().y);
+        robot.mouseMove(frameBounds.get().x + frameInsets.get().left +
+                                                               centerC4.get().x,
+                        frameBounds.get().y + frameInsets.get().top +
+                                                              centerC4.get().y);
 
-        robot.delay(3000);
+        robot.waitForIdle();
         SwingUtilities.invokeAndWait(() -> {
             pFalse.set(contentPane.getMousePosition(false));
             pTrue.set(frame1.getMousePosition(true));
@@ -123,7 +129,8 @@
         }
         System.out.println("Test stage completed: Container.getMousePosition(boolean) returned non-null results  inside Container. Passed.");
 
-        if (pTrue.get().x != centerC4.get().x || pTrue.get().y != centerC4.get().y) {
+        if (pTrue.get().x != frameInsets.get().left + centerC4.get().x ||
+            pTrue.get().y != frameInsets.get().top + centerC4.get().y) {
             throw new RuntimeException("Test failed: Container.getMousePosition(true) returned incorrect result inside Container.");
         }
         System.out.println("Test stage completed: Container.getMousePosition(true) returned correct result inside Container. Passed.");
--- a/jdk/test/java/awt/TextField/DisabledUndoTest/DisabledUndoTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/awt/TextField/DisabledUndoTest/DisabledUndoTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -24,7 +24,7 @@
  /*
  * @test
  * @key headful
- * @bug 4302718 6753165
+ * @bug 4302718 6753165 8177386
  * @summary verifies that undo does not work in a disabled TextField on windows
  * @requires (os.family == "windows")
  * @run main/manual DisabledUndoTest
@@ -42,12 +42,12 @@
 
     private static void init() throws Exception {
         String[] instructions
-                = {
-                    "1.Type a few symbols in the textfield.",
-                    "2.Then click the button Disable textfield to disable the textfield.",
-                    "3.Right-click on the textfield to invoke context menu and select \"Undo\".",
-                    "4.Verify that the symbols you typed are NOT undone.",
-                    "5.If they are not, press Pass, else press Fail."
+            = {
+                "1.Type a few symbols in the textfield.",
+                "2.Right-click on the textfield to invoke context menu and select \"Undo\". Make sure the typed symbol is undone.",
+                "3.Then click the button Disable textfield to disable the textfield.",
+                "4.Right-click on the textfield to invoke context menu.Verify that Undo option is disabled in context menu and you can't undo the text",
+                "5.If they are not, press Pass, else press Fail."
                 };
 
         Sysout.createDialog();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Window/WindowDeadlockTest/WindowDeadlockTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 8176490
+ * @summary Tests that there is no hang or deadlock when the visibility
+ *      of parent and child windows is changed.
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main/timeout=20 WindowDeadlockTest
+ */
+
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.Robot;
+
+import test.java.awt.regtesthelpers.Util;
+
+public class WindowDeadlockTest {
+    public static void main(String[] args) throws Exception {
+        Robot robot = Util.createRobot();
+
+        Frame main = new Frame("Main");
+        main.setBounds(0, 0, 200, 100);
+        main.setVisible(true);
+
+        Dialog first = new Dialog(main, "First");
+        first.setBounds(250, 0, 200, 100);
+        first.setVisible(true);
+
+        Dialog second = new Dialog(first, "Second");
+        second.setBounds(0, 150, 200, 100);
+        second.setVisible(true);
+
+        Util.waitForIdle(robot);
+        robot.delay(2000);
+
+        Dialog third = new Dialog(first, "Third", false);
+        third.setBounds(250, 150, 200, 100);
+        third.setVisible(true);
+        first.setVisible(false); // the hang takes place here
+
+        Util.waitForIdle(robot);
+        robot.delay(2000);
+
+        third.dispose();
+        second.dispose();
+        first.dispose();
+        main.dispose();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PageFormat/WrongPaperPrintingTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 8167102
+   @summary PrintRequestAttributeSet breaks page size set using PageFormat
+   @run main/manual WrongPaperPrintingTest
+ */
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.FlowLayout;
+import java.awt.Graphics;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.print.PageFormat;
+import java.awt.print.Paper;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.print.attribute.Size2DSyntax;
+import javax.print.attribute.standard.Chromaticity;
+import javax.print.attribute.standard.MediaSize;
+import javax.print.attribute.standard.MediaSizeName;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+import javax.swing.WindowConstants;
+
+public class WrongPaperPrintingTest implements Printable {
+    private static final CountDownLatch testEndedSignal = new CountDownLatch(1);
+    private static final int testTimeout = 300000;
+    private static volatile String testFailureMsg;
+    private static volatile boolean testPassed;
+    private static volatile boolean testFinished;
+
+    public static void main(String[] args) {
+        SwingUtilities.invokeLater(() -> createAndShowTestDialog());
+
+        try {
+            if (!testEndedSignal.await(testTimeout, TimeUnit.MILLISECONDS)) {
+                throw new RuntimeException(String.format(
+                    "Test timeout '%d ms' elapsed.", testTimeout));
+            }
+            if (!testPassed) {
+                String failureMsg = testFailureMsg;
+                if ((failureMsg != null) && (!failureMsg.trim().isEmpty())) {
+                    throw new RuntimeException(failureMsg);
+                } else {
+                    throw new RuntimeException("Test failed.");
+                }
+            }
+        } catch (InterruptedException ie) {
+            throw new RuntimeException(ie);
+        } finally {
+            testFinished = true;
+        }
+    }
+
+    private static void doTest() {
+        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
+        aset.add(Chromaticity.MONOCHROME);
+
+        MediaSize isoA5Size = MediaSize.getMediaSizeForName(MediaSizeName.ISO_A5);
+        float[] size = isoA5Size.getSize(Size2DSyntax.INCH);
+        Paper paper = new Paper();
+        paper.setSize(size[0] * 72.0, size[1] * 72.0);
+        paper.setImageableArea(0.0, 0.0, size[0] * 72.0, size[1] * 72.0);
+        PageFormat pf = new PageFormat();
+        pf.setPaper(paper);
+
+        PrinterJob job = PrinterJob.getPrinterJob();
+        job.setPrintable(new WrongPaperPrintingTest(), job.validatePage(pf));
+        if (job.printDialog()) {
+            try {
+                job.print(aset);
+            } catch (PrinterException pe) {
+                throw new RuntimeException(pe);
+            }
+        }
+    }
+
+    private static void pass() {
+        testPassed = true;
+        testEndedSignal.countDown();
+    }
+
+    private static void fail(String failureMsg) {
+        testFailureMsg = failureMsg;
+        testPassed = false;
+        testEndedSignal.countDown();
+    }
+
+    private static String convertMillisToTimeStr(int millis) {
+        if (millis < 0) {
+            return "00:00:00";
+        }
+        int hours = millis / 3600000;
+        int minutes = (millis - hours * 3600000) / 60000;
+        int seconds = (millis - hours * 3600000 - minutes * 60000) / 1000;
+        return String.format("%02d:%02d:%02d", hours, minutes, seconds);
+    }
+
+    private static void createAndShowTestDialog() {
+        String description =
+            " To run this test it is required to have a virtual PDF\r\n" +
+            " printer or any other printer supporting A5 paper size.\r\n" +
+            "\r\n" +
+            " 1. Verify that NOT A5 paper size is set as default for the\r\n" +
+            " printer to be used.\r\n" +
+            " 2. Click on \"Start Test\" button.\r\n" +
+            " 3. In the shown print dialog select the printer and click\r\n" +
+            " on \"Print\" button.\r\n" +
+            " 4. Verify that a page with a drawn rectangle is printed on\r\n" +
+            " a paper of A5 size which is (5.8 x 8.3 in) or\r\n" +
+            " (148 x 210 mm).\r\n" +
+            "\r\n" +
+            " If the printed page size is correct, click on \"PASS\"\r\n" +
+            " button, otherwise click on \"FAIL\" button.";
+
+        final JDialog dialog = new JDialog();
+        dialog.setTitle("WrongPaperPrintingTest");
+        dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        dialog.addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowClosing(WindowEvent e) {
+                dialog.dispose();
+                fail("Main dialog was closed.");
+            }
+        });
+
+        final JLabel testTimeoutLabel = new JLabel(String.format(
+            "Test timeout: %s", convertMillisToTimeStr(testTimeout)));
+        final long startTime = System.currentTimeMillis();
+        final Timer timer = new Timer(0, null);
+        timer.setDelay(1000);
+        timer.addActionListener((e) -> {
+            int leftTime = testTimeout - (int)(System.currentTimeMillis() - startTime);
+            if ((leftTime < 0) || testFinished) {
+                timer.stop();
+                dialog.dispose();
+            }
+            testTimeoutLabel.setText(String.format(
+                "Test timeout: %s", convertMillisToTimeStr(leftTime)));
+        });
+        timer.start();
+
+        JTextArea textArea = new JTextArea(description);
+        textArea.setEditable(false);
+
+        final JButton testButton = new JButton("Start Test");
+        final JButton passButton = new JButton("PASS");
+        final JButton failButton = new JButton("FAIL");
+        testButton.addActionListener((e) -> {
+            testButton.setEnabled(false);
+            new Thread(() -> {
+                try {
+                    doTest();
+
+                    SwingUtilities.invokeLater(() -> {
+                        passButton.setEnabled(true);
+                        failButton.setEnabled(true);
+                    });
+                } catch (Throwable t) {
+                    t.printStackTrace();
+                    dialog.dispose();
+                    fail("Exception occurred in a thread executing the test.");
+                }
+            }).start();
+        });
+        passButton.setEnabled(false);
+        passButton.addActionListener((e) -> {
+            dialog.dispose();
+            pass();
+        });
+        failButton.setEnabled(false);
+        failButton.addActionListener((e) -> {
+            dialog.dispose();
+            fail("Size of a printed page is wrong.");
+        });
+
+        JPanel mainPanel = new JPanel(new BorderLayout());
+        JPanel labelPanel = new JPanel(new FlowLayout());
+        labelPanel.add(testTimeoutLabel);
+        mainPanel.add(labelPanel, BorderLayout.NORTH);
+        mainPanel.add(textArea, BorderLayout.CENTER);
+        JPanel buttonPanel = new JPanel(new FlowLayout());
+        buttonPanel.add(testButton);
+        buttonPanel.add(passButton);
+        buttonPanel.add(failButton);
+        mainPanel.add(buttonPanel, BorderLayout.SOUTH);
+        dialog.add(mainPanel);
+
+        dialog.pack();
+        dialog.setVisible(true);
+    }
+
+    @Override
+    public int print(Graphics g, PageFormat pf, int pageIndex)
+        throws PrinterException {
+        if (pageIndex == 0) {
+            g.setColor(Color.RED);
+            g.drawRect((int)pf.getImageableX(), (int)pf.getImageableY(),
+                (int)pf.getImageableWidth(), (int)pf.getImageableHeight());
+            return Printable.PAGE_EXISTS;
+        } else {
+            return Printable.NO_SUCH_PAGE;
+        }
+    }
+}
--- a/jdk/test/java/io/FilePermission/Correctness.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/io/FilePermission/Correctness.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -89,12 +89,14 @@
         //check("/-", "-");
 
         try {
-            // containsPath is broken on Windows.
             containsMethod = FilePermission.class.getDeclaredMethod(
                     "containsPath", Path.class, Path.class);
             containsMethod.setAccessible(true);
             System.out.println();
 
+            // The 1st 2 args of contains() must be normalized paths.
+            // When FilePermission::containsPath is called by implies,
+            // paths have already been normalized.
             contains("x", "x", 0);
             contains("x", "x/y", 1);
             contains("x", "x/y/z", 2);
@@ -160,7 +162,7 @@
         }
     }
 
-    static void check(String s1, String s2, boolean expected) {
+    static void check0(String s1, String s2, boolean expected) {
         FilePermission fp1 = new FilePermission(s1, "read");
         FilePermission fp2 = new FilePermission(s2, "read");
         boolean b = fp1.implies(fp2);
@@ -173,6 +175,16 @@
         }
     }
 
+    static void check(String s1, String s2, boolean expected) {
+        check0(s1, s2, expected);
+        if (isWindows) {
+            check0("C:" + s1, s2, false);
+            check0(s1, "C:" + s2, false);
+            check0("C:" + s1, "D:" + s2, false);
+            check0("C:" + s1, "C:" + s2, expected);
+        }
+    }
+
     static void check(String s1, String s2) {
         check(s1, s2, true);
     }
--- a/jdk/test/java/lang/ProcessBuilder/Basic.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/ProcessBuilder/Basic.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -311,7 +311,7 @@
             if (action.equals("sleep")) {
                 Thread.sleep(10 * 60 * 1000L);
             } else if (action.equals("pid")) {
-                System.out.println(ProcessHandle.current().getPid());
+                System.out.println(ProcessHandle.current().pid());
             } else if (action.equals("testIO")) {
                 String expected = "standard input";
                 char[] buf = new char[expected.length()+1];
@@ -1235,7 +1235,7 @@
             Process p = pb.start();
             String s = commandOutput(p);
             long actualPid = Long.valueOf(s.trim());
-            long expectedPid = p.getPid();
+            long expectedPid = p.pid();
             equal(actualPid, expectedPid);
         } catch (Throwable t) {
             unexpected(t);
@@ -1245,7 +1245,7 @@
         // Test the default implementation of Process.getPid
         DelegatingProcess p = new DelegatingProcess(null);
         THROWS(UnsupportedOperationException.class,
-                () -> p.getPid(),
+                () -> p.pid(),
                 () -> p.toHandle(),
                 () -> p.supportsNormalTermination(),
                 () -> p.children(),
@@ -2243,7 +2243,7 @@
                 // Child process waits until it gets input
                 String s = p.toString();
                 check(s.contains("not exited"));
-                check(s.contains("pid=" + p.getPid() + ","));
+                check(s.contains("pid=" + p.pid() + ","));
 
                 new PrintStream(p.getOutputStream()).print("standard input");
                 p.getOutputStream().close();
@@ -2251,7 +2251,7 @@
                 // Check the toString after it exits
                 int exitValue = p.waitFor();
                 s = p.toString();
-                check(s.contains("pid=" + p.getPid() + ","));
+                check(s.contains("pid=" + p.pid() + ","));
                 check(s.contains("exitValue=" + exitValue) &&
                         !s.contains("not exited"));
             }
--- a/jdk/test/java/lang/ProcessBuilder/PipelineTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/ProcessBuilder/PipelineTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -212,7 +212,7 @@
 
     static void print(ProcessHandle p) {
         System.out.printf("process: pid: %d, info: %s%n",
-                p.getPid(), p.info());
+                p.pid(), p.info());
     }
 
     // Check various aspects of the processes
--- a/jdk/test/java/lang/ProcessBuilder/Zombies.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/ProcessBuilder/Zombies.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -43,7 +43,7 @@
             ! new File("/bin/ps").canExecute())
             return;
         System.out.println("Looks like a Unix system.");
-        long mypid = ProcessHandle.current().getPid();
+        long mypid = ProcessHandle.current().pid();
         System.out.printf("mypid: %d%n", mypid);
 
         final Runtime rt = Runtime.getRuntime();
@@ -65,7 +65,7 @@
 
         Process p = rt.exec(TrueCommand);
         ProcessHandle pp = p.toHandle().parent().orElse(null);
-        System.out.printf("%s pid: %d, parent: %s%n", TrueCommand, p.getPid(), pp);
+        System.out.printf("%s pid: %d, parent: %s%n", TrueCommand, p.pid(), pp);
         p.waitFor();
 
         // Count all the zombies that are children of this Java process
--- a/jdk/test/java/lang/ProcessHandle/Basic.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/ProcessHandle/Basic.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -66,13 +66,13 @@
     public static void test2() {
         try {
             ProcessHandle self = ProcessHandle.current();
-            long pid = self.getPid();       // known native process id
+            long pid = self.pid();       // known native process id
             Optional<ProcessHandle> self1 = ProcessHandle.of(pid);
             assertEquals(self1.get(), self,
-                    "ProcessHandle.of(x.getPid()) should be equal getPid() %d: %d");
+                    "ProcessHandle.of(x.pid()) should be equal pid() %d: %d");
 
             Optional<ProcessHandle> ph = ProcessHandle.of(pid);
-            assertEquals(pid, ph.get().getPid());
+            assertEquals(pid, ph.get().pid());
         } finally {
             // Cleanup any left over processes
             ProcessHandle.current().children().forEach(ProcessHandle::destroy);
@@ -98,7 +98,7 @@
             Process p = new ProcessBuilder("sleep", "0").start();
             p.waitFor();
 
-            long deadPid = p.getPid();
+            long deadPid = p.pid();
             p = null;               // Forget the process
 
             Optional<ProcessHandle> t = ProcessHandle.of(deadPid);
--- a/jdk/test/java/lang/ProcessHandle/JavaChild.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/ProcessHandle/JavaChild.java	Fri Apr 28 18:10:28 2017 +0100
@@ -159,7 +159,7 @@
      */
     CompletableFuture<String> forEachOutputLine(Consumer<String> consumer) {
         final CompletableFuture<String> future = new CompletableFuture<>();
-        String name = "OutputLineReader-" + getPid();
+        String name = "OutputLineReader-" + pid();
         Thread t = new Thread(() -> {
             try (BufferedReader reader = outputReader()) {
                 String line;
@@ -167,7 +167,7 @@
                     consumer.accept(line);
                 }
             } catch (IOException | RuntimeException ex) {
-                consumer.accept("IOE (" + getPid() + "):" + ex.getMessage());
+                consumer.accept("IOE (" + pid() + "):" + ex.getMessage());
                 future.completeExceptionally(ex);
             }
             future.complete("success");
@@ -327,7 +327,7 @@
                                 try {
                                     p.getOutputStream().close();
                                 } catch (IOException ie) {
-                                    sendResult("stdin_closing", p.getPid(),
+                                    sendResult("stdin_closing", p.pid(),
                                             "exception", ie.getMessage());
                                 }
                             }
@@ -352,9 +352,9 @@
                                             "children to terminate%n");
                                     children.removeAll(completedChildren);
                                     for (JavaChild c : children) {
-                                        sendResult("stdin_noterm", c.getPid());
+                                        sendResult("stdin_noterm", c.pid());
                                         System.err.printf("  Process not terminated: " +
-                                                "pid: %d%n", c.getPid());
+                                                "pid: %d%n", c.pid());
                                     }
                                     System.exit(2);
                                 }
@@ -386,11 +386,11 @@
                         System.arraycopy(args, nextArg, subargs, 0, subargs.length);
                         for (int i = 0; i < ncount; i++) {
                             JavaChild p = spawnJavaChild(subargs);
-                            sendResult(action, p.getPid());
+                            sendResult(action, p.pid());
                             p.forEachOutputLine(JavaChild::sendRaw);
                             p.onJavaChildExit().thenAccept((p1) -> {
                                 int excode = p1.exitValue();
-                                sendResult("child_exit", p1.getPid(), excode);
+                                sendResult("child_exit", p1.pid(), excode);
                                 completedChildren.add(p1);
                             });
                             children.add(p);        // Add child to spawned list
@@ -410,7 +410,7 @@
                             if (p.isAlive()) {
                                 sentCount++;
                                 // overwrite with current pid
-                                result[0] = Long.toString(p.getPid());
+                                result[0] = Long.toString(p.pid());
                                 sendResult(action, result);
                                 p.sendAction(args[nextArg], subargs);
                             }
@@ -426,7 +426,7 @@
                         // ignoring those that are not alive
                         for (JavaChild p : children) {
                             if (p.isAlive()) {
-                                sendResult(action, p.getPid());
+                                sendResult(action, p.pid());
                                 p.getOutputStream().close();
                             }
                         }
@@ -505,7 +505,7 @@
         String command;
         Object[] results;
         Event(String command, Object... results) {
-            this(self.getPid(), ++commandSeq, command, results);
+            this(self.pid(), ++commandSeq, command, results);
         }
         Event(long pid, int seq, String command, Object... results) {
             this.pid = pid;
--- a/jdk/test/java/lang/ProcessHandle/OnExitTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/ProcessHandle/OnExitTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -104,7 +104,7 @@
 
             JavaChild proc = JavaChild.spawnJavaChild("stdin");
             procHandle = proc.toHandle();
-            printf(" spawned: %d%n", proc.getPid());
+            printf(" spawned: %d%n", proc.pid());
 
             proc.forEachOutputLine((s) -> {
                 String[] split = s.trim().split(" ");
@@ -235,7 +235,7 @@
                 } while (!"pid".equals(split[1]));
 
                 // Tell B to wait for A's pid
-                B.sendAction("waitpid", A.getPid());
+                B.sendAction("waitpid", A.pid());
 
                 // Wait a bit to see if B will prematurely report the termination of A
                 try {
--- a/jdk/test/java/lang/ProcessHandle/ProcessUtil.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/ProcessHandle/ProcessUtil.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -199,7 +199,7 @@
      */
     static void printProcess(ProcessHandle ph, String prefix) {
         printf("%spid %s, alive: %s; parent: %s, %s%n", prefix,
-                ph.getPid(), ph.isAlive(), ph.parent(), ph.info());
+                ph.pid(), ph.isAlive(), ph.parent(), ph.info());
     }
 
     /**
--- a/jdk/test/java/lang/ProcessHandle/TreeTest.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/ProcessHandle/TreeTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -73,7 +73,7 @@
         try {
             ProcessHandle self = ProcessHandle.current();
 
-            printf("self pid: %d%n", self.getPid());
+            printf("self pid: %d%n", self.pid());
             printDeep(self, "");
 
             for (int i = 0; i < MAXCHILDREN; i++) {
@@ -154,7 +154,7 @@
 
             JavaChild p1 = JavaChild.spawnJavaChild("stdin");
             ProcessHandle p1Handle = p1.toHandle();
-            printf("  p1 pid: %d%n", p1.getPid());
+            printf("  p1 pid: %d%n", p1.pid());
 
             // Gather the PIDs from the output of the spawing process
             p1.forEachOutputLine((s) -> {
@@ -206,7 +206,7 @@
             // show the complete list of children (for debug)
             List<ProcessHandle> descendants = getDescendants(p1Handle);
             printf(" descendants:  %s%n",
-                    descendants.stream().map(p -> p.getPid())
+                    descendants.stream().map(p -> p.pid())
                            .collect(Collectors.toList()));
 
             // Verify that all spawned children show up in the descendants  List
@@ -252,7 +252,7 @@
 
             JavaChild p1 = JavaChild.spawnJavaChild("stdin");
             ProcessHandle p1Handle = p1.toHandle();
-            printf(" p1: %s%n", p1.getPid());
+            printf(" p1: %s%n", p1.pid());
 
             int newChildren = 3;
             CountDownLatch spawnCount = new CountDownLatch(newChildren);
@@ -356,11 +356,11 @@
             parent[sortindex[i]] = processes[sortindex[i]].parent().orElse(null);
         }
         Arrays.sort(sortindex, (i1, i2) -> {
-            int cmp = Long.compare((parent[i1] == null ? 0L : parent[i1].getPid()),
-                    (parent[i2] == null ? 0L : parent[i2].getPid()));
+            int cmp = Long.compare((parent[i1] == null ? 0L : parent[i1].pid()),
+                    (parent[i2] == null ? 0L : parent[i2].pid()));
             if (cmp == 0) {
-                cmp = Long.compare((processes[i1] == null ? 0L : processes[i1].getPid()),
-                        (processes[i2] == null ? 0L : processes[i2].getPid()));
+                cmp = Long.compare((processes[i1] == null ? 0L : processes[i1].pid()),
+                        (processes[i2] == null ? 0L : processes[i2].pid()));
             }
             return cmp;
         });
@@ -397,7 +397,7 @@
             ProcessHandle p1Handle = p1.toHandle();
 
             printf("Spawning %d x %d x %d processes, pid: %d%n",
-                    factor, factor, factor, p1.getPid());
+                    factor, factor, factor, p1.pid());
 
             // Start the first tier of subprocesses
             p1.sendAction("spawn", factor, "stdin");
@@ -448,7 +448,7 @@
 
             List<ProcessHandle> subprocesses = getDescendants(p1Handle);
             printf(" descendants:  %s%n",
-                    subprocesses.stream().map(p -> p.getPid())
+                    subprocesses.stream().map(p -> p.pid())
                     .collect(Collectors.toList()));
 
             p1.getOutputStream().close();  // Close stdin for the controlling p1
--- a/jdk/test/java/lang/Runtime/exec/SleepyCat.java	Wed Apr 19 16:41:27 2017 +0100
+++ b/jdk/test/java/lang/Runtime/exec/SleepyCat.java	Fri Apr 28 18:10:28 2017 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -80,10 +80,10 @@
             for (Process p : pids) {
                 if (p == null)
                     continue;
-                String[] pfiles = {"pfiles", Long.toString(p.getPid())};
+                String[] pfiles = {"pfiles", Long.toString(p.pid())};
                 fds = new ProcessBuilder(pfiles).inheritIO().start();
                 fds.waitFor();
-                String[] pstack = {"pstack", Long.toString(p.getPid())};
+                String[] pstack = {"pstack", Long.toString(p.pid())};
                 fds = new ProcessBuilder(pstack).inheritIO().start();
                 fds.waitFor();
             }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/Base.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import jdk.testlibrary.JDKToolFinder;
+
+import static jdk.testlibrary.ProcessTools.executeCommand;
+
+/*
+ * Base class for tests.
+ * The tests focuse on that LoggerFinder works well in jigsaw environment,
+ * i.e. make sure correct Logger can be retrieved,
+ * also verify that basic functionality of retrieved Logger's works well.
+ *
+ * Note: As the test will take long time, to avoid timeout,
+ * split it as several tests, this class is the base class for tests.
+ */
+public class Base {
+    protected static final String JAVA_HOME = System.getProperty("java.home");
+    protected static final Path JDK_IMAGE = Paths.get(JAVA_HOME);
+    protected static final Path JMODS = Paths.get(JAVA_HOME, "jmods");
+
+    protected static final String TEST_SRC = System.getProperty("test.src");
+
+    // logger client to get logger from java.base module, it should get a lazy logger
+    // which wraps the underlying real logger implementation
+    protected static final Path SRC_PATCHED_USAGE =
+            Paths.get(TEST_SRC, "patched_usage", "java.base");
+    protected static final Path DEST_PATCHED_USAGE = Paths.get("patched_usage", "java.base");
+    protected static final Path SRC_PATCHED_CLIENT = Paths.get(TEST_SRC, "patched_client");
+    protected static final Path DEST_PATCHED_CLIENT = Paths.get("patched_client");
+
+    // logger client to get logger from bootclasspath/a, it should get a lazy logger
+    // which wraps the underlying real logger implementation
+    protected static final Path SRC_BOOT_USAGE = Paths.get(TEST_SRC, "boot_usage");
+    protected static final Path DEST_BOOT_USAGE = Paths.get("boot_usage");
+    protected static final Path SRC_BOOT_CLIENT = Paths.get(TEST_SRC, "boot_client");
+    protected static final Path DEST_BOOT_CLIENT = Paths.get("boot_client");
+
+    // logger provider in named module m.l.a
+    protected static final Path SRC_NAMED_LOGGER = Paths.get(TEST_SRC, "named_logger");
+    protected static final Path DEST_NAMED_LOGGER = Paths.get("mods_named_logger");
+
+    // logger provider in unnamed module
+    protected static final Path SRC_UNNAMED_LOGGER = Paths.get(TEST_SRC, "unnamed_logger");
+    protected static final Path DEST_UNNAMED_LOGGER = Paths.get("cp_unnamed_logger");
+    protected static final Path SRC_UNNAMED_LOGGER_SERVICE_FILE =
+            SRC_UNNAMED_LOGGER.resolve("META-INF/services/java.lang.System$LoggerFinder");
+    protected static final Path DEST_UNNAMED_LOGGER_SERVICE_DIR =
+            DEST_UNNAMED_LOGGER.resolve("META-INF/services");
+    protected static final Path DEST_UNNAMED_LOGGER_SERVICE_FILE =
+            DEST_UNNAMED_LOGGER.resolve("META-INF/services/java.lang.System$LoggerFinder");
+
+    // logger client in named module m.t.a
+    protected static final Path SRC_NAMED_CLIENT = Paths.get(TEST_SRC, "named_client");
+    protected static final Path DEST_NAMED_CLIENT = Paths.get("mods_named_client");
+
+    // logger client in unnamed module
+    protected static final Path SRC_UNNAMED_CLIENT = Paths.get(TEST_SRC, "unnamed_client");
+    protected static final Path DEST_UNNAMED_CLIENT = Paths.get("cp_unnamed_client");
+
+    // customized image with only module java.base
+    protected static final Path IMAGE = Paths.get("image");
+    // customized image with java.base and logger provider module m.l.a
+    protected static final Path IMAGE_LOGGER = Paths.get("image_logger");
+    // customized image with module java.base and logger client module m.t.a
+    protected static final Path IMAGE_CLIENT = Paths.get("image_client");
+    // customized image with module java.base, logger provider module m.l.a
+    // and logger client module m.t.a
+    protected static final Path IMAGE_CLIENT_LOGGER = Paths.get("image_all");
+
+    // lazy logger class which wraps the underlying real logger implementation
+    protected static final String LAZY_LOGGER =
+            "jdk.internal.logger.LazyLoggers$JdkLazyLogger";
+    // JUL logger class which wraps java.util.logging.Logger
+    protected static final String JUL_LOGGER =
+            "sun.util.logging.internal.LoggingProviderImpl$JULWrapper";
+    // default simple logger class when no logger provider can be found
+    protected static final String SIMPLE_LOGGER =
+            "jdk.internal.logger.SimpleConsoleLogger";
+    // logger class in named module m.l.a
+    protected static final String LOGGER_A = "pkg.a.l.LoggerA";
+    // logger class in unnamed module m.l.b
+    protected static final String LOGGER_B = "pkg.b.l.LoggerB";
+
+    // logger client in named module
+    protected static final String CLIENT_A = "m.t.a/pkg.a.t.TestA";
+    // logger client in unnamed module
+    protected static final String CLIENT_B = "pkg.b.t.TestB";
+    // logger client which gets logger through boot class BootUsage
+    protected static final String BOOT_CLIENT = "BootClient";
+    // logger client which gets logger through patched class
+    // java.base/java.lang.PatchedUsage
+    protected static final String PATCHED_CLIENT = "PatchedClient";
+
+    protected void setupAllClient() throws Throwable {
+        // compiles logger client which will get logger through patched
+        // class java.base/java.lang.PatchedUsage
+        compile(SRC_BOOT_USAGE, DEST_BOOT_USAGE);
+        compile(SRC_BOOT_CLIENT, DEST_BOOT_CLIENT,
+                "--class-path", DEST_BOOT_USAGE.toString());
+
+        // compiles logger client which will get logger through boot
+        // class BootUsage
+        compile(SRC_PATCHED_USAGE, DEST_PATCHED_USAGE,
+                "--patch-module", "java.base=" + SRC_PATCHED_USAGE.toString());
+        compile(SRC_PATCHED_CLIENT, DEST_PATCHED_CLIENT,
+                "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString());
+
+        // compiles logger client in unnamed module
+        compile(SRC_UNNAMED_CLIENT, DEST_UNNAMED_CLIENT,
+                "--source-path", SRC_UNNAMED_CLIENT.toString());
+
+        // compiles logger client in named module m.t.a
+        compile(SRC_NAMED_CLIENT, DEST_NAMED_CLIENT,
+                "--module-source-path", SRC_NAMED_CLIENT.toString());
+    }
+
+    protected void setupNamedLogger() throws Throwable {
+        // compiles logger provider in named module m.l.a
+        compile(SRC_NAMED_LOGGER, DEST_NAMED_LOGGER,
+                "--module-source-path", SRC_NAMED_LOGGER.toString());
+    }
+
+    protected void setupUnnamedLogger() throws Throwable {
+        // compiles logger provider in unnamed module
+        compile(SRC_UNNAMED_LOGGER, DEST_UNNAMED_LOGGER,
+                "--source-path", SRC_UNNAMED_LOGGER.toString());
+        Files.createDirectories(DEST_UNNAMED_LOGGER_SERVICE_DIR);
+        Files.copy(SRC_UNNAMED_LOGGER_SERVICE_FILE, DEST_UNNAMED_LOGGER_SERVICE_FILE,
+                   StandardCopyOption.REPLACE_EXISTING);
+    }
+
+    protected boolean checkJMODS() throws Throwable {
+        // if $JAVA_HOME/jmods does not exist, skip below steps
+        // as there is no way to build customized images by jlink
+        if (Files.notExists(JMODS)) {
+            System.err.println("Skip tests which require image");
+            return false;
+        }
+        return true;
+    }
+
+    protected void setupJavaBaseImage() throws Throwable {
+        if (!checkJMODS()) {
+            return;
+        }
+
+        // build image with just java.base module
+        String mpath = JMODS.toString();
+        execTool("jlink",
+                "--module-path", mpath,
+                "--add-modules", "java.base",
+                "--output", IMAGE.toString());
+    }
+
+    protected void setupLoggerImage() throws Throwable {
+        if (!checkJMODS()) {
+            return;
+        }
+
+        // build image with java.base + m.l.a modules
+        String mpath = DEST_NAMED_LOGGER.toString() + File.pathSeparator + JMODS.toString();
+        execTool("jlink",
+                "--module-path", mpath,
+                "--add-modules", "m.l.a",
+                "--output", IMAGE_LOGGER.toString());
+    }
+
+    protected void setupClientImage() throws Throwable {
+        if (!checkJMODS()) {
+            return;
+        }
+
+        // build image with java.base + m.t.a modules
+        String mpath = DEST_NAMED_CLIENT.toString() + File.pathSeparator + JMODS.toString();
+        execTool("jlink",
+                "--module-path", mpath,
+                "--add-modules", "m.t.a",
+                "--output", IMAGE_CLIENT.toString());
+    }
+
+    protected void setupFullImage() throws Throwable {
+        if (!checkJMODS()) {
+            return;
+        }
+
+        // build image with java.base + m.l.a + m.t.a modules
+        String mpath = DEST_NAMED_LOGGER.toString() + File.pathSeparator
+                + DEST_NAMED_CLIENT.toString() + File.pathSeparator + JMODS.toString();
+        execTool("jlink",
+                "--module-path", mpath,
+                "--add-modules", "m.l.a,m.t.a",
+                "--output", IMAGE_CLIENT_LOGGER.toString());
+
+    }
+
+    protected static void assertTrue(boolean b) {
+        if (!b) {
+            throw new RuntimeException("expected true, but get false.");
+        }
+    }
+
+    /*
+     * run test with supplied java image which could be jdk image or customized image
+     */
+    protected void runTest(Path image, String... opts) throws Throwable {
+        String[] options = Stream.concat(Stream.of(getJava(image)), Stream.of(opts))
+                                 .toArray(String[]::new);
+
+        ProcessBuilder pb = new ProcessBuilder(options);
+        int exitValue = executeCommand(pb).outputTo(System.out)
+                                          .errorTo(System.err)
+                                          .getExitValue();
+        assertTrue(exitValue == 0);
+    }
+
+    private void compile(Path src, Path dest, String... params) throws Throwable {
+        assertTrue(CompilerUtils.compile(src, dest, params));
+    }
+
+    private String getJava(Path image) {
+        boolean isWindows = System.getProperty("os.name").startsWith("Windows");
+        Path java = image.resolve("bin").resolve(isWindows ? "java.exe" : "java");
+        if (Files.notExists(java))
+            throw new RuntimeException(java + " not found");
+        return java.toAbsolutePath().toString();
+    }
+
+    private void execTool(String tool, String... args) throws Throwable {
+        String path = JDKToolFinder.getJDKTool(tool);
+        List<String> commands = new ArrayList<>();
+        commands.add(path);
+        Stream.of(args).forEach(commands::add);
+        ProcessBuilder pb = new ProcessBuilder(commands);
+
+        int exitValue = executeCommand(pb).outputTo(System.out)
+                                          .errorTo(System.out)
+                                          .shouldNotContain("no module is recorded in hash")
+                                          .getExitValue();
+        assertTrue(exitValue == 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/JDKLoggerForImageTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import jdk.testlibrary.JDKToolFinder;
+
+import static jdk.testlibrary.ProcessTools.executeCommand;
+
+/*
+ * @test
+ * @modules jdk.compiler
+ * @summary Test cases which run against customized image, check the situation where
+ *            1. logger provider is the default one supplied by java.base,
+ *            2. clients are in named/unnamed module,
+ *               patched system module, or Xbootclasspath
+ *          This test does not require existence of java.logging module,
+ *          but require jdk.compiler module
+ * @library /lib/testlibrary
+ * @build Base CompilerUtils jdk.testlibrary.*
+ * @run main/othervm JDKLoggerForImageTest
+ */
+
+public class JDKLoggerForImageTest extends Base {
+
+    public static void main(String args[]) throws Throwable {
+        JDKLoggerForImageTest t = new JDKLoggerForImageTest();
+        t.setup();
+        t.test();
+    }
+
+    private void setup() throws Throwable {
+        setupAllClient();
+
+        setupJavaBaseImage();
+    }
+
+    private void test() throws Throwable {
+        if (!checkJMODS()) {
+            return;
+        }
+
+        // logger client is in named module m.t.a
+        runTest(IMAGE,
+                "--module-path", DEST_NAMED_CLIENT.toString(),
+                "-m", CLIENT_A, "system", SIMPLE_LOGGER);
+        // logger client is in unnamed module
+        runTest(IMAGE,
+                "--class-path", DEST_UNNAMED_CLIENT.toString(),
+                CLIENT_B, "system", SIMPLE_LOGGER);
+        // logger client gets logger through boot class BootUsage
+        runTest(IMAGE,
+                "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(),
+                "--class-path", DEST_BOOT_CLIENT.toString(),
+                BOOT_CLIENT, "system", SIMPLE_LOGGER);
+        // logger client gets logger through patched class
+        // java.base/java.lang.PatchedUsage
+        runTest(IMAGE,
+                "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(),
+                "--class-path", DEST_PATCHED_CLIENT.toString(),
+                PATCHED_CLIENT, "system", SIMPLE_LOGGER);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/JDKLoggerForJDKTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import jdk.testlibrary.JDKToolFinder;
+
+import static jdk.testlibrary.ProcessTools.executeCommand;
+
+/*
+ * @test
+ * @modules java.logging
+ * @modules jdk.compiler
+ * @summary Test cases which run against the JDK image, check the situation where
+ *            1. logger provider is the default one supplied by the JDK,
+ *            2. clients are in named/unnamed module,
+ *               patched system module, or Xbootclasspath
+ *          This test DOES require existence of java.logging module
+ * @library /lib/testlibrary
+ * @build Base CompilerUtils jdk.testlibrary.*
+ * @run main/othervm JDKLoggerForJDKTest
+ */
+
+public class JDKLoggerForJDKTest extends Base {
+
+    public static void main(String args[]) throws Throwable {
+        JDKLoggerForJDKTest t = new JDKLoggerForJDKTest();
+        t.setup();
+        t.test();
+    }
+
+    private void setup() throws Throwable {
+        setupAllClient();
+    }
+
+    private void test() throws Throwable {
+        // logger client is in named module m.t.a
+        runTest(JDK_IMAGE,
+                "--module-path", DEST_NAMED_CLIENT.toString(),
+                "-m", CLIENT_A, "system", JUL_LOGGER);
+        // logger client is in unnamed module
+        runTest(JDK_IMAGE,
+                "--class-path", DEST_UNNAMED_CLIENT.toString(),
+                CLIENT_B, "system", JUL_LOGGER);
+        // logger client gets logger through boot class BootUsage
+        runTest(JDK_IMAGE,
+                "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(),
+                "--class-path", DEST_BOOT_CLIENT.toString(),
+                BOOT_CLIENT, "system", LAZY_LOGGER, JUL_LOGGER);
+        // logger client gets logger through patched class
+        // java.base/java.lang.PatchedUsage
+        runTest(JDK_IMAGE,
+                "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(),
+                "--class-path", DEST_PATCHED_CLIENT.toString(),
+                PATCHED_CLIENT, "system", LAZY_LOGGER, JUL_LOGGER);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/LoggerInImageTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import jdk.testlibrary.JDKToolFinder;
+
+import static jdk.testlibrary.ProcessTools.executeCommand;
+
+/*
+ * @test
+ * @modules jdk.compiler
+ * @summary Test cases which run against customized image, check the situation where
+ *            1. logger providers are in the customized image too,
+ *            2. clients are in named/unnamed module, image,
+ *               patched system module, or Xbootclasspath
+ *          This test does not require existence of java.logging module,
+ *          but require jdk.compiler module
+ * @library /lib/testlibrary
+ * @build Base CompilerUtils jdk.testlibrary.*
+ * @run main/othervm LoggerInImageTest
+ */
+
+public class LoggerInImageTest extends Base {
+
+    public static void main(String args[]) throws Throwable {
+        LoggerInImageTest t = new LoggerInImageTest();
+        t.setup();
+        t.test();
+    }
+
+    private void setup() throws Throwable {
+        setupAllClient();
+
+        setupNamedLogger();
+
+        setupLoggerImage();
+        setupFullImage();
+    }
+
+    private void test() throws Throwable {
+        if (!checkJMODS()) {
+            return;
+        }
+
+        // logger client is in named module m.t.a which is also in customized image
+        runTest(IMAGE_CLIENT_LOGGER,
+                "-m", CLIENT_A, "named", LOGGER_A);
+        // logger client in named module m.t.a
+        runTest(IMAGE_LOGGER,
+                "--module-path", DEST_NAMED_CLIENT.toString(),
+                "-m", CLIENT_A, "named", LOGGER_A);
+        // logger client is in unnamed module
+        runTest(IMAGE_LOGGER,
+                "--class-path", DEST_UNNAMED_CLIENT.toString(),
+                CLIENT_B, "named", LOGGER_A);
+        // logger client gets logger through boot class BootUsage
+        runTest(IMAGE_LOGGER,
+                "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(),
+                "--class-path", DEST_BOOT_CLIENT.toString(),
+                BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_A);
+        // logger client gets logger through patched class
+        // java.base/java.lang.PatchedUsage
+        runTest(IMAGE_LOGGER,
+                "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(),
+                "--class-path", DEST_PATCHED_CLIENT.toString(),
+                PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_A);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/NamedLoggerForImageTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import jdk.testlibrary.JDKToolFinder;
+
+import static jdk.testlibrary.ProcessTools.executeCommand;
+
+/*
+ * @test
+ * @modules jdk.compiler
+ * @summary Test cases which run against customized image, check the situation where
+ *            1. logger providers are in named module,
+ *            2. clients are in named/unnamed module, image,
+ *               patched system module, or Xbootclasspath
+ *          This test does not require existence of java.logging module,
+ *          but require jdk.compiler module
+ * @library /lib/testlibrary
+ * @build Base CompilerUtils jdk.testlibrary.*
+ * @run main/othervm NamedLoggerForImageTest
+ */
+
+public class NamedLoggerForImageTest extends Base {
+
+    public static void main(String args[]) throws Throwable {
+        NamedLoggerForImageTest t = new NamedLoggerForImageTest();
+        t.setup();
+        t.test();
+    }
+
+    private void setup() throws Throwable {
+        setupAllClient();
+
+        setupNamedLogger();
+
+        setupJavaBaseImage();
+        setupClientImage();
+    }
+
+    private void test() throws Throwable {
+        if (!checkJMODS()) {
+            return;
+        }
+
+        // logger client is in named module m.t.a
+        runTest(IMAGE,
+                "--module-path", DEST_NAMED_LOGGER.toString()
+                    + File.pathSeparator + DEST_NAMED_CLIENT.toString(),
+                "-m", CLIENT_A, "named", LOGGER_A);
+        // logger client is in unnamed module
+        runTest(IMAGE,
+                "--module-path", DEST_NAMED_LOGGER.toString(),
+                "--class-path", DEST_UNNAMED_CLIENT.toString(),
+                CLIENT_B, "named", LOGGER_A);
+        // logger client is in named module m.t.a which is in customized image
+        runTest(IMAGE_CLIENT,
+                "--module-path", DEST_NAMED_LOGGER.toString(),
+                "-m", CLIENT_A, "named", LOGGER_A);
+        // logger client gets logger through boot class BootUsage
+        runTest(IMAGE,
+                "--module-path", DEST_NAMED_LOGGER.toString(),
+                "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(),
+                "--class-path", DEST_BOOT_CLIENT.toString(),
+                BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_A);
+        // logger client gets logger through patched class
+        // java.base/java.lang.PatchedUsage
+        runTest(IMAGE,
+                "--module-path", DEST_NAMED_LOGGER.toString(),
+                "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(),
+                "--class-path", DEST_PATCHED_CLIENT.toString(),
+                PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_A);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/NamedLoggerForJDKTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import jdk.testlibrary.JDKToolFinder;
+
+import static jdk.testlibrary.ProcessTools.executeCommand;
+
+/*
+ * @test
+ * @modules jdk.compiler
+ * @summary Test cases which run against the JDK image, check the situation where
+ *            1. logger providers are in named module,
+ *            2. clients are in named/unnamed module,
+ *               patched system module, or Xbootclasspath
+ *          This test does not require existence of java.logging module,
+ *          but require jdk.compiler module
+ * @library /lib/testlibrary
+ * @build Base CompilerUtils jdk.testlibrary.*
+ * @run main/othervm NamedLoggerForJDKTest
+ */
+
+public class NamedLoggerForJDKTest extends Base {
+
+    public static void main(String args[]) throws Throwable {
+        NamedLoggerForJDKTest t = new NamedLoggerForJDKTest();
+        t.setup();
+        t.test();
+    }
+
+    private void setup() throws Throwable {
+        setupAllClient();
+
+        setupNamedLogger();
+    }
+
+    private void test() throws Throwable {
+        // logger client is in named module m.t.a
+        runTest(JDK_IMAGE,
+                "--module-path", DEST_NAMED_LOGGER.toString()
+                    + File.pathSeparator + DEST_NAMED_CLIENT.toString(),
+                "-m", CLIENT_A, "named", LOGGER_A);
+        // logger client is in unnamed module
+        runTest(JDK_IMAGE,
+                "--module-path", DEST_NAMED_LOGGER.toString(),
+                "--class-path", DEST_UNNAMED_CLIENT.toString(),
+                CLIENT_B, "named", LOGGER_A);
+        // logger client gets logger through boot class BootUsage
+        runTest(JDK_IMAGE,
+                "--module-path", DEST_NAMED_LOGGER.toString(),
+                "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(),
+                "--class-path", DEST_BOOT_CLIENT.toString(),
+                BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_A);
+        // logger client gets logger through patched class
+        // java.base/java.lang.PatchedUsage
+        runTest(JDK_IMAGE,
+                "--module-path", DEST_NAMED_LOGGER.toString(),
+                "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(),
+                "--class-path", DEST_PATCHED_CLIENT.toString(),
+                PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_A);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/UnnamedLoggerForImageTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import jdk.testlibrary.JDKToolFinder;
+
+import static jdk.testlibrary.ProcessTools.executeCommand;
+
+/*
+ * @test
+ * @modules jdk.compiler
+ * @summary Test cases which run against customized image, check the situation where
+ *            1. logger providers are in unnamed module,
+ *            2. clients are in named/unnamed module, image,
+ *               patched system module, or Xbootclasspath
+ *          This test does not require existence of java.logging module,
+ *          but require jdk.compiler module
+ * @library /lib/testlibrary
+ * @build Base CompilerUtils jdk.testlibrary.*
+ * @run main/othervm UnnamedLoggerForImageTest
+ */
+
+public class UnnamedLoggerForImageTest extends Base {
+
+    public static void main(String args[]) throws Throwable {
+        UnnamedLoggerForImageTest t = new UnnamedLoggerForImageTest();
+        t.setup();
+        t.test();
+    }
+
+    private void setup() throws Throwable {
+        setupAllClient();
+
+        setupUnnamedLogger();
+
+        setupJavaBaseImage();
+        setupClientImage();
+    }
+
+    private void test() throws Throwable {
+        if (!checkJMODS()) {
+            return;
+        }
+
+        // logger client is in unnamed module
+        runTest(IMAGE,
+                "--class-path", DEST_UNNAMED_LOGGER.toString()
+                    + File.pathSeparator + DEST_UNNAMED_CLIENT.toString(),
+                CLIENT_B, "unnamed", LOGGER_B);
+        // logger client is in named module m.t.a
+        runTest(IMAGE,
+                "--class-path", DEST_UNNAMED_LOGGER.toString(),
+                "--module-path", DEST_NAMED_CLIENT.toString(),
+                "-m", CLIENT_A, "unnamed", LOGGER_B);
+        // logger client is in named module m.t.a which is in customized image
+        runTest(IMAGE_CLIENT,
+                "--class-path", DEST_UNNAMED_LOGGER.toString(),
+                "-m", CLIENT_A, "unnamed", LOGGER_B);
+        // logger client gets logger through boot class BootUsage
+        runTest(IMAGE,
+                "--class-path", DEST_UNNAMED_LOGGER.toString()
+                    + File.pathSeparator + DEST_BOOT_CLIENT.toString(),
+                "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(),
+                BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_B);
+        // logger client gets logger through patched class
+        // java.base/java.lang.PatchedUsage
+        runTest(IMAGE,
+                "--class-path", DEST_UNNAMED_LOGGER.toString()
+                    + File.pathSeparator + DEST_PATCHED_CLIENT.toString(),
+                "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(),
+                PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_B);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/UnnamedLoggerForJDKTest.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+
+import jdk.testlibrary.JDKToolFinder;
+
+import static jdk.testlibrary.ProcessTools.executeCommand;
+
+/*
+ * @test
+ * @modules jdk.compiler
+ * @summary Test cases which run against the JDK image, check the situation where
+ *            1. logger providers are in unnamed module,
+ *            2. clients are in named/unnamed module,
+ *               patched system module, or Xbootclasspath
+ *          This test does not require existence of java.logging module,
+ *          but require jdk.compiler module
+ * @library /lib/testlibrary
+ * @build Base CompilerUtils jdk.testlibrary.*
+ * @run main/othervm UnnamedLoggerForJDKTest
+ */
+
+public class UnnamedLoggerForJDKTest extends Base {
+
+    public static void main(String args[]) throws Throwable {
+        UnnamedLoggerForJDKTest t = new UnnamedLoggerForJDKTest();
+        t.setup();
+        t.test();
+    }
+
+    private void setup() throws Throwable {
+        setupAllClient();
+
+        setupUnnamedLogger();
+    }
+
+    private void test() throws Throwable {
+        // logger client is in named module m.t.a
+        runTest(JDK_IMAGE,
+                "--class-path", DEST_UNNAMED_LOGGER.toString(),
+                "--module-path", DEST_NAMED_CLIENT.toString(),
+                "-m", CLIENT_A, "unnamed", LOGGER_B);
+        // logger client is also in unnamed module
+        runTest(JDK_IMAGE,
+                "--class-path", DEST_UNNAMED_LOGGER.toString()
+                    + File.pathSeparator + DEST_UNNAMED_CLIENT.toString(),
+                CLIENT_B, "unnamed", LOGGER_B);
+        // logger client gets logger through boot class BootUsage
+        runTest(JDK_IMAGE,
+                "--class-path", DEST_UNNAMED_LOGGER.toString()
+                    + File.pathSeparator + DEST_BOOT_CLIENT.toString(),
+                "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(),
+                BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_B);
+        // logger client gets logger through patched class
+        // java.base/java.lang.PatchedUsage
+        runTest(JDK_IMAGE,
+                "--class-path", DEST_UNNAMED_LOGGER.toString()
+                    + File.pathSeparator + DEST_PATCHED_CLIENT.toString(),
+                "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(),
+                PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_B);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/boot_client/BootClient.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.lang.reflect.Method;
+import java.lang.System.Logger;
+import java.util.ResourceBundle;
+import java.util.ListResourceBundle;
+
+/*
+ * Tests when logger client is in Xbootclasspath
+ */
+public final class BootClient {
+
+    public static void main(String[] args) throws Exception {
+        assertTrue(args.length >= 2);
+        String loggerMode = args[0];
+        String loggerClassName = args[1];
+        String underlyingLoggerClassName = args.length >= 3 ? args[2] : null;
+
+        testLogger(loggerMode, loggerClassName, underlyingLoggerClassName);
+        testLog(underlyingLoggerClassName);
+    }
+
+    /*
+     * Tests System.getLogger(String) get expected logger.
+     */
+    private static void testLogger(String loggerMode, String loggerClassName,
+                                   String underlyingLoggerClassName) {
+        String name = "test.boot";
+        Logger logger = getLogger(name);
+        printLogger(logger);
+
+        final Module lm = logger.getClass().getModule();
+        final ClassLoader loggerCL = lm.getClassLoader();
+        if (loggerMode.equals("system")) {
+            assertTrue(lm.isNamed());
+            assertTrue(loggerCL == null);
+        } else if(loggerMode.equals("unnamed")) {
+            assertTrue(!lm.isNamed());
+            assertTrue(loggerCL != null);
+        } else {
+            throw new RuntimeException("wrong parameter");
+        }
+
+        assertTrue(loggerClassName.equals(logger.getClass().getName()));
+        if (underlyingLoggerClassName != null) {
+            String loggerName = logger.getName();
+            if (underlyingLoggerClassName.equals(
+                    "sun.util.logging.internal.LoggingProviderImpl$JULWrapper")) {
+                assertTrue(loggerName.equals(name));
+            } else {
+                assertTrue(loggerName.equals(underlyingLoggerClassName));
+            }
+        }
+    }
+
+    /*
+     * Tests Logger retrieved by System.getLogger(String, ResourceBundle) and
+     * System.getLogger(String) works well.
+     */
+    private static void testLog(String underlyingLoggerClassName) throws Exception {
+        if (underlyingLoggerClassName == null) {
+            return;
+        }
+
+        if (underlyingLoggerClassName.equals("pkg.a.l.LoggerA")
+                || underlyingLoggerClassName.equals("pkg.b.l.LoggerB")) {
+
+            String name = "test.boot.logger";
+            String plainMsg = "this is test log message #1";
+            ResourceBundle rb = new MyResourcesBoot();
+            Throwable ex = new Throwable("this is an expected exception to be logged");
+            Class<?> clazz = Class.forName(underlyingLoggerClassName);
+            Method method = clazz.getMethod("checkLog", String.class,
+                                            System.Logger.Level.class,
+                                            ResourceBundle.class, String.class,
+                                            Throwable.class, Object[].class);
+
+            Logger logger = getLogger(name);
+            printLogger(logger);
+            assertTrue(logger.getClass().getName()
+                             .equals("jdk.internal.logger.LazyLoggers$JdkLazyLogger"));
+            assertTrue(logger.getName().equals(underlyingLoggerClassName));
+            logger.log(Logger.Level.WARNING, plainMsg);
+            boolean pass = (boolean)method.invoke(null, name, Logger.Level.WARNING,
+                                                  null, plainMsg, ex, (Object)null);
+            assertTrue(pass);
+            pass = (boolean)method.invoke(null, name, Logger.Level.INFO,
+                                          rb, MyResourcesBoot.VALUE, (Throwable)null,
+                                          (Object)null);
+            assertTrue(!pass);
+
+            logger = getLogger(name, rb);
+            printLogger(logger);
+            assertTrue(logger.getClass().getName()
+                             .equals("jdk.internal.logger.LocalizedLoggerWrapper"));
+            assertTrue(logger.getName().equals(underlyingLoggerClassName));
+            logger.log(Logger.Level.INFO, MyResourcesBoot.KEY);
+            pass = (boolean)method.invoke(null, name, Logger.Level.INFO,
+                                          rb, MyResourcesBoot.VALUE, (Throwable)null,
+                                          (Object)null);
+            assertTrue(pass);
+            pass = (boolean)method.invoke(null, name, Logger.Level.WARNING,
+                                          null, plainMsg, ex, (Object)null);
+            assertTrue(pass);
+        }
+    }
+
+    private static class MyResourcesBoot extends ListResourceBundle {
+        static final String KEY = "this is the key in MyResourcesBoot";
+        static final String VALUE = "THIS IS THE VALUE IN MyResourcesBoot";
+
+        @Override
+        protected Object[][] getContents() {
+            return new Object[][] {
+                {KEY, VALUE}
+            };
+        }
+    }
+
+    private static Logger getLogger(String name) {
+        return BootUsage.getLogger(name);
+    }
+
+    private static Logger getLogger(String name, ResourceBundle rb) {
+        return BootUsage.getLogger(name, rb);
+    }
+
+    private static void printLogger(Logger logger) {
+        System.err.println("logger name: " + logger.getName()
+                           + ", logger class: " + logger.getClass());
+    }
+
+    private static void assertTrue(boolean b) {
+        if (!b) {
+            throw new RuntimeException("expected true, but get false.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/boot_usage/BootUsage.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.lang.System.Logger;
+import java.util.ResourceBundle;
+
+/*
+ * BootUsage is put to Xbootclasspath, it will be used by
+ * BootClient to test when logger client is in boot classpath
+ */
+public final class BootUsage {
+
+    public static Logger getLogger(String name) {
+        check();
+        return System.getLogger(name);
+    }
+
+    public static Logger getLogger(String name, ResourceBundle rb) {
+        check();
+        return System.getLogger(name, rb);
+    }
+
+    private static void check() {
+        final Module m = BootUsage.class.getModule();
+        final ClassLoader moduleCL = m.getClassLoader();
+        assertTrue(!m.isNamed());
+        assertTrue(moduleCL == null);
+    }
+
+    private static void assertTrue(boolean b) {
+        if (!b) {
+            throw new RuntimeException("expected true, but get false.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_client/m.t.a/module-info.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+module m.t.a {
+    exports pkg.a.t;
+    uses System.LoggerFinder;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_client/m.t.a/pkg/a/t/TestA.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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 pkg.a.t;
+
+import java.lang.reflect.Method;
+import java.lang.System.Logger;
+import java.util.ResourceBundle;
+import java.util.ListResourceBundle;
+
+/*
+ * Tests when logger client is in named module m.l.a
+ */
+public class TestA {
+
+    public static void main(String[] args) throws Exception {
+        assertTrue(args.length == 2);
+        String loggerMode = args[0];
+        String loggerClassName = args[1];
+
+        testLogger(loggerMode, loggerClassName);
+        testLog(loggerClassName);
+    }
+
+    /*
+     * Tests System.getLogger(String) get expected logger.
+     */
+    private static void testLogger(String loggerMode, String loggerClassName) {
+        final Module m = TestA.class.getModule();
+        final ClassLoader moduleCL = m.getClassLoader();
+        assertTrue(m.isNamed());
+        assertTrue(moduleCL != null);
+
+        String name = "test.a";
+        Logger logger = getLogger(name);
+        printLogger(logger);
+
+        final Module lm = logger.getClass().getModule();
+        final ClassLoader loggerCL = lm.getClassLoader();
+        if (loggerMode.equals("system")) {
+            assertTrue(lm.isNamed());
+            assertTrue(loggerCL == null);
+        } else if(loggerMode.equals("named")) {
+            assertTrue(lm.isNamed());
+            assertTrue(loggerCL != null);
+        } else if(loggerMode.equals("unnamed")) {
+            assertTrue(!lm.isNamed());
+            assertTrue(loggerCL != null);
+        } else {
+            throw new RuntimeException("wrong parameter");
+        }
+
+        assertTrue(loggerClassName.equals(logger.getClass().getName()));
+        assertTrue(!loggerClassName.equals("jdk.internal.logger.LazyLoggers$JdkLazyLogger"));
+    }
+
+    /*
+     * Tests Logger retrieved by System.getLogger(String, ResourceBundle) and
+     * System.getLogger(String) works well.
+     */
+    private static void testLog(String loggerClassName) throws Exception {
+        if (loggerClassName.equals("pkg.a.l.LoggerA")
+                || loggerClassName.equals("pkg.b.l.LoggerB")) {
+
+            String name = "test.a.A";
+            String plainMsg = "this is test log message #1";
+            ResourceBundle rb = new MyResourcesA();
+            Throwable ex = new Throwable("this is an expected exception to be logged");
+            Class<?> clazz = Class.forName(loggerClassName);
+            Method method = clazz.getMethod("checkLog", String.class,
+                                            System.Logger.Level.class,
+                                            ResourceBundle.class, String.class,
+                                            Throwable.class, Object[].class);
+
+            Logger logger = getLogger(name);
+            printLogger(logger);
+            assertTrue(logger.getClass().getName().equals(loggerClassName));
+            assertTrue(logger.getName().equals(loggerClassName));
+            logger.log(Logger.Level.WARNING, plainMsg);
+            boolean pass = (boolean)method.invoke(null, name,
+                                                  Logger.Level.WARNING,
+                                                  null, plainMsg, ex, (Object)null);
+            assertTrue(pass);
+            pass = (boolean)method.invoke(null, name, Logger.Level.INFO,
+                                          rb, MyResourcesA.VALUE, (Throwable)null,
+                                          (Object)null);
+            assertTrue(!pass);
+
+            logger = getLogger(name, rb);
+            printLogger(logger);
+            assertTrue(logger.getClass().getName()
+                             .equals("jdk.internal.logger.LocalizedLoggerWrapper"));
+            assertTrue(logger.getName().equals(loggerClassName));
+            logger.log(Logger.Level.INFO, MyResourcesA.KEY);
+            pass = (boolean)method.invoke(null, name, Logger.Level.INFO,
+                                          rb, MyResourcesA.VALUE, (Throwable)null,
+                                          (Object)null);
+            assertTrue(pass);
+            pass = (boolean)method.invoke(null, name, Logger.Level.WARNING,
+                                          null, plainMsg, ex, (Object)null);
+            assertTrue(pass);
+        }
+    }
+
+    private static class MyResourcesA extends ListResourceBundle {
+        static final String KEY = "this is the key in MyResourcesA";
+        static final String VALUE = "THIS IS THE VALUE IN MyResourcesA";
+
+        @Override
+        protected Object[][] getContents() {
+            return new Object[][] {
+                {KEY, VALUE}
+            };
+        }
+    }
+
+    private static Logger getLogger(String name) {
+        return System.getLogger(name);
+    }
+
+    private static Logger getLogger(String name, ResourceBundle rb) {
+        return System.getLogger(name, rb);
+    }
+
+    private static void printLogger(Logger logger) {
+        System.err.println("logger name: " + logger.getName()
+                           + ", logger class: " + logger.getClass());
+    }
+
+    private static void assertTrue(boolean b) {
+        if (!b) {
+            throw new RuntimeException("expected true, but get false.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_logger/m.l.a/module-info.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+module m.l.a {
+    opens pkg.a.l;
+    provides java.lang.System.LoggerFinder with pkg.a.p.LoggerFinderA;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_logger/m.l.a/pkg/a/l/LoggerA.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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 pkg.a.l;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Queue;
+import java.util.ResourceBundle;
+
+public class LoggerA implements System.Logger {
+
+    // ---- test utility fields and methods ----
+
+    private static Map<String, LoggerA> map = new HashMap<>();
+
+    public static LoggerA getLogger(String name) {
+        return map.computeIfAbsent(name, (n) -> new LoggerA());
+    }
+
+    public static boolean checkLog(String name, Level level, ResourceBundle bundle,
+                                   String format, Throwable throwable, Object... params) {
+        LoggerA logger = map.get(name);
+        LogEvent event = new LogEvent(level, bundle, format, null, params);
+        for (LogEvent l : logger.queue) {
+            if (l.equals(event)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // ---- logger implementation ----
+
+    private Queue<LogEvent> queue = new LinkedList<>();
+
+    @Override
+    public String getName() {
+        return this.getClass().getName();
+    }
+
+    @Override
+    public boolean isLoggable(Level level) {
+        return true;
+    }
+
+    @Override
+    public void log(Level level, ResourceBundle bundle, String format, Object... params) {
+        String msg = bundle != null ? bundle.getString(format) : format;
+        log(new LogEvent(level, bundle, msg, null, params));
+    }
+
+    @Override
+    public void log(Level level, ResourceBundle bundle, String format, Throwable throwable) {
+        String msg = bundle != null ? bundle.getString(format) : format;
+        log(new LogEvent(level, bundle, msg, throwable, (Object)null));
+    }
+
+    void log(LogEvent l) {
+        print(l);
+        queue.add(l);
+    }
+
+    private void print(LogEvent l) {
+        System.err.println("LoggerA Message"+ l);
+    }
+
+    public Queue<LogEvent> getLogEvent() {
+        return queue;
+    }
+
+    public static class LogEvent {
+        public LogEvent(Level level, ResourceBundle bundle, String format,
+                        Throwable throwable, Object... params) {
+            this.level = level;
+            this.bundle = bundle;
+            this.format = format;
+            this.throwable = throwable;
+            this.params = params;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (o instanceof LogEvent) {
+                LogEvent e = (LogEvent)o;
+                return level == e.level
+                    && bundle == e.bundle
+                    && format == e.format
+                    && params == e.params;
+            }
+            return false;
+        }
+
+        @Override
+        public String toString() {
+            return String.format("[level: %s, bundle: %s, format: %s, throwable: %s, object: %s]",
+                    level, bundle, format, throwable, params);
+        }
+
+        private Level level;
+        private ResourceBundle bundle;
+        private String format;
+        private Throwable throwable;
+        private Object[] params;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_logger/m.l.a/pkg/a/p/LoggerFinderA.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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 pkg.a.p;
+
+import pkg.a.l.LoggerA;
+
+public class LoggerFinderA extends System.LoggerFinder {
+    @Override
+    public System.Logger getLogger(String name, Module module) {
+        return LoggerA.getLogger(name);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/patched_client/PatchedClient.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.lang.reflect.Method;
+import java.lang.System.Logger;
+import java.util.ResourceBundle;
+import java.util.ListResourceBundle;
+
+/*
+ * Tests when logger client is in patched module
+ */
+public class PatchedClient {
+
+    public static void main(String[] args) throws Exception {
+        assertTrue(args.length >= 2);
+        String loggerMode = args[0];
+        String loggerClassName = args[1];
+        String underlyingLoggerClassName = args.length >= 3 ? args[2] : null;
+
+        testLogger(loggerMode, loggerClassName, underlyingLoggerClassName);
+        testLog(underlyingLoggerClassName);
+    }
+
+    /*
+     * Tests System.getLogger(String) get expected logger.
+     */
+    private static void testLogger(String loggerMode, String loggerClassName,
+                                   String underlyingLoggerClassName) {
+        String name = "test.patched";
+        Logger logger = getLogger(name);
+        printLogger(logger);
+
+        final Module lm = logger.getClass().getModule();
+        final ClassLoader loggerCL = lm.getClassLoader();
+        if (loggerMode.equals("system")) {
+            assertTrue(lm.isNamed());
+            assertTrue(loggerCL == null);
+        } else if(loggerMode.equals("unnamed")) {
+            assertTrue(!lm.isNamed());
+            assertTrue(loggerCL != null);
+        } else {
+            throw new RuntimeException("wrong parameter");
+        }
+
+        assertTrue(loggerClassName.equals(logger.getClass().getName()));
+        if (underlyingLoggerClassName != null) {
+            String loggerName = logger.getName();
+            if (underlyingLoggerClassName.equals(
+                    "sun.util.logging.internal.LoggingProviderImpl$JULWrapper")) {
+                assertTrue(loggerName.equals(name));
+            } else {
+                assertTrue(loggerName.equals(underlyingLoggerClassName));
+            }
+        }
+    }
+
+    /*
+     * Tests Logger retrieved by System.getLogger(String, ResourceBundle) and
+     * System.getLogger(String) works well.
+     */
+    private static void testLog(String underlyingLoggerClassName) throws Exception {
+        if (underlyingLoggerClassName == null) {
+            return;
+        }
+
+        if (underlyingLoggerClassName.equals("pkg.a.l.LoggerA")
+                || underlyingLoggerClassName.equals("pkg.b.l.LoggerB")) {
+
+            String name = "test.patched.logger";
+            String plainMsg = "this is test log message #1";
+            ResourceBundle rb = new MyResourcesPatched();
+            Throwable ex = new Throwable("this is an expected exception to be logged");
+            Class<?> clazz = Class.forName(underlyingLoggerClassName);
+            Method method = clazz.getMethod("checkLog", String.class,
+                                            System.Logger.Level.class,
+                                            ResourceBundle.class, String.class,
+                                            Throwable.class, Object[].class);
+
+            Logger logger = getLogger(name);
+            printLogger(logger);
+            assertTrue(logger.getClass().getName()
+                             .equals("jdk.internal.logger.LazyLoggers$JdkLazyLogger"));
+            assertTrue(logger.getName().equals(underlyingLoggerClassName));
+            logger.log(Logger.Level.WARNING, plainMsg);
+            boolean pass = (boolean)method.invoke(null, name, Logger.Level.WARNING,
+                                                  null, plainMsg, ex, (Object)null);
+            assertTrue(pass);
+            pass = (boolean)method.invoke(null, name, Logger.Level.INFO,
+                                          rb, MyResourcesPatched.VALUE, (Throwable)null,
+                                          (Object)null);
+            assertTrue(!pass);
+
+            logger = getLogger(name, rb);
+            printLogger(logger);
+            assertTrue(logger.getClass().getName()
+                             .equals("jdk.internal.logger.LocalizedLoggerWrapper"));
+            assertTrue(logger.getName().equals(underlyingLoggerClassName));
+            logger.log(Logger.Level.INFO, MyResourcesPatched.KEY);
+            pass = (boolean)method.invoke(null, name, Logger.Level.INFO,
+                                          rb, MyResourcesPatched.VALUE, (Throwable)null,
+                                          (Object)null);
+            assertTrue(pass);
+            pass = (boolean)method.invoke(null, name, Logger.Level.WARNING,
+                                          null, plainMsg, ex, (Object)null);
+            assertTrue(pass);
+        }
+    }
+
+    private static class MyResourcesPatched extends ListResourceBundle {
+        static final String KEY = "this is the key in MyResourcesPatched";
+        static final String VALUE = "THIS IS THE VALUE IN MyResourcesPatched";
+
+        @Override
+        protected Object[][] getContents() {
+            return new Object[][] {
+                {KEY, VALUE}
+            };
+        }
+    }
+
+    private static Logger getLogger(String name) {
+        return PatchedUsage.getLogger(name);
+    }
+
+    private static Logger getLogger(String name, ResourceBundle rb) {
+        return PatchedUsage.getLogger(name, rb);
+    }
+
+    private static void printLogger(Logger logger) {
+        System.err.println("logger name: " + logger.getName()
+                           + ", logger class: " + logger.getClass());
+    }
+
+    private static void assertTrue(boolean b) {
+        if (!b) {
+            throw new RuntimeException("expected true, but get false.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/patched_usage/java.base/java/lang/PatchedUsage.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang;
+
+import java.lang.System.Logger;
+import java.util.ResourceBundle;
+
+/*
+ * PatchedUsage is patched into java.base, it will be used by
+ * PatchedClient to test when logger client is in patched module
+ */
+public class PatchedUsage {
+
+    public static Logger getLogger(String name) {
+        check();
+        return System.getLogger(name);
+    }
+
+    public static Logger getLogger(String name, ResourceBundle rb) {
+        check();
+        return System.getLogger(name, rb);
+    }
+
+    private static void check() {
+        final Module m = PatchedUsage.class.getModule();
+        final ClassLoader moduleCL = m.getClassLoader();
+        assertTrue(m.isNamed());
+        assertTrue(moduleCL == null);
+    }
+
+    private static void assertTrue(boolean b) {
+        if (!b) {
+            throw new RuntimeException("expected true, but get false.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/unnamed_client/pkg/b/t/TestB.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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 pkg.b.t;
+
+import java.lang.reflect.Method;
+import java.lang.System.Logger;
+import java.util.ResourceBundle;
+import java.util.ListResourceBundle;
+
+/*
+ * Tests when logger client is in unnamed module
+ */
+public class TestB {
+
+    public static void main(String[] args) throws Exception {
+        assertTrue(args.length == 2);
+        String loggerMode = args[0];
+        String loggerClassName = args[1];
+
+        testLogger(loggerMode, loggerClassName);
+        testLog(loggerClassName);
+    }
+
+    /*
+     * Tests System.getLogger(String) get expected logger.
+     */
+    private static void testLogger(String loggerMode, String loggerClassName) {
+        final Module m = TestB.class.getModule();
+        final ClassLoader moduleCL = m.getClassLoader();
+        assertTrue(!m.isNamed());
+        assertTrue(moduleCL != null);
+
+        String name = "test.b";
+        Logger logger = getLogger(name);
+        printLogger(logger);
+
+        final Module lm = logger.getClass().getModule();
+        final ClassLoader loggerCL = lm.getClassLoader();
+        if (loggerMode.equals("system")) {
+            assertTrue(lm.isNamed());
+            assertTrue(loggerCL == null);
+        } else if(loggerMode.equals("named")) {
+            assertTrue(lm.isNamed());
+            assertTrue(loggerCL != null);
+        } else if(loggerMode.equals("unnamed")) {
+            assertTrue(!lm.isNamed());
+            assertTrue(loggerCL != null);
+        } else {
+            throw new RuntimeException("wrong parameter");
+        }
+
+        assertTrue(loggerClassName.equals(logger.getClass().getName()));
+        assertTrue(!loggerClassName.equals("jdk.internal.logger.LazyLoggers$JdkLazyLogger"));
+    }
+
+    /*
+     * Tests Logger retrieved by System.getLogger(String, ResourceBundle) and
+     * System.getLogger(String) works well.
+     */
+    private static void testLog(String loggerClassName) throws Exception {
+        if (loggerClassName.equals("pkg.a.l.LoggerA")
+                || loggerClassName.equals("pkg.b.l.LoggerB")) {
+
+            String name = "test.b.B";
+            String plainMsg = "this is test log message #1";
+            ResourceBundle rb = new MyResourcesB();
+            Throwable ex = new Throwable("this is an expected exception to be logged");
+            Class<?> clazz = Class.forName(loggerClassName);
+            Method method = clazz.getMethod("checkLog", String.class,
+                                            System.Logger.Level.class,
+                                            ResourceBundle.class, String.class,
+                                            Throwable.class, Object[].class);
+
+            Logger logger = getLogger(name);
+            printLogger(logger);
+            assertTrue(logger.getClass().getName().equals(loggerClassName));
+            assertTrue(logger.getName().equals(loggerClassName));
+            logger.log(Logger.Level.WARNING, plainMsg);
+            boolean pass = (boolean)method.invoke(null, name, Logger.Level.WARNING,
+                                                  null, plainMsg, ex, (Object)null);
+            assertTrue(pass);
+            pass = (boolean)method.invoke(null, name, Logger.Level.INFO,
+                                          rb, MyResourcesB.VALUE, (Throwable)null,
+                                          (Object)null);
+            assertTrue(!pass);
+
+            logger = getLogger(name, rb);
+            printLogger(logger);
+            assertTrue(logger.getClass().getName()
+                             .equals("jdk.internal.logger.LocalizedLoggerWrapper"));
+            assertTrue(logger.getName().equals(loggerClassName));
+            logger.log(Logger.Level.INFO, MyResourcesB.KEY);
+            pass = (boolean)method.invoke(null, name, Logger.Level.INFO,
+                                          rb, MyResourcesB.VALUE, (Throwable)null,
+                                          (Object)null);
+            assertTrue(pass);
+            pass = (boolean)method.invoke(null, name, Logger.Level.WARNING,
+                                          null, plainMsg, ex, (Object)null);
+            assertTrue(pass);
+        }
+    }
+
+    private static class MyResourcesB extends ListResourceBundle {
+        static final String KEY = "this is the key in MyResourcesB";
+        static final String VALUE = "THIS IS THE VALUE IN MyResourcesB";
+
+        @Override
+        protected Object[][] getContents() {
+            return new Object[][] {
+                {KEY, VALUE}
+            };
+        }
+    }
+
+    private static Logger getLogger(String name) {
+        return System.getLogger(name);
+    }
+
+    private static Logger getLogger(String name, ResourceBundle rb) {
+        return System.getLogger(name, rb);
+    }
+
+    private static void printLogger(Logger logger) {
+        System.err.println("logger name: " + logger.getName()
+                           + ", logger class: " + logger.getClass());
+    }
+
+    private static void assertTrue(boolean b) {
+        if (!b) {
+            throw new RuntimeException("expected true, but get false.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/unnamed_logger/META-INF/services/java.lang.System$LoggerFinder	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,1 @@
+pkg.b.p.LoggerFinderB
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/System/LoggerFinder/modules/unnamed_logger/pkg/b/l/LoggerB.java	Fri Apr 28 18:10:28 2017 +0100
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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 pkg.b.l;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Queue;
+import java.util.ResourceBundle;
+
+public class LoggerB implements System.Logger {
+
+    // ---- test utility fields and methods ----
+
+    private static Map<String, LoggerB> map = new HashMap<>();
+
+    public static LoggerB getLogger(String name) {
+        return map.computeIfAbsent(name, (n) -> new LoggerB());
+    }
+
+    public static boolean checkLog(String name, Level level, ResourceBundle bundle,
+                                   String format, Throwable throwable, Object... params) {
+        LoggerB logger = map.get(name);
+        LogEvent event = new LogEvent(level, bundle, format, null, params);
+        for (LogEvent l : logger.queue) {
+            if (l.equals(event)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // ---- logger implementation ----
+
+    private Queue<LogEvent> queue = new LinkedList<>();
+
+    @Override
+    public String getName() {
+        return this.getClass().getName();
+    }
+
+    @Override
+    public boolean isLoggable(Level level) {
+        return true;